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

削除された内容 追加された内容
誤字訂正
(同じ利用者による、間の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)==
オブジェクト指向に基づいたプログラミングスタイルの事であり、{{lang|en|''Object-Oriented Programming''}}の頭文字をとって「OOP」と略されることもある。
{{Main|オブジェクト指向プログラミング}}
 
=== 主な要素OOPの三大原則 ===
現在は[[C++]]系統のクラス主体(''classes-principled'')OOPが主流となっている為、その言語仕様における三つの原則(''fundamental principle'')が事実上OOPの三大原則と見なされている。[[Smalltalk]]系統のメッセージ主体(''messaging-principled'')OOPは、また別の基本原則を言語仕様の根幹にしている。
以下は[[ビャーネ・ストロヴストルップ]]が提唱した[[C++]]系統のOOPにおける三大要素である。[[Simula]]由来の[[クラス (コンピュータ)|クラス]]機構を根幹とする。のちに[[クラスベース]]OOPの欠点を克服するために[[プロトタイプベース]]OOPも考案されたが、基本的な概念に大きな差異はない。なお、[[アラン・ケイ]]が提唱した[[Smalltalk]]系統のOOPは、また別の要素(後述)を言語仕様の根幹にしている。
 
* [[カプセル化|'''エンカプセレーション''']] ((''encapsulation)'')内部隠蔽
: オブジェクト内のデータ参照とメソッド呼出に対する、外部からのアクセスを制限する仕様。アクセス権限(可視性)は、どのオブジェクトからでもアクセス可能なパブリック、自分と派生オブジェクトからのみ可能なプロテクティド、自オブジェクト内でのみ可能なプライベートの三種が基本となる。なお、同じクラスから生成された全オブジェクトをアクセス分類において同一に見なす仕様もあり、こちらの方が一般的である。
: [[オブジェクト (プログラミング)|オブジェクト]]のデータと、データに関連する振る舞い(操作、[[サブルーチン|関数]]あるいは[[メソッド (計算機科学)|メソッド]])をひとまとめにすること、またそれらに対して外部からのアクセスを制御・限定すること。
: アクセス権限(可視性)の種別はプログラミング言語によって異なるが、C++ではどのコード領域からもアクセス可能な''public''、自クラスと派生クラスからのみアクセス可能な''protected''、自クラス内でのみアクセス可能な''private''、の三種を規定しており、C++の派生言語では類似の{{仮リンク|アクセス修飾子|en|Access modifiers}}をサポートしていることが多い。
 
* '''[[継承 (プログラミング)|継承インヘリタンス]] ('''(''inheritance)'')継承
: 派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る仕様(部品→全体)と、オブジェクトを複数の階層に分解して他オブジェクトと共有でき出来る階層を派生元にする仕様(全体→部品)二通りの考え方がある。継承によりデ派生元オブジェクトはスタ構造およびコドの再利用クラス、派生先オブジェクトはサブクラス拡張を可能にす呼ばれ事が多い
: クラスベースのオブジェクト指向では、派生元オブジェクトのデータ型はスーパークラスあるいは基底クラスなど、派生先オブジェクトのデータ型はサブクラスあるいは派生クラスなどと呼ばれる。また、継承は後述する多態性を実現する仕組みでもある。[[リスコフの置換原則]]も参照のこと。
 
