「オブジェクト指向」の版間の差分
編集の要約なし |
Goldensundown2 (会話 | 投稿記録) 関連項目 |
||
(同じ利用者による、間の16版が非表示) | |||
1行目: | 1行目: | ||
'''オブジェクト指向'''(オブジェクトしこう|英語:''object-oriented'')は、[[ソフトウェア工学]]構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。1950年代後半に[[マサチューセッツ工科大学]]の[[人工知能|人口知能]]研究グループの間で最初に発案され、プログラム開発環境の構築を通して体系化されていき、1960年代に一つの[[プログラミング・パラダイム]]として確立された。1980年代には[[データベース]]と[[オペレーティングシステム]]の開発にも活かされるようになった。1990年代になるとソフトウェア設計の幅広い面にも応用されるようになり、[[ソフトウェア工学]]その他にオブジェクト指向を土台にした様々な分野が開拓された。 |
|||
'''オブジェクト指向'''(オブジェクトしこう)とは、[[オブジェクト (プログラミング)|オブジェクト]]同士の相互作用として、システムの振る舞いをとらえる考え方である。英語の {{lang|en|object-oriented}} (直訳は、「対象物志向の」「目的重視の」という意味の形容詞) の日本語訳である。 |
|||
オブジェクト指向は脳機能を形成する[[人工ニューラルネットワーク|ニューラル・ネットワーク]]をヒントに発案された。[[オブジェクト (プログラミング)|オブジェクト]]は[[人工ニューロン|ニューロン]]の投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様に[[オブジェクト (プログラミング)|オブジェクト]]のネットワークとして構築し、無数の[[オブジェクト (プログラミング)|オブジェクト]]が互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。 |
|||
オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。複雑なシステム記述、巨大な[[ライブラリ]](特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、オブジェクト指向の考え方は必須である。 |
|||
== |
==オブジェクト指向の分野一覧== |
||
#[[オブジェクト指向プログラミング|オブジェクト指向・プログラミング]] 1960年代から |
|||
オブジェクト指向分析が提唱される以前には、システム分析のレベルにおいては、[[データ構造]]を中心としたシステムの分析技法である[[構造化技法]]が存在した。 |
|||
#[[オブジェクトデータベース|オブジェクト指向・データベース]] 1980年代から |
|||
#[[オブジェクト指向分析設計|オブジェクト指向・アナリシス&デザイン]] 1990年代から |
|||
#[[オブジェクト指向モデリング|オブジェクト指向・モデリング]] 1990年代から |
|||
<br/> |
|||
また、[[プログラミング (コンピュータ)|プログラミング]]のレベル ([[プログラミングパラダイム]]) では、[[プログラム (コンピュータ)|プログラム]]の実行の流れを決められた[[制御構造]]の組み合わせとして書き下す[[構造化プログラミング]]や、[[カプセル化]]を促す[[モジュールプログラミング]]、多態に対応する[[データ指向プログラミング]]という技法が存在していた。オブジェクト指向手法はそれらを一般化しさらに推し進めたものであるという考え方がある。 |
|||
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系であり、そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始め、ソフトウェア工学のあらゆる局面に''object-oriented''(OO)を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、[[オブジェクト指向ソフトウェア工学|OOソフトウェアエンジニアリング]]、OOユーザーインターフェース、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法|オブジェクトモデリングテクニック]]など複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっている事から、明確な一つの分野として扱われる事は少ない。 |
|||
==オブジェクト指向プログラミング |
==オブジェクト指向プログラミング== |
||
{{Main|オブジェクト指向プログラミング}} |
{{Main|オブジェクト指向プログラミング}} |
||
⚫ | |||
=== 主な仕様 === |
|||
;[[カプセル化]] (情報隠蔽) |
|||
[[カプセル化|エンカプセレーション]](内部隠蔽) |
|||
:[[オブジェクト (プログラミング)|オブジェクト]]の振る舞いを隠蔽したり、オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの実際の型を隠蔽したりすることをいう。これは古典的な可視性の定義である。 |
|||
: [[オブジェクト (プログラミング)|オブジェクト]]内のデータ参照とメソッド呼出に対する、外部からのアクセスを限定する仕様。アクセス権限は、どのオブジェクトからもアクセス可能なパブリック、自分と派生オブジェクトからのみ可能なプロテクティド、自オブジェクト内のみのプライベート、の三種が基本となる。 |
|||
[[インヘリタンス]](継承) |
|||
⚫ | |||
: |
: 派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る仕様(部品→全体)と、オブジェクトを複数の階層に分解して他オブジェクトと共有出来る階層を派生元にする仕様(全体→部品)の二通りの考え方がある。派生元オブジェクトの型式はスーパークラス、派生先オブジェクトの型式はサブクラスと呼ばれる事が多い。 |
||
⚫ | |||
⚫ | |||
: 同名メソッドの呼び出し時に、オブジェクトによって処理内容が変化する機能。こちらは実行時の状況によって変化する多態性本来のダイナミックな機能である。また、引数とするクラス型に従って、呼び出されるメソッドと生成されるオブジェクトが変化する機能もあり、こちらはコンパイル時に決まるスタティックな機能となる。 |
|||
*[[クラスベース]]方式 — [[クラス (コンピュータ)|クラス]]を定義し、それを元に[[インスタンス]]を生成する方式である。'''継承ベース'''ともいう。 |
|||
⚫ | |||
*[[ミックスイン|Mixin]]方式 — さまざまなオブジェクトの原型を組み合わせて一つのオブジェクトを構成する方式である。 |
|||
==オブジェクト |
===オブジェクト生成の種類=== |
||
[[Eclipse (統合開発環境)|Eclipse]]を開発したDave Thomasや、オブジェクト指向という言葉の生みの親であるAlan Kay博士は、オブジェクト指向という言葉は失敗だったと語っている。<ref>http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang</ref> |
|||
[[クラスベース]] |
|||
これは、本来オブジェクト指向が重視すべきは'''「オブジェクト」'''ではなく'''「メッセージング」'''であるにもかかわらず'''「メッセージング」'''がおろそかにされているためである。特に言語の進歩において「オブジェクト」や「クラス」の側面ばかり強調される傾向にあり、Alan Kay博士は「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」と述べている。 |
|||
: ユーザーが任意の[[クラス (コンピュータ)|クラス]]を定義し、それを元に[[インスタンス]]を生成する方式である。ベンダー側が用意したクラスライブラリ内のクラスを元にして、ユーザーが任意の派生クラスを定義する開発場面も多く、これは継承ベースとも言われる。 |
|||
[[プロトタイプベース]] |
|||
⚫ | |||
[[ミックスイン]] |
|||
: 任意のインスタンス生成時に、ランタイム環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。 |
|||
⚫ | |||
オブジェクト指向プログラミングは、歴史的に1962年に公開されたクラス構造を中心とする''Simula''系統と、1970年代から研究開発が進められていたメッセージ機能を主体とする''Smalltalk''系統に大別されており、オブジェクト指向本来の形態を正しく表現してるのは後者の''Smalltalk''の方だと評されていた。しかし、当時のCPU処理能力の問題からより少ない処理量で、ポリモーフィズムその他の仕様を「継承クラス構造」を活かして実現出来る''Simula''系統(''C++''や''Javaなど)の方''が主流となった。こうして''クラス構造がオブジェクト指向の中心的役割を占めるようになった事から、Smalltalk''制作者の一人であり、オブジェクト指向開発環境のパイオニアと見なされているアラン・ケイは「''Smalltalk''をオブジェクト指向言語と定義付けたのは、間違いだったかもしれない。」というコメントを残すに到った<ref>http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang</ref>。 |
|||
''Smalltalk''が主体とする「メッセージング」は、それ自体が高度に柔軟なエンカプセレーションとポリモーフィズムの機能を自然に表現出来る仕組みだった。それに対して、''C++''や''Javaに見られる''「継承クラス構造」をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実的に「継承クラス構造」重視の言わば亜流の方がオブジェクト指向の主流となってしまった以上、もはや「メッセージング」主体の''Smalltalk''はオブジェクト指向としての看板を降ろすべきではないか、という自嘲的な見解がそのコメントの根底にあった。オブジェクト指向言語の進化に伴い、オブジェクトとクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「''Smalltalk''が最高に好きという訳ではないが、他の言語に比べればマシである。」とも述べて、OOP本来の支柱は「メッセージ・パッシング」である事を暗に示唆している。 |
|||
==脚注== |
==脚注== |
||
34行目: | 47行目: | ||
==関連項目== |
==関連項目== |
||
⚫ | |||
*[[構造化プログラミング]] |
*[[構造化プログラミング]] |
||
*[[データ指向]] |
|||
*[[エージェント指向]] |
|||
*[[アスペクト指向]] |
*[[アスペクト指向]] |
||
⚫ | |||
*[[ソフトウェア工学]] |
*[[ソフトウェア工学]] |
||
*[[デザインパターン (ソフトウェア)]] |
*[[デザインパターン (ソフトウェア)]] |
||
*[[ |
*[[:Category:オブジェクト指向言語]] |
||
⚫ | |||
*[[オブジェクトデータベース]] |
*[[オブジェクトデータベース]] |
||
*[[オブジェクト関係データベース]] |
*[[オブジェクト関係データベース]] |
||
*[[オブジェクト指向 |
*[[オブジェクト指向モデリング]] |
||
*[[オブジェクト指向分析設計]] |
*[[オブジェクト指向分析設計]] |
||
**[[オブジェクトモデル化技法]] |
|||
**[[統一モデリング言語|UML(統一モデリング言語)]] |
|||
**[[オブジェクトモデル化技法]] (OMT) |
|||
**[[Booch法]] |
**[[Booch法|ブーチメソッド]] |
||
⚫ | |||
**[[オブジェクト指向ソフトウェア工学]] (OOSE/Objectory) |
|||
*[[ |
*[[オブジェクト指向ソフトウェア工学]] |
||
*[[NEXTSTEP]] - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。 |
*[[NEXTSTEP]] - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。 |
||
*[[Cocoa]] - NEXTSTEPの後身のフレームワーク。 |
*[[Cocoa]] - NEXTSTEPの後身のフレームワーク。 |
||
*[[統合開発環境]] |
|||
*[[コンテンツ管理システム]] |
|||
⚫ | |||
*[[組合せ爆発]] |
|||
==外部リンク== |
==外部リンク== |
2019年1月27日 (日) 04:52時点における版
オブジェクト指向(オブジェクトしこう|英語:object-oriented)は、ソフトウェア工学構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。1950年代後半にマサチューセッツ工科大学の人口知能研究グループの間で最初に発案され、プログラム開発環境の構築を通して体系化されていき、1960年代に一つのプログラミング・パラダイムとして確立された。1980年代にはデータベースとオペレーティングシステムの開発にも活かされるようになった。1990年代になるとソフトウェア設計の幅広い面にも応用されるようになり、ソフトウェア工学その他にオブジェクト指向を土台にした様々な分野が開拓された。
オブジェクト指向は脳機能を形成するニューラル・ネットワークをヒントに発案された。オブジェクトはニューロンの投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様にオブジェクトのネットワークとして構築し、無数のオブジェクトが互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。
オブジェクト指向の分野一覧
- オブジェクト指向・プログラミング 1960年代から
- オブジェクト指向・データベース 1980年代から
- オブジェクト指向・アナリシス&デザイン 1990年代から
- オブジェクト指向・モデリング 1990年代から
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系であり、そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始め、ソフトウェア工学のあらゆる局面にobject-oriented(OO)を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、OOソフトウェアエンジニアリング、OOユーザーインターフェース、ブーチメソッド、オブジェクトモデリングテクニックなど複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっている事から、明確な一つの分野として扱われる事は少ない。
オブジェクト指向プログラミング
主な仕様
エンカプセレーション(内部隠蔽)
- オブジェクト内のデータ参照とメソッド呼出に対する、外部からのアクセスを限定する仕様。アクセス権限は、どのオブジェクトからもアクセス可能なパブリック、自分と派生オブジェクトからのみ可能なプロテクティド、自オブジェクト内のみのプライベート、の三種が基本となる。
インヘリタンス(継承)
- 派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る仕様(部品→全体)と、オブジェクトを複数の階層に分解して他オブジェクトと共有出来る階層を派生元にする仕様(全体→部品)の二通りの考え方がある。派生元オブジェクトの型式はスーパークラス、派生先オブジェクトの型式はサブクラスと呼ばれる事が多い。
ポリモーフィズム(多態性)
- 同名メソッドの呼び出し時に、オブジェクトによって処理内容が変化する機能。こちらは実行時の状況によって変化する多態性本来のダイナミックな機能である。また、引数とするクラス型に従って、呼び出されるメソッドと生成されるオブジェクトが変化する機能もあり、こちらはコンパイル時に決まるスタティックな機能となる。
オブジェクト生成の種類
- ユーザーが任意のクラスを定義し、それを元にインスタンスを生成する方式である。ベンダー側が用意したクラスライブラリ内のクラスを元にして、ユーザーが任意の派生クラスを定義する開発場面も多く、これは継承ベースとも言われる。
- 任意のインスタンス生成時に、ランタイム環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。
オブジェクト指向とメッセージング
オブジェクト指向プログラミングは、歴史的に1962年に公開されたクラス構造を中心とするSimula系統と、1970年代から研究開発が進められていたメッセージ機能を主体とするSmalltalk系統に大別されており、オブジェクト指向本来の形態を正しく表現してるのは後者のSmalltalkの方だと評されていた。しかし、当時のCPU処理能力の問題からより少ない処理量で、ポリモーフィズムその他の仕様を「継承クラス構造」を活かして実現出来るSimula系統(C++やJavaなど)の方が主流となった。こうしてクラス構造がオブジェクト指向の中心的役割を占めるようになった事から、Smalltalk制作者の一人であり、オブジェクト指向開発環境のパイオニアと見なされているアラン・ケイは「Smalltalkをオブジェクト指向言語と定義付けたのは、間違いだったかもしれない。」というコメントを残すに到った[1]。
Smalltalkが主体とする「メッセージング」は、それ自体が高度に柔軟なエンカプセレーションとポリモーフィズムの機能を自然に表現出来る仕組みだった。それに対して、C++やJavaに見られる「継承クラス構造」をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実的に「継承クラス構造」重視の言わば亜流の方がオブジェクト指向の主流となってしまった以上、もはや「メッセージング」主体のSmalltalkはオブジェクト指向としての看板を降ろすべきではないか、という自嘲的な見解がそのコメントの根底にあった。オブジェクト指向言語の進化に伴い、オブジェクトとクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」とも述べて、OOP本来の支柱は「メッセージ・パッシング」である事を暗に示唆している。
脚注
関連項目
- 構造化プログラミング
- アスペクト指向
- エージェント指向
- ソフトウェア工学
- デザインパターン (ソフトウェア)
- Category:オブジェクト指向言語
- オブジェクト指向プログラミング
- オブジェクトデータベース
- オブジェクト関係データベース
- オブジェクト指向モデリング
- オブジェクト指向分析設計
- オブジェクト指向ソフトウェア工学
- NEXTSTEP - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。
- Cocoa - NEXTSTEPの後身のフレームワーク。