「オブジェクト指向」の版間の差分

削除された内容 追加された内容
編集の要約なし
関連項目
(同じ利用者による、間の16版が非表示)
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|オブジェクト指向プログラミング}}
オブジェクト指向プログラミングを構成する概念は次のようなものである。
 
=== 主な仕様 ===
;[[カプセル化]] (情報隠蔽)
[[カプセル化|エンカプセレーション]](内部隠蔽)
:[[オブジェクト (プログラミング)|オブジェクト]]の振る舞いを隠蔽したり、オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの実際の型を隠蔽したりすることをいう。これは古典的な可視性の定義である。
 
また、: [[オブジェクト指向 (プログラミング)|オブジェクト]]内概念拡大データ参照とメソッド呼出伴い対する必須と表現外部からのアクセスを限定する仕様。アクセス権限は、どが不適切にオブジェクトからもアクセス可能りつつあるがパブリック旧来の多く自分と派生オブジェクトからみ可能なプロテクティド、自オブジェクト指向言語が備えている性質には以下プライベート、の三種基本となる。
 
[[インヘリタンス]](継承)
;[[ポリモーフィズム]] (多態性)
:ある 派生元オブジェクトに任意操作が呼び出し側データとメソッドを追加する形はなく、受け手の派生先オブジェクトによって定まを作特性。[[クラスベース]]の仕様(部品→全体)と、オブジェクト指向の場合には、派生クラスの複数の階層に岐として多態性他オブジェクトと共有出来る階層実現派生元にる仕様(全体→部品)の二通りの考え方がある。 [[プロ派生元オブジェクタイプベの型式はスパークラ]]の、派生先オブジェクト指向場合で型式関係がない概念サブクラス呼ばれる事が多い
 
;[[ポリモーフィズム]] (多態性)
==オブジェクト指向の方式==
: 同名メソッドの呼び出し時に、オブジェクトによって処理内容が変化する機能。こちらは実行時の状況によって変化する多態性本来のダイナミックな機能である。また、引数とするクラス型に従って、呼び出されるメソッドと生成されるオブジェクトが変化する機能もあり、こちらはコンパイル時に決まるスタティックな機能となる。
*[[クラスベース]]方式 &mdash; [[クラス (コンピュータ)|クラス]]を定義し、それを元に[[インスタンス]]を生成する方式である。'''継承ベース'''ともいう。
*[[プロトタイプベース]]方式 &mdash; 既存の[[インスタンス]]を元に、新たな[[インスタンス]]を生成する方式である。'''インスタンスベース'''ともいう。
*[[ミックスイン|Mixin]]方式 &mdash; さまざまなオブジェクトの原型を組み合わせて一つのオブジェクトを構成する方式である。
 
===オブジェクト指向生成名称とメッセージング種類===
 
[[Eclipse (統合開発環境)|Eclipse]]を開発したDave Thomasや、オブジェクト指向という言葉の生みの親であるAlan Kay博士は、オブジェクト指向という言葉は失敗だったと語っている。<ref>http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang</ref>
[[クラスベース]]
これは、本来オブジェクト指向が重視すべきは'''「オブジェクト」'''ではなく'''「メッセージング」'''であるにもかかわらず'''「メッセージング」'''がおろそかにされているためである。特に言語の進歩において「オブジェクト」や「クラス」の側面ばかり強調される傾向にあり、Alan Kay博士は「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」と述べている。
: ユーザーが任意の[[クラス (コンピュータ)|クラス]]を定義し、それを元に[[インスタンス]]を生成する方式である。ベンダー側が用意したクラスライブラリ内のクラスを元にして、ユーザーが任意の派生クラスを定義する開発場面も多く、これは継承ベースとも言われる。
 
[[プロトタイプベース]]
*[[: プログラムを実行させるランタイプベース]]方式 &mdash; 既存のム環境に用意されている[[インスタンス]]を派生として任意の実装をし[[インスタンス]]を生成する方式である。'''インスタンスベース'''ともいう言われる
 
[[ミックスイン]]
: 任意のインスタンス生成時に、ランタイム環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。
 
=== オブジェクト指向の方式とメッセージング ===
オブジェクト指向プログラミングは、歴史的に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]]
*[[オブジェクト指向プログラミングを構成する概念は次のようなものである。]]
*[[オブジェクトデータベース]]
*[[オブジェクト関係データベース]]
*[[オブジェクト指向プログラミモデリング]]
*[[オブジェクト指向分析設計]] (
**[[オブジェクト指向開発方モデル化技論)]]
**[[統一モデリング言語|UML(統一モデリング言語)]]
**[[オブジェクトモデル化技法]] (OMT)
**[[Booch法|ブーチメソッド]]
**[[CRCカード]]
**[[オブジェクト指向ソフトウェア工学]] (OOSE/Objectory)
*[[:Category:オブジェクト指向言語ソフトウェア工学]]
*[[NEXTSTEP]] - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。
*[[Cocoa]] - NEXTSTEPの後身のフレームワーク。
*[[統合開発環境]]
*[[コンテンツ管理システム]]
*[[CRCカード]]
*[[組合せ爆発]]
 
==外部リンク==