「オブジェクト指向」の版間の差分
削除された内容 追加された内容
誤字訂正 |
Goldensundown2 (会話 | 投稿記録) |
||
(同じ利用者による、間の4版が非表示) | |||
7行目:
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|''object-oriented''}})は、[[ソフトウェア工学]]構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。
1950年代後半に[[マサチューセッツ工科大学]]の[[人工知能|人工知能('''AI''')]]研究グループの間で最初に発案されたと言われ、彼らの研究と密接に結び付いていた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年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓された。
オブジェクト指向は脳機能を形成する[[人工ニューラルネットワーク|ニューラル・ネットワーク]]をヒントに発案された。[[オブジェクト (プログラミング)|オブジェクト]]は[[人工ニューロン|ニューロン]]の投影物であった。ニューロンはそれぞれが記憶を持ち、網の目のように結ばれて相互に影響し合い高度な思考を表現した。コンピュータ・プログラムも同様に[[オブジェクト (プログラミング)|オブジェクト]]のネットワークとして構築し、無数の[[オブジェクト (プログラミング)|オブジェクト]]が互いに作用し合うようにして任意のプロセスを実現する事がオブジェクト指向の理念であった。ここでのオブジェクトとは対象物を意味する言葉であり、対象物とは大まかにCPU演算処理(コード)が扱うデータ全般を指す。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる構想から、データにそれを扱う為のコードを付随させたオブジェクトの概念が生み出された。
20行目:
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系である。そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始めた事で、ソフトウェア工学のあらゆる局面に''object-oriented'' (OO) を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、[[オブジェクト指向ソフトウェア工学|OOソフトウェアエンジニアリング]]、OOユーザーインターフェース、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法|オブジェクトモデリングテクニック]]など複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、明確な一つの分野として扱われることは少ない。
==オブジェクト指向プログラミング(OOP)==
{{Main|オブジェクト指向プログラミング}}
===
現在は[[C++]]系統のクラス主体(''classes-principled'')OOPが主流となっている為、その言語仕様における三つの原則(''fundamental principle'')が事実上OOPの三大原則と見なされている。[[Smalltalk]]系統のメッセージ主体(''messaging-principled'')OOPは、また別の基本原則を言語仕様の根幹にしている。
*
: オブジェクト内のデータ参照とメソッド呼出に対する、外部からのアクセスを制限する仕様。アクセス権限(可視性)は、どのオブジェクトからでもアクセス可能なパブリック、自分と派生オブジェクトからのみ可能なプロテクティド、自オブジェクト内でのみ可能なプライベートの三種が基本となる。なお、同じクラスから生成された全オブジェクトをアクセス分類において同一に見なす仕様もあり、こちらの方が一般的である。
*
: 派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る
* [[多態性|'''ポリモーフィズム''']]
: 任意メソッドの呼出時に、メソッドが所属するオブジェクトによって呼出先実装コードが選択される仕様。こちらは実行時の状況によって処理内容が変化する多態性本来の動的な機能である。また、引数とするオブジェクトの型に従って呼出先メソッドが自動選択される仕様もあり、こちらはコンパイル時に決まる静的な多態性となる。これは1~2個の数値を事実上の引数にする演算子にも適用されている。
:また、実行時にオブジェクトを型チェックして派生オブジェクトに型変化させる機能や、生成時に渡す引数オブジェクトの型に従って生成オブジェクトをコンパイル時に自動選択する所謂ジェネリックも多態性の一種と見なされる。
===
[[Smalltalk]]系統のメッセージ主体OOPの主要原則(''fundamental principle'')である'''[[メッセージパッシング]]'''(''message passing'')は、従来のサブルーチンコールの形態を変えたものであり、基本はバイトデータの送受信でメソッド名とパラメータ値およびリターン値をやり取りするという仕組みだった。このバイトデータの羅列が「[[メッセージ (コンピュータ)|メッセージ]]」と呼ばれ、大抵は先頭の伝言名と後続の引数名&引数値の配列で構成された。オブジェクトのレシーバー関数が引数として渡されたメッセージを読み込み、オブジェクト内部でそれに準じた処理を行い、結果をリターンした。レシーバーの仕組みは結果的に「[[カプセル化|内部隠蔽]]」を実現出来た。オブジェクト内部での自由自在な処理実装によるリターンはこれも結果的に「[[多態性]]」を実現出来た。この多態性が示す[[多重ディスパッチ]]ないし動的ディスパッチを円滑に実装する為に、クラス構造定義を自由に操作できる「[[リフレクション (情報工学)|リフレクション]]」の機能が備えられた。
==脚注==
|