* [[多態性|'''ポリモーフィズム''']] ((''polymorphism)'')多態性
: 任意メソッドの呼出時に、メソッドが所属するオブジェクトによって呼出先実装コードが選択される仕様。こちらは実行時の状況によって処理内容が変化する多態性本来の動的な機能である。また、引数とするオブジェクトの型に従って呼出先メソッドが自動選択される仕様もあり、こちらはコンパイル時に決まる静的な多態性となる。これは1~2個の数値を事実上の引数にする演算子にも適用されている。
: カナ表記で[[ポリモーフィズム]]とも。同じ[[シグネチャ]]を持つメソッドの呼び出し時に、実際のオブジェクトの種類(クラス)によって処理内容が変化する機能。
:また、実行時にオブジェクトを型チェックして派生オブジェクトに型変化させる機能や、生成時に渡す引数オブジェクトの型に従って生成オブジェクトをコンパイル時に自動選択する所謂ジェネリックも多態性の一種と見なされる。
: 通例、実行時の状況によって変化する「動的な多態性」のことを指す。C++では仮想関数(仮想メソッド)の[[オーバーライド]]により利用可能だが、内部的には通例[[仮想関数テーブル]]による動的なディスパッチを用いて実現されている。
: [[多重定義]](オーバーロード)をサポートする[[静的型付け]]言語では、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが変化する「静的な多態性」もあるが、こちらは実行時ではなくコンパイル時に動作が決まる。
 
=== オブジェクト指向とメッセージング ===
[[Smalltalk]]系統のメッセージ主体OOPの主要原則(''fundamental principle'')である'''[[メッセージパッシング]]'''(''message passing'')は、従来のサブルーチンコールの形態を変えたものであり、基本はバイトデータの送受信でメソッド名とパラメータ値およびリターン値をやり取りするという仕組みだった。このバイトデータの羅列が「[[メッセージ (コンピュータ)|メッセージ]]」と呼ばれ、大抵は先頭の伝言名と後続の引数名&引数値の配列で構成された。オブジェクトのレシーバー関数が引数として渡されたメッセージを読み込み、オブジェクト内部でそれに準じた処理を行い、結果をリターンした。レシーバーの仕組みは結果的に「[[カプセル化|内部隠蔽]]」を実現出来た。オブジェクト内部での自由自在な処理実装によるリターンはこれも結果的に「[[多態性]]」を実現出来た。この多態性が示す[[多重ディスパッチ]]ないし動的ディスパッチを円滑に実装する為に、クラス構造定義を自由に操作できる「[[リフレクション (情報工学)|リフレクション]]」の機能が備えられた。
オブジェクト指向プログラミングは、[[クラス (コンピュータ)|クラス]]の言語仕様を初めて導入した[[Simula]]のスタイルを受け継ぐ[[C++]]系統と、LISPの影響を受けて<ref name=":0" />1970年代から研究開発が進められていた[[メッセージ (コンピュータ)|メッセージ・パッシング]]の仕組みを主体とする[[Smalltalk]]系統に大別されているが、理想的なオブジェクト指向の形態を表現しているのは後者のSmalltalk系統の方だと評されていた。しかし、当時のCPU処理能力及びメモリ容量の制限といった計算機資源の問題から、より少ないリソース下でも継承や多態性などのオブジェクト指向機能を「クラス構造」を活かして実現できるC++系統のほうが主流となった。現にソフトウェア開発でよく利用される[[Java]]や[[C Sharp|C#]]などのOOP言語は、いずれも[[C++]]から派生した言語である。
 
一方、このメッセージングを主要原則とするSmalltalk開発者系統一人であり、方が理想的なオブジェクト指向プログラミングパイオニア形態を表現している専らの評判であったが、20世紀後半当時のCPU処理能力されど計算機資源の問題と、また理論より実務上の利便性を重宝する開発現場の事情から、より簡便な設計および少ないリソース下でも開発可能なC++系統の方がOOPの主流となるに到っている。こうした現状の中で、OOPという言葉自体の生みの親である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の方がオブジェクト指向の主流になっておりしまい、結果的にメッセージングの存在感が埋もれてしまった事に対する嘆きとも言えない感情がそのコメントの背景にあったとされるOOP言語の進化に伴い「クラス構造」の側面ばかりが強調される現状の中で、アラン・ケイは「自分も贔屓目に見てSmalltalkが大きく秀でてるとは思ってないが、今日の大抵のプログラミングシステムが現状のソフトウェア開発問題に対処出来てるとも思わない。」と述べて、オブジェクト指向本来の要点はメッセージ・パッシングであることを{{独自研究範囲|date=2019年2月|暗に示唆している}}。
 
==脚注==