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

削除された内容 追加された内容
編集の要約なし
(同じ利用者による、間の2版が非表示)
5行目:
}}
 
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|object-orientation}}、[[複合形容詞]]: {{lang|en|''object-oriented''}})は、[[ソフトウェア工学]]構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。
 
オブジェクト指向のエッセンスおよびコンセプト自体はもともと19621950代後半公開された[[Simulaマサチューセッツ工科大学]]の[[人工知能|Simula I人口知能]]と、そ研究グループ成功を受けて開間で最初にされたと言われ、彼らの研究と密接に結び付いていた1958年公開のプログラミング言語[[Simula|Simula 67LISP]]で導入の仕様に早期のオブジェクト指向的概念が内包されている。ま、1967年に[[クラス (コンピュータ)|クラス仕様]]機構発端導入して公開された[[Simula|Simula 67]]も一つの起源するなった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref><ref>{{Cite web|url=http://www.olejohandahl.info/old/birth-of-oo.pdf|title=The Birth of Object Orientation: the Simula Languages|author=Ole-Johan Dahl|date=June 2001|accessdate=2019-02-02}}</ref><ref>[http://staff.um.edu.mt/jskl1/talk.html INTRODUCTION TO SIMULA]</ref><ref>{{Cite web|url=https://www.cs.cmu.edu/~charlie/courses/15-214/2014-fall/slides/25-history-oo.pdf|title=OO History: Simula and Smalltalk|author=Jonathan Aldrich and Charlie Garrod|date=2014|accessdate=2019-02-02}}</ref>。のちにSimula[[LISP]]の影響を受けた[[アラン・ケイ]]が1972年から1980年に渡って[[Smalltalk]]の開発を進める中で<ref name=":0">"Dr. Alan Kay on the Meaning of Object-Oriented Programming". 2003. Retrieved 11 February 2010. </ref>オブジェクト指向という用語を初めて明確に定義し、これが世に広まった。一方、[[ビャーネ・ストロヴストルップ]]が1983年に公開した[[C++]]と、[[アラン・ケイSimula]]の影響を受けており、[[Smalltalk]]と並ぶもう一つの系統を確立した。その後は[[データベース]]と[[オペレーティングシステム|OS]]の開発も活かされるうになり、1990年代になるとソフトウェア工学の幅広い面にも応用されオブジェクト指向を土台にした様々な分野再定義開拓された。
 
==歴史==
{{独自研究|section=1|date=2019年2月}}
{{正確性|section=1|date=2019年2月}}
{{出典の明記|section=1|date=2019年2月}}
1950年代後半に[[マサチューセッツ工科大学]]の[[人工知能|人口知能]]研究グループの間で最初に発案され、プログラム開発環境の構築を通して体系化されていき、1960年代に一つの[[プログラミング・パラダイム]]として確立された。1980年代には[[データベース]]と[[オペレーティングシステム]]の開発にも活かされるようになった。1990年代になるとソフトウェア設計の幅広い面にも応用されるようになり、[[ソフトウェア工学]]その他にオブジェクト指向を土台にした様々な分野が開拓された。
 
オブジェクト指向は脳機能を形成する[[人工ニューラルネットワーク|ニューラル・ネットワーク]]をヒントに発案された。[[オブジェクト (プログラミング)|オブジェクト]]は[[人工ニューロン|ニューロン]]の投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様に[[オブジェクト (プログラミング)|オブジェクト]]のネットワークとして構築し、無数の[[オブジェクト (プログラミング)|オブジェクト]]が互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。
24 ⟶ 18行目:
* [[オブジェクト指向モデリング]] (1990年代から)
 
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系であり、る。そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始めた事で、ソフトウェア工学のあらゆる局面に''object-oriented'' (OO) を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、[[オブジェクト指向ソフトウェア工学|OOソフトウェアエンジニアリング]]、OOユーザーインターフェース、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法|オブジェクトモデリングテクニック]]など複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、明確な一つの分野として扱われることは少ない。
 
==オブジェクト指向プログラミング==
オブジェクト指向に基づいたプログラミングスタイルのことであり、{{lang|en|''Object-Oriented Programming''}}の頭文字をとってOOPと略されることもある。
{{Main|オブジェクト指向プログラミング}}
 
=== 主な要素 ===
以下は[[ビャーネ・ストロヴストルップ]]が提唱した[[C++]]系統のオブジェクト指向OOPにおける三大要素である。[[Simula]]由来の[[クラス (コンピュータ)|クラス]]機構を根幹とする。のちに[[クラスベース]]オブジェクト指向OOPの欠点を克服するために[[プロトタイプベース]]オブジェクト指向OOPも考案されたが、基本的な概念に大きな差異はない。なお、[[アラン・ケイ]]が提唱した[[Smalltalk]]系統のOOPは、また別の要素(後述)を言語仕様の根幹にしている
 
