コンテンツにスキップ

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

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
編集の要約なし
(同じ利用者による、間の2版が非表示)
5行目: 5行目:
}}
}}


'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|object-orientation}}、[[複合形容詞]]: {{lang|en|object-oriented}})は、[[ソフトウェア工学]]構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|''object-oriented''}})は、[[ソフトウェア工学]]構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。


オブジェクト指向のエッセンスおよびコンセプト自体はもともと1962年に公開された[[Simula|Simula I]]と、そ成功を受けて開発された[[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の影響を受けた[[ビャーネ・ストロヴストルップ]][[C++]]と、[[アラン・ケイ]]の[[Smalltalk]]によてオブジェクト指向が再定義された。
1950代後半に[[マサチューセッツ工科大学]]の[[人工知能|人口知能]]研究グループ間で最初にされたと言われ、彼らの研究と密接に結び付いていた1958年公開のプログラミング言語[[LISP]]の仕様に早期のオブジェクト指向的概念が内包されている。ま、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>。[[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演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。
オブジェクト指向は脳機能を形成する[[人工ニューラルネットワーク|ニューラル・ネットワーク]]をヒントに発案された。[[オブジェクト (プログラミング)|オブジェクト]]は[[人工ニューロン|ニューロン]]の投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様に[[オブジェクト (プログラミング)|オブジェクト]]のネットワークとして構築し、無数の[[オブジェクト (プログラミング)|オブジェクト]]が互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。
24行目: 18行目:
* [[オブジェクト指向モデリング]] (1990年代から)
* [[オブジェクト指向モデリング]] (1990年代から)


オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系であり、そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始め、ソフトウェア工学のあらゆる局面に''object-oriented'' (OO) を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、[[オブジェクト指向ソフトウェア工学|OOソフトウェアエンジニアリング]]、OOユーザーインターフェース、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法|オブジェクトモデリングテクニック]]など複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、明確な一つの分野として扱われることは少ない。
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系である。そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始めた事で、ソフトウェア工学のあらゆる局面に''object-oriented'' (OO) を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、[[オブジェクト指向ソフトウェア工学|OOソフトウェアエンジニアリング]]、OOユーザーインターフェース、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法|オブジェクトモデリングテクニック]]など複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、明確な一つの分野として扱われることは少ない。


==オブジェクト指向プログラミング==
==オブジェクト指向プログラミング==
オブジェクト指向に基づいたプログラミングスタイルのことであり、{{lang|en|Object-Oriented Programming}}の頭文字をとってOOPと略されることもある。
オブジェクト指向に基づいたプログラミングスタイルのであり、{{lang|en|''Object-Oriented Programming''}}の頭文字をとってOOPと略されることもある。
{{Main|オブジェクト指向プログラミング}}
{{Main|オブジェクト指向プログラミング}}


=== 主な要素 ===
=== 主な要素 ===
以下は[[ビャーネ・ストロヴストルップ]]が提唱した[[C++]]系統のオブジェクト指向における三大要素である。[[Simula]]由来の[[クラス (コンピュータ)|クラス]]機構を根幹とする。のちに[[クラスベース]]オブジェクト指向の欠点を克服するために[[プロトタイプベース]]オブジェクト指向も考案されたが、基本的な概念に大きな差異はない。
以下は[[ビャーネ・ストロヴストルップ]]が提唱した[[C++]]系統のOOPにおける三大要素である。[[Simula]]由来の[[クラス (コンピュータ)|クラス]]機構を根幹とする。のちに[[クラスベース]]OOPの欠点を克服するために[[プロトタイプベース]]OOPも考案されたが、基本的な概念に大きな差異はない。なお、[[アラン・ケイ]]が提唱した[[Smalltalk]]系統のOOPは、また別の要素(後述)を言語仕様の根幹にしている

なお、[[アラン・ケイ]]が提唱した[[Smalltalk]]系統のオブジェクト指向とは異なる(後述)。


* [[カプセル化]] (encapsulation)
* [[カプセル化]] (encapsulation)
47行目: 39行目:
: 通例、実行時の状況によって変化する「動的な多態性」のことを指す。C++では仮想関数(仮想メソッド)の[[オーバーライド]]により利用可能だが、内部的には通例[[仮想関数テーブル]]による動的なディスパッチを用いて実現されている。
: 通例、実行時の状況によって変化する「動的な多態性」のことを指す。C++では仮想関数(仮想メソッド)の[[オーバーライド]]により利用可能だが、内部的には通例[[仮想関数テーブル]]による動的なディスパッチを用いて実現されている。
: [[多重定義]](オーバーロード)をサポートする[[静的型付け]]言語では、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが変化する「静的な多態性」もあるが、こちらは実行時ではなくコンパイル時に動作が決まる。
: [[多重定義]](オーバーロード)をサポートする[[静的型付け]]言語では、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが変化する「静的な多態性」もあるが、こちらは実行時ではなくコンパイル時に動作が決まる。

===オブジェクト生成の種類===