なお、[[アラン・ケイ]]が提唱した[[Smalltalk]]系統のオブジェクト指向とは異なる(後述)。
 
* [[カプセル化]] (encapsulation)
47 ⟶ 39行目:
: 通例、実行時の状況によって変化する「動的な多態性」のことを指す。C++では仮想関数(仮想メソッド)の[[オーバーライド]]により利用可能だが、内部的には通例[[仮想関数テーブル]]による動的なディスパッチを用いて実現されている。
: [[多重定義]](オーバーロード)をサポートする[[静的型付け]]言語では、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが変化する「静的な多態性」もあるが、こちらは実行時ではなくコンパイル時に動作が決まる。
 
===オブジェクト生成の種類===
 
* [[クラスベース]]
: まずオブジェクトの設計図となる任意の[[クラス (コンピュータ)|クラス]]を定義し、そのクラスを元に[[インスタンス]]を生成する方式である。
 
* [[プロトタイプベース]]
: プログラム実行環境に用意されている[[インスタンス]]をプロトタイプとしてクローンし、任意のプロパティやメソッドを追加して拡張していく方式である。インスタンスベースとも言われる。
 
* [[ミックスイン]]
: 任意のインスタンス生成時に、実行環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。
 
=== オブジェクト指向とメッセージング ===
オブジェクト指向プログラミングは、歴史的に[[Simula]]のオブジェトおよびラス (コンピュータ)|クラス]]概念言語仕様発端とするが、初めて導入した[[Simula]]理念スタイル直接的に受け継いだ[[C++]]系統と、LISPの影響を受けて<ref name=":0" />1970年代から研究開発が進められていた[[メッセージ (コンピュータ)|メッセージ・パッシング]]の仕組みを主体とする[[Smalltalk]]系統に大別されておりいるが、理想的なオブジェクト指向本来の形態を正しく表現しているのは後者のSmalltalk系統のほうだと評されていた。しかし、当時の計算機資源([[CPU]]処理能力及びメモリ容量など)の制限といった計算機資源の問題から、より少ないリソース下でも継承や多態性などのオブジェクト指向機能を「クラス構造」を活かして実現できるC++系統のほうが主流となった。現に、システムソフトウェア開発でよく利用される[[Java]]や[[C Sharp|C#]]などのオブジェクト指向プログラミングOOP言語は、いずれも[[C++]]から派生した言語である。
 
なお、Smalltalk開発者の一人であり、オブジェクト指向開発環境のパイオニアと見なされているアラン・ケイは「オブジェクト指向という用語を作り出したのは自分だが、これは悪い選択だった。なぜならば、メッセージ送信のもっと重要なアイディアを十分強調していない。」というコメントを残している<ref>[http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang オブジェクト指向プログラミングは間違いだったか? - InfoQ]</ref><ref>[https://www.infoq.com/news/2010/07/objects-smalltalk-erlang Object Oriented Programming: The Wrong Path? - InfoQ]</ref>。
 
一方、Smalltalk開発者の一人であり、オブジェクト指向プログラミングのパイオニアと見なされているアラン・ケイは「オブジェクト指向という用語を作り出したのは自分だがこれは悪い選択だった。メッセージ送信というもっと重要なアイディアを十分に強調出来なかったからだ。」というコメントを残している<ref>[http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang オブジェクト指向プログラミングは間違いだったか? - InfoQ]</ref><ref>[https://www.infoq.com/news/2010/07/objects-smalltalk-erlang Object Oriented Programming: The Wrong Path? - InfoQ]</ref>。Smalltalkが主体とする「メッセージング」はそれ自体が高度に柔軟なカプセル化とポリモーフィズムの機能を自然に表現できる仕組みだった。それに対してC++やJavaに見られる「クラス構造」と継承をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実はその「クラス構造」重視の、を中心とする言わば亜流のほうがオブジェクト指向の主流なってしまった以上おり{{独自研究範囲|date=2019年2月|もはや結果的に「メッセージング」主体Smalltalkは「オブジェクト指向」と存在感が埋もれてての看板を降ろまった事に対る嘆ではとも言えないか、という自嘲的な見解感情がそのコメントの根底背景にあった}}とされるオブジェクト指向OOP言語の進化に伴い、オブジェクトとクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「自分自身贔屓目に見てSmalltalkファンきく秀てると思ってない。とはいえ、今日のたいてい大抵のプログラミングシステムが現状のソフトウェア開発問題比べれば好まし対処出来てるとも思わなものだが。」と述べて、当時目指したオブジェクト指向本来の支柱要点は「メッセージ・パッシング」であることを{{独自研究範囲|date=2019年2月|暗に示唆している}}。
 
==脚注==