* [[クラスベース]]
: まずオブジェクトの設計図となる任意の[[クラス (コンピュータ)|クラス]]を定義し、そのクラスを元に[[インスタンス]]を生成する方式である。

* [[プロトタイプベース]]
: プログラム実行環境に用意されている[[インスタンス]]をプロトタイプとしてクローンし、任意のプロパティやメソッドを追加して拡張していく方式である。インスタンスベースとも言われる。

* [[ミックスイン]]
: 任意のインスタンス生成時に、実行環境に用意された様々な機能コンポーネントを追加する方式である。各コンポーネントは同時にスーパークラスと同等となり、手軽で重複の無い多重継承が保証された。


=== オブジェクト指向とメッセージング ===
=== オブジェクト指向とメッセージング ===
オブジェクト指向プログラミングは、歴史的に[[Simula]]のオブジェトおよびクラスの概念発端とするが、Simulaの理念直接的に受け継いだ[[C++]]系統と、1970年代から研究開発が進められていた[[メッセージ (コンピュータ)|メッセージ・パッシング]]の仕組みを主体とする[[Smalltalk]]系統に大別されており、理想的なオブジェクト指向本来の形態を正しく表現しているのは後者のSmalltalk系統のほうだと評されていた。しかし、当時の計算機資源([[CPU]]処理能力メモリ容量など)の問題から、より少ないリソース下でも継承や多態性などのオブジェクト指向機能を「クラス構造」を活かして実現できるC++系統のほうが主流となった。現に、システム開発でよく利用される[[Java]]や[[C Sharp|C#]]などのオブジェクト指向プログラミング言語は、いずれも[[C++]]から派生した言語である。
オブジェクト指向プログラミングは、[[クラス (コンピュータ)|クラス]]言語仕様初めて導入した[[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が主体とする「メッセージング」はそれ自体が高度に柔軟なカプセル化とポリモーフィズムの機能を自然に表現できる仕組みだった。それに対してC++やJavaに見られる「クラス構造」と継承をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実に「クラス構造」重視の、言わば亜流のほうがオブジェクト指向の主流なってしまった以上{{独自研究範囲|date=2019年2月|もはや「メッセージング」主体Smalltalkは「オブジェクト指向」とての看板を降ろではないか、という自嘲的な見解がそのコメントの根底にあった}}オブジェクト指向言語の進化に伴い、オブジェクトとクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「自分自身もSmalltalkファンではない。とはいえ、今日のたいていのプログラミングシステムに比べれば好ましものだが。」と述べて、当時目指したオブジェクト指向本来の支柱は「メッセージ・パッシング」であることを{{独自研究範囲|date=2019年2月|暗に示唆している}}。
一方、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に見られる「クラス構造」をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実にはその「クラス構造」を中心とする言わば亜流のがオブジェクト指向の主流なっており結果的に「メッセージング」の存在感が埋もれてまった事に対る嘆とも言えない感情がそのコメントの背景にあったとされるOOP言語の進化に伴いクラス構造の側面ばかりが強調される現状の中で、アラン・ケイは「自分も贔屓目に見てSmalltalkきく秀てると思ってない、今日の大抵のプログラミングシステムが現状のソフトウェア開発問題対処出来てるとも思わない。」と述べて、オブジェクト指向本来の要点は「メッセージ・パッシング」であることを{{独自研究範囲|date=2019年2月|暗に示唆している}}。


==脚注==
==脚注==

2019年2月15日 (金) 08:47時点における版

オブジェクト指向(オブジェクトしこう、: object-oriented)は、ソフトウェア工学構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。

1950年代後半にマサチューセッツ工科大学人口知能研究グループの間で最初に発案されたと言われ、彼らの研究と密接に結び付いていた1958年公開のプログラミング言語LISPの仕様に早期のオブジェクト指向的概念が内包されている。また、1967年にクラス仕様を導入して公開されたSimula 67も一つの起源となった[1][2][3][4]LISPの影響を受けたアラン・ケイが1972年から1980年に渡ってSmalltalkの開発を進める中で[5]オブジェクト指向という用語を初めて明確に定義し、これが世に広まった。一方、ビャーネ・ストロヴストルップが1983年に公開したC++Simulaの影響を受けており、Smalltalkと並ぶもう一つの系統を確立した。その後はデータベースOSの開発にも活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓された。

オブジェクト指向は脳機能を形成するニューラル・ネットワークをヒントに発案された。オブジェクトニューロンの投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様にオブジェクトのネットワークとして構築し、無数のオブジェクトが互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。

オブジェクト指向の分野

オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系である。そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始めた事で、ソフトウェア工学のあらゆる局面にobject-oriented (OO) を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、OOソフトウェアエンジニアリング、OOユーザーインターフェース、ブーチメソッドオブジェクトモデリングテクニックなど複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、明確な一つの分野として扱われることは少ない。

オブジェクト指向プログラミング

オブジェクト指向に基づいたプログラミングスタイルの事であり、Object-Oriented Programmingの頭文字をとって「OOP」と略されることもある。

主な要素

以下はビャーネ・ストロヴストルップが提唱したC++系統のOOPにおける三大要素である。Simula由来のクラス機構を根幹とする。のちにクラスベースOOPの欠点を克服するためにプロトタイプベースOOPも考案されたが、基本的な概念に大きな差異はない。なお、アラン・ケイが提唱したSmalltalk系統のOOPは、また別の要素(後述)を言語仕様の根幹にしている。

オブジェクトのデータと、データに関連する振る舞い(操作、関数あるいはメソッド)をひとまとめにすること、またそれらに対して外部からのアクセスを制御・限定すること。
アクセス権限(可視性)の種別はプログラミング言語によって異なるが、C++ではどのコード領域からもアクセス可能なpublic、自クラスと派生クラスからのみアクセス可能なprotected、自クラス内でのみアクセス可能なprivate、の三種を規定しており、C++の派生言語では類似のアクセス修飾子英語版をサポートしていることが多い。
派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る仕様(部品→全体)と、オブジェクトを複数の階層に分解して他オブジェクトと共有できる階層を派生元にする仕様(全体→部品)の二通りの考え方がある。継承によりデータ構造およびコードの再利用と拡張を可能にする。
クラスベースのオブジェクト指向では、派生元オブジェクトのデータ型はスーパークラスあるいは基底クラスなど、派生先オブジェクトのデータ型はサブクラスあるいは派生クラスなどと呼ばれる。また、継承は後述する多態性を実現する仕組みでもある。リスコフの置換原則も参照のこと。
カナ表記でポリモーフィズムとも。同じシグネチャを持つメソッドの呼び出し時に、実際のオブジェクトの種類(クラス)によって処理内容が変化する機能。
通例、実行時の状況によって変化する「動的な多態性」のことを指す。C++では仮想関数(仮想メソッド)のオーバーライドにより利用可能だが、内部的には通例仮想関数テーブルによる動的なディスパッチを用いて実現されている。
多重定義(オーバーロード)をサポートする静的型付け言語では、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが変化する「静的な多態性」もあるが、こちらは実行時ではなくコンパイル時に動作が決まる。

オブジェクト指向とメッセージング

オブジェクト指向プログラミングは、クラスの言語仕様を初めて導入したSimulaのスタイルを受け継ぐC++系統と、LISPの影響を受けて[5]1970年代から研究開発が進められていたメッセージ・パッシングの仕組みを主体とするSmalltalk系統に大別されているが、理想的なオブジェクト指向の形態を表現しているのは後者のSmalltalk系統の方だと評されていた。しかし、当時のCPU処理能力及びメモリ容量の制限といった計算機資源の問題から、より少ないリソース下でも継承や多態性などのオブジェクト指向機能を「クラス構造」を活かして実現できるC++系統のほうが主流となった。現にソフトウェア開発でよく利用されるJavaC#などのOOP言語は、いずれもC++から派生した言語である。

一方、Smalltalk開発者の一人であり、オブジェクト指向プログラミングのパイオニアと見なされているアラン・ケイは「オブジェクト指向という用語を作り出したのは自分だがこれは悪い選択だった。メッセージ送信というもっと重要なアイディアを十分に強調出来なかったからだ。」というコメントを残している[6][7]。Smalltalkが主体とする「メッセージング」はそれ自体が高度に柔軟なカプセル化とポリモーフィズムの機能を自然に表現できる仕組みだった。それに対してC++やJavaに見られる「クラス構造」をベースにした同様の機能の実現はトリッキーと言えた。しかし、現実にはその「クラス構造」を中心とする言わば亜流の方がオブジェクト指向の主流になっており、結果的に「メッセージング」の存在感が埋もれてしまった事に対する嘆きとも言えない感情がそのコメントの背景にあったとされる。OOP言語の進化に伴い「クラス構造」の側面ばかりが強調される現状の中で、アラン・ケイは「自分も贔屓目に見てSmalltalkが大きく秀でてるとは思ってないが、今日の大抵のプログラミングシステムが現状のソフトウェア開発問題に対処出来てるとも思わない。」と述べて、オブジェクト指向本来の要点は「メッセージ・パッシング」であることを暗に示唆している[独自研究?]

脚注

  1. ^ How Object-Oriented Programming Started
  2. ^ Ole-Johan Dahl (2001年6月). “The Birth of Object Orientation: the Simula Languages”. 2019年2月2日閲覧。
  3. ^ INTRODUCTION TO SIMULA
  4. ^ Jonathan Aldrich and Charlie Garrod (2014年). “OO History: Simula and Smalltalk”. 2019年2月2日閲覧。
  5. ^ a b "Dr. Alan Kay on the Meaning of Object-Oriented Programming". 2003. Retrieved 11 February 2010.
  6. ^ オブジェクト指向プログラミングは間違いだったか? - InfoQ
  7. ^ Object Oriented Programming: The Wrong Path? - InfoQ

関連項目

外部リンク