コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

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

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
編集の要約なし
編集の要約なし
(同じ利用者による、間の22版が非表示)
1行目: 1行目:
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|''object-oriented''}})は、[[ソフトウェア工学]]理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。元々は特定の[[プログラミングパラダイム|プログラミング・パラダイム]]を説明する為に考案された言葉だった。''object-oriented programming''のように修飾語として用いられるのが常であり、それ単体で扱われる事はない漠然とした設計構想でもある。{{main|オブジェクト指向プログラミング}}
{{複数の問題
|独自研究=2019年2月
|正確性=2019年2月
|出典の明記=2019年2月
}}
<!-- 「仕様」という言葉を安易に濫用するべきではない。仕様とは、満たすべき機能や性能を列挙したもの。機能や性能自体ではない。 -->


== オブジェクト指向の成り立ち ==
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|object-orientation}}<ref>[https://eow.alc.co.jp/search?q=object+orientation object orientationの意味・使い方|英辞郎 on the WEB:アルク]</ref>)は、[[ソフトウェア工学]]構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方あるいは概念(コンセプト)である。修飾語として用いられる{{lang|en|object-oriented}}は「オブジェクト指向の」という意味を持つ[[複合形容詞]]であり、修飾対象がオブジェクト指向に基づいていること、あるいはオブジェクト指向に関連することを意味する。
オブジェクト指向(''object-oriented'')という言葉自体は、1972年から80年にかけてプログラミング言語「[[Smalltalk]]」を公開した計算機科学者[[アラン・ケイ]]が、その言語設計を説明する中で初めて生み出されている<ref name="EarlyHistoryOfSmalltalk">{{Cite web|url=http://worrydream.com/EarlyHistoryOfSmalltalk/|title=The Early History Of Smalltalk|author=Alan C. Kay|accessdate=2019-02-21}}</ref>。そこから遡って1967年に公開されていた「[[Simula|Simula 67]]」の[[クラス (コンピュータ)|クラス]]と[[オブジェクト (プログラミング)|オブジェクト]]の設計もオブジェクト指向の発端と見なされるようになった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。データとコードの複合体であるオブジェクト(''object'')という用語を確立したのは[[Simula|Simula 67]]であったが<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]]」の影響を受けた事を強調しており<ref name="EarlyHistoryOfSmalltalk" />、実際に[[クラス (コンピュータ)|クラス]]の仕組みを除いた[[Smalltalk]]のオブジェクト指向設計は完全に別物であった。1958年に公開されていた[[LISP]]は[[マサチューセッツ工科大学|MIT]]の[[人工知能]](AI)研究と深い関わりを持っていた。その後、計算機科学者[[ビャーネ・ストロヴストルップ]]が1983年に公開した「[[C++]]」が契機となって、オブジェクト指向に関連する様々な考え方が再定義されている。[[C++]]の設計は[[Simula|Simula 67]]の方をモデルにしていた。


上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代から[[データベース]]と[[オペレーティングシステム|OS]]の開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。
特に[[プログラミング (コンピュータ)|コンピュータプログラミング]]分野におけるオブジェクト指向のエッセンスおよびコンセプト自体は、もともと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++]]と、Simulaのほかに[[LISP]]の影響を強く受けた[[アラン・ケイ]]の[[Smalltalk]]<ref name="EarlyHistoryOfSmalltalk">{{Cite web|url=http://worrydream.com/EarlyHistoryOfSmalltalk/|title=The Early History Of Smalltalk|author=Alan C. Kay|accessdate=2019-02-21}}</ref>によってオブジェクト指向が再定義された。

==起源==
オブジェクト指向の起源自体は明確ではない。また、突発的に生まれたものでもなく、例えば以下に挙げるような様々な概念や技術が発展・融合して生まれたものである<ref>[https://tech.nikkeibp.co.jp/it/article/lecture/20070710/277100/ Part2 オブジェクト指向の発展の歴史 | 日経 xTECH(クロステック)]</ref><ref>[https://www.itmedia.co.jp/im/articles/0909/29/news106.html オブジェクト指向(おぶじぇくとしこう) - ITmedia エンタープライズ]</ref>。
* 哲学([[モナド (哲学)|モナド]]など)、[[言語哲学]]([[記号論]]など)、[[認知科学]]
* [[人工知能]]に関する研究
* [[データモデル]]([[実体関連モデル|E-Rモデル]]および意味データモデル)
* ソフトウエア工学の基本概念(モジュール、情報隠蔽、型理論)
* コンピュータ・アーキテクチャ([[オペレーティングシステム|OS]]、[[グラフィカルユーザインタフェース|GUI]]、デバイス)


==オブジェクト指向の分野==
==オブジェクト指向の分野==


* [[オブジェクト指向プログラミング]] (1960年代から)
* [[オブジェクト指向プログラミング]] (1970年代から)
* [[オブジェクトデータベース]] (1980年代から)
* [[オブジェクトデータベース]] (1980年代から)
* [[オブジェクト指向分析設計]] (1990年代から)
* [[オブジェクト指向分析設計]] (1990年代から)
* [[オブジェクト指向モデリング]] (1990年代から)
* [[オブジェクト指向モデリング]] (1990年代から)


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


他にも、オブジェクト指向オペレーティングシステム、[[オブジェクト関係データベース]]、[[オブジェクト関係マッピング]]、[[オブジェクト指向ソフトウェア工学]]、オブジェクト指向ユーザーインターフェース、オブジェクト指向プロジェクト管理、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法]]など数々の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、一つの分野として特筆される事は少ない。
==オブジェクト指向プログラミング==
オブジェクト指向に基づいたプログラミングスタイルのことであり、{{lang|en|Object-Oriented Programming}}の頭文字をとってOOPと略されることもある。
{{Main|オブジェクト指向プログラミング}}


==オブジェクト指向とは==
=== 主な要素 ===
以下は[[ビャーネ・ストロヴストルップ]]が提唱した[[C++]]系統のオブジェクト指向における三大要素<!-- 原則ではなく要素。 -->である。[[Simula]]由来の[[クラス (コンピュータ)|クラス]]機構を根幹とする。のちに[[クラスベース]]オブジェクト指向の欠点を克服するために[[プロトタイプベース]]オブジェクト指向も考案されたが、基本的な方向性に大きな差異はない。


=== 概要 ===
なお、[[アラン・ケイ]]が提唱した[[Smalltalk]]系統のオブジェクト指向は、以下とは別の異なる概念を根幹としている(後述)。
オブジェクト指向(''object-oriented'')の言葉を生み出した計算機科学者[[アラン・ケイ]]は、1970年代に発表した文書の中でその設計構想を六つの要約で説明している<ref name="EarlyHistoryOfSmalltalk" />。


#''EverythingIsAnObject.''
* [[カプセル化]] (encapsulation)
#''Objects communicate by sending and receiving messages (in terms of objects).''
: [[オブジェクト (プログラミング)|オブジェクト]]のデータと、データに関連する振る舞い(操作、[[サブルーチン|関数]]あるいは[[メソッド (計算機科学)|メソッド]])をひとまとめにすること、またそれらに対して外部からのアクセスを制御・限定すること<ref>[http://e-words.jp/w/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96.html カプセル化とは - IT用語辞典]</ref>。
#''Objects have their own memory (in terms of objects).''
: アクセス権限(可視性)の種別はプログラミング言語によって異なる<ref>C++ではどのコード領域からもアクセス可能な''public''、自クラスと派生クラスからのみアクセス可能な''protected''、自クラス内でのみアクセス可能な''private''、の三種を規定しており、C++の派生言語では類似の{{仮リンク|アクセス修飾子|en|Access modifiers}}をサポートしていることが多い。</ref>。
#''Every object is an instance of a class (which must be an object).''
#''The class holds the shared behavior for its instances (in the form of objects in a program list).''
#''To eval a program list, control is passed to the first object and the remainder is treated as its message.''


これをやや意訳するとこうなる。
* [[継承 (プログラミング)|継承]] (inheritance)
# すべてはオブジェクトである。
: {{要出典範囲|date=2019年2月|派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る方式(部品→全体)と、オブジェクトを複数の階層に分解して他オブジェクトと共有できる階層を派生元にする方式(全体→部品)の二通りの考え方がある}}。継承によりデータ構造およびコードの再利用と拡張を可能にする。
# オブジェクトはメッセージの送受信によって相互作用する。
: クラスベースのオブジェクト指向では、派生元オブジェクトのデータ型はスーパークラスあるいは基底クラスなど、派生先オブジェクトのデータ型はサブクラスあるいは派生クラスなどと呼ばれる。派生クラスのインスタンスはまた基底クラスのインスタンスとしても扱えるようになる([[リスコフの置換原則]])。継承により、後述の多態性を実現することができるようになる。
# オブジェクトは自身の記憶領域(データ)を持つ。
# どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
# クラスはその全インスタンスの為の共有動作(メソッド)を持つ。インスタンスはプログラムにおけるオブジェクトの形態である。
# プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。


'''(1)'''はプログラム内のあらゆる要素をオブジェクトとして扱う事を示している。従来の変数や文字列や構造体だけに留まらず、数値(プリミティブ)や真偽値(ブーリアン)や演算子(オペレータ)、更には手続き(コードブロック)や制御文(コントロールフロー)やクラス構造情報(メタデータ)までもオブジェクトにした点が一線を画していた。これがオブジェクト指向と名付けられた由縁である。
* [[多態性]] (polymorphism)
: 任意のメソッドの呼び出し時に、メソッドが属する実際のオブジェクトの種類(クラス)によって呼び出し先の実装コードが選択され、処理内容が変化する性質。
: 通例、実行時の型(動的な型)に応じて呼び出されるコードが決定される「動的な多態性」のことを指す<ref>C++では同じ[[シグネチャ]]を持つ仮想関数(仮想メソッド)の[[オーバーライド]]により動的な多態性を利用できるが、内部的には通例[[仮想関数テーブル]]による動的ディスパッチを用いて実現されている。仮想メソッドのオーバーライドでは1変数に関する動的ディスパッチしかできないが、2変数以上に関する動的ディスパッチ([[多重ディスパッチ]])の仕組みをサポートする言語もある。</ref>。
: [[静的型付け]]言語において、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが選択される[[多重定義]](オーバーロード)<ref>[[被演算子]]を演算子関数の引数とみなし、ユーザー定義の演算子オーバーロードをサポートする言語もある。言語組み込みの演算子も被演算子の型に応じてコードが変化するため、これも演算子オーバーロードの一種である。</ref>や、[[ジェネリックプログラミング]]において、型引数に応じて生成されるコードが変化する{{仮リンク|パラメータ多相|en|Parametric polymorphism}}なども多態性の一種と見なされる。これらは「静的な多態性」に分類され、実行時ではなくコンパイル時に動作が決まる。


'''(2)'''のメッセージ送受信とは元々は、[[LISP]]が採用していた[[高階関数]]の仕組みを[[参照透過性]]と相反する観点から独自に拡張させたものであり、この視点の下では変換式に独自の記憶を持たせたものがオブジェクトとなった。オブジェクトを[[第一級関数]]と同様に入力値にも出力値にも出来る事がメッセージングに必須の枠組みである。オブジェクト指向の下では数式もメッセージングとなった。「3+5」は3というオブジェクトに+と5というメッセージが送られて8の結果値が返るといった具合である。+の演算子と5の引数値もオブジェクトであり、8の結果値もオブジェクトなので、それにまたメッセージを送る事も出来た。コードブロックもまたオブジェクトであり同時にメッセージにも出来たので、比較式オブジェクトが返す真偽値に対して特殊な予約語オブジェクトとコードブロックを併せて送る事で条件分岐や反復といった制御構文を表現する事も出来た。数値に対してコードブロックを送ると回数反復となった。オブジェクトを次々と引き合わせる(''communication'')のは順次処理となった。従来のプログラムリストで広く使われていた[[フローチャート]]が別の視点から眺められて、その図表上にある数値や記号や変数および順次や分岐や反復のフローといったあらゆる要素がオブジェクトとして分解され、オブジェクトにオブジェクトを引き合わせて双方に関連した処理を行わせるという全く新しいフローがメッセージと名付けられた。
なお、ビャーネ・ストロヴストルップ自身は、広義の「オブジェクト指向」として、以下に列挙する要素をプログラミング言語または技法が直接的にサポートすることを要件として提案している<ref>{{Cite web|url=http://www.stroustrup.com/oopsla.pdf|title=Why C++ is not just an Object-Oriented Programming Language|author|Bjarne Stroustrup|accessdate=2019-02-21}}</ref>。これにはC++、Simula、Smalltalkなど多くの言語が含まれることになるが、[[C言語]]や[[Fortran]] 4、[[Pascal]]といった古典的な言語は除外される。


'''(3)'''と'''(5)'''によってオブジェクトとは、データとメソッドの複合体である事が示されている。これは[[Simula|Simula 67]]のオブジェクト概念を踏襲している。'''(4)'''によってオブジェクトの実装は、クラスという定義情報とそれを実メモリに展開したインスタンスで為される事が示されている。これもSimula 67の特徴に準じているが、更にクラスもオブジェクトとする事でいわゆるメタデータの扱いにも言及している。'''(6)'''の''eval''(''evaluate'')とはソフトウェア工学では演算して結果値を出す意味の言葉であり、プログラムは任意のオブジェクトから開始され、後はメッセージによるオブジェクト間の相互作用で処理が実行される事を示している。プロセスが各オブジェクトを扱うのではなく、イメージ的にオブジェクトの振る舞い及びその振る舞いのトリガーになるオブジェクト同士の引き合わせ(''communication'')を意味するメッセージングがそのままプロセスとなる事を強調していた。
# 抽象化 (abstraction)
# 継承 (inheritance)
# 実行時の多態性 (run-time polymorphism)


なおこれは同時に要点でもあるが、アラン・ケイが最初に示したのは(1)から(3)までであり、(4)から(6)は実際のコーディングスタイルを掴ませる為にあえて付け加えられたものだった。つまり、オブジェクト指向の要約は(1)から(3)までで事足りるという。これについても後述する。
=== オブジェクト指向とメッセージング ===
オブジェクト指向プログラミングは、歴史的に[[Simula]]のオブジェクトおよびクラスの概念を発端とするが、Simulaの理念を直接的に受け継いだ[[C++]]系統と、1970年代から研究開発が進められていた[[メッセージ (コンピュータ)|メッセージ・パッシング]]の仕組みを主体とする[[Smalltalk]]系統に大別されており、理想的なオブジェクト指向本来の形態を正しく表現しているのは後者のSmalltalk系統のほうだと評されていた。しかし、20世紀後半当時の計算機資源([[CPU]]処理能力やメモリ容量など)の問題や、理論より実務上の利便性を重視する開発現場の事情から、より簡便な設計および少ないリソース下でもオブジェクト指向プログラミングのための機能を「クラス機構」を活かして実現できるC++系統のほうが主流となった。


=== 解説 ===
[[Smalltalk]]系統のオブジェクト指向の主要概念である'''[[メッセージパッシング]]''' (message passing) は、従来のサブルーチンコールの形態を変えたものであり、基本はバイトデータの送受信でメソッド名とパラメータ値およびリターン値をやり取りするという仕組みだった。このバイトデータの羅列が「[[メッセージ (コンピュータ)|メッセージ]]」と呼ばれ、大抵は先頭の伝言名と後続の引数名&引数値の配列で構成された。オブジェクトのレシーバー関数が引数として渡されたメッセージを読み込み、オブジェクト内部でそれに準じた処理を行い、結果をリターンした。レシーバーの仕組みは結果的に「[[カプセル化]]」を実現できた。オブジェクト内部での自由自在な処理実装によるリターンはこれも結果的に「[[多態性]]」を実現できた。この多態性が示す[[多重ディスパッチ]]ないし動的ディスパッチを円滑に実装するために、クラス構造定義を自由に操作できる「[[リフレクション (情報工学)|リフレクション]]」の機能が備えられた。
オブジェクト指向を提唱する中で[[アラン・ケイ]]は[[LISP]]の影響を受けた事を言及しているが、具体的に参考とされたのは、''lambda''のキーワードで表現される[[高階関数]]の仕組みと、''atomと定義される''データ表現であったという<ref name="EarlyHistoryOfSmalltalk" />。なお、他方では[[Simula|Simula 67]]の言語仕様を始めて見た際に「あれは''object-oriented''だな!」と語ったというエピソードも紹介されており、[[Smalltalk]]公開当時のケイは何か含む所があって[[Simula|Simula 67]]に対する言及を恐らく意図的に避けていたが、現実的にはLISPの''atom''とSimula 67の''object''&''class''の双方を参考にしてデータ(変数またはプロパティ)とコード(関数またはメソッド)の複合体であるオブジェクトというプログラム概念を考案したと見るのが衆目の一致する所となっている。80年代に入り[[C++]]が公開されると、Simula 67にも言及するようになった代わりに今度はC++をオブジェクト指向の観点から語ろうとはしなかったが、その言語仕様に内包される[[抽象化 (計算機科学)|抽象化]]のプログラミング概念については度々触れていた。


ケイが
Smalltalkの構想は以下の6つのアイディアに体系化されている<ref name="EarlyHistoryOfSmalltalk"/>。

# すべてはオブジェクトである。
# オブジェクトはメッセージの送受信によって通信する。
# オブジェクトは自身の記憶領域 (memory) を持つ。
# すべてのオブジェクトはクラスのインスタンスである。
# クラスはそのインスタンス群のための共有された振る舞い (behavior) を持つ。
# プログラムリストを評価するために、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。

上記(6)はLISP風の普遍構文 (universal syntax) を暗示している。

この[[オブジェクト (プログラミング)|オブジェクト]]を中心にしてシステムを組み立てていく考え方がSmalltalkのオブジェクト指向である。

なお、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]]に見られる「クラス機構」と継承をベースにした同様の機能の実現はトリッキーと言えた。しかし、実際には「クラス機構」重視の、言わば亜流のほうがオブジェクト指向の主流となってしまった。アラン・ケイは「自分自身もSmalltalkの大ファンではない。とはいえ、今日のたいていのプログラミングシステムに比べれば好ましいものだが。」とも述べている。


==脚注==
==脚注==
81行目: 54行目:


==関連項目==
==関連項目==
*[[構造化プログラミング]]
*[[アスペクト指向]]
*[[エージェント指向]]
*[[ソフトウェア工学]]
*[[ソフトウェア工学]]
*[[デザインパターン (ソフトウェア)]]
*[[:Category:オブジェクト指向言語]]
*[[オブジェクト指向プログラミング]]
*[[オブジェクトデータベース]]
*[[オブジェクト関係データベース]]
*[[オブジェクト関係データベース]]
*[[オブジェクト指向モデリング]]
*[[オブジェクト関係マッピング]]
*[[オブジェクト指向分析設計]]
*[[NEXTSTEP]] - オブジェクト指向オペレーティングシステム
**[[オブジェクトモデル化技法]]
*[[オブジェクトモデル化技法]]
*[[Booch法|ブーチメソッド]]
**[[統一モデリング言語|UML(統一モデリング言語)]]
**[[Booch法|ブーチメソッド]]
**[[CRCカード]]
*[[オブジェクト指向ソフトウェア工学]]
*[[オブジェクト指向ソフトウェア工学]]
*[[統一モデリング言語|UML(統一モデリング言語)]]
*[[NEXTSTEP]] - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。
*[[CRCカード]]
*[[Cocoa]] - NEXTSTEPの後身のフレームワーク。
*[[アクターモデル]]
*[[アスペクト指向]]
*[[エージェント指向]]


==外部リンク==
==外部リンク==

2019年6月13日 (木) 18:53時点における版

オブジェクト指向(オブジェクトしこう、: object-oriented)は、ソフトウェア工学理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。元々は特定のプログラミング・パラダイムを説明する為に考案された言葉だった。object-oriented programmingのように修飾語として用いられるのが常であり、それ単体で扱われる事はない漠然とした設計構想でもある。

オブジェクト指向の成り立ち

オブジェクト指向(object-oriented)という言葉自体は、1972年から80年にかけてプログラミング言語「Smalltalk」を公開した計算機科学者アラン・ケイが、その言語設計を説明する中で初めて生み出されている[1]。そこから遡って1967年に公開されていた「Simula 67」のクラスオブジェクトの設計もオブジェクト指向の発端と見なされるようになった[2]。データとコードの複合体であるオブジェクト(object)という用語を確立したのはSimula 67であったが[3]、その設計は手続き型プログラミングの機能拡張に近いものである。アラン・ケイ自身は「LISP」の影響を受けた事を強調しており[1]、実際にクラスの仕組みを除いたSmalltalkのオブジェクト指向設計は完全に別物であった。1958年に公開されていたLISPMIT人工知能(AI)研究と深い関わりを持っていた。その後、計算機科学者ビャーネ・ストロヴストルップが1983年に公開した「C++」が契機となって、オブジェクト指向に関連する様々な考え方が再定義されている。C++の設計はSimula 67の方をモデルにしていた。

上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代からデータベースOSの開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。

オブジェクト指向の分野

オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系である。そのデータ(変数またはプロパティ)とコード(関数またはメソッド)のセットを基本要素にして物事を解析する考え方が、1980年代から大きく注目され始めた事で、ソフトウェア工学のあらゆる局面にobject-orientedを接頭辞にした分野が立ち上げられた。大まかな特徴としては、情報資源と処理手順を別々にして分析ないし設計を行っていた従来の標準的な手法に対し、オブジェクト指向と名が付く分野ではこの双方をひとまとめにして物事の解析と組み立てを行う点が共通している。

他にも、オブジェクト指向オペレーティングシステム、オブジェクト関係データベースオブジェクト関係マッピングオブジェクト指向ソフトウェア工学、オブジェクト指向ユーザーインターフェース、オブジェクト指向プロジェクト管理、ブーチメソッドオブジェクトモデル化技法など数々の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、一つの分野として特筆される事は少ない。

オブジェクト指向とは

概要

オブジェクト指向(object-oriented)の言葉を生み出した計算機科学者アラン・ケイは、1970年代に発表した文書の中でその設計構想を六つの要約で説明している[1]

  1. EverythingIsAnObject.
  2. Objects communicate by sending and receiving messages (in terms of objects).
  3. Objects have their own memory (in terms of objects).
  4. Every object is an instance of a class (which must be an object).
  5. The class holds the shared behavior for its instances (in the form of objects in a program list).
  6. To eval a program list, control is passed to the first object and the remainder is treated as its message.

これをやや意訳するとこうなる。

  1. すべてはオブジェクトである。
  2. オブジェクトはメッセージの送受信によって相互作用する。
  3. オブジェクトは自身の記憶領域(データ)を持つ。
  4. どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
  5. クラスはその全インスタンスの為の共有動作(メソッド)を持つ。インスタンスはプログラムにおけるオブジェクトの形態である。
  6. プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。

(1)はプログラム内のあらゆる要素をオブジェクトとして扱う事を示している。従来の変数や文字列や構造体だけに留まらず、数値(プリミティブ)や真偽値(ブーリアン)や演算子(オペレータ)、更には手続き(コードブロック)や制御文(コントロールフロー)やクラス構造情報(メタデータ)までもオブジェクトにした点が一線を画していた。これがオブジェクト指向と名付けられた由縁である。

(2)のメッセージ送受信とは元々は、LISPが採用していた高階関数の仕組みを参照透過性と相反する観点から独自に拡張させたものであり、この視点の下では変換式に独自の記憶を持たせたものがオブジェクトとなった。オブジェクトを第一級関数と同様に入力値にも出力値にも出来る事がメッセージングに必須の枠組みである。オブジェクト指向の下では数式もメッセージングとなった。「3+5」は3というオブジェクトに+と5というメッセージが送られて8の結果値が返るといった具合である。+の演算子と5の引数値もオブジェクトであり、8の結果値もオブジェクトなので、それにまたメッセージを送る事も出来た。コードブロックもまたオブジェクトであり同時にメッセージにも出来たので、比較式オブジェクトが返す真偽値に対して特殊な予約語オブジェクトとコードブロックを併せて送る事で条件分岐や反復といった制御構文を表現する事も出来た。数値に対してコードブロックを送ると回数反復となった。オブジェクトを次々と引き合わせる(communication)のは順次処理となった。従来のプログラムリストで広く使われていたフローチャートが別の視点から眺められて、その図表上にある数値や記号や変数および順次や分岐や反復のフローといったあらゆる要素がオブジェクトとして分解され、オブジェクトにオブジェクトを引き合わせて双方に関連した処理を行わせるという全く新しいフローがメッセージと名付けられた。

(3)(5)によってオブジェクトとは、データとメソッドの複合体である事が示されている。これはSimula 67のオブジェクト概念を踏襲している。(4)によってオブジェクトの実装は、クラスという定義情報とそれを実メモリに展開したインスタンスで為される事が示されている。これもSimula 67の特徴に準じているが、更にクラスもオブジェクトとする事でいわゆるメタデータの扱いにも言及している。(6)evalevaluate)とはソフトウェア工学では演算して結果値を出す意味の言葉であり、プログラムは任意のオブジェクトから開始され、後はメッセージによるオブジェクト間の相互作用で処理が実行される事を示している。プロセスが各オブジェクトを扱うのではなく、イメージ的にオブジェクトの振る舞い及びその振る舞いのトリガーになるオブジェクト同士の引き合わせ(communication)を意味するメッセージングがそのままプロセスとなる事を強調していた。

なおこれは同時に要点でもあるが、アラン・ケイが最初に示したのは(1)から(3)までであり、(4)から(6)は実際のコーディングスタイルを掴ませる為にあえて付け加えられたものだった。つまり、オブジェクト指向の要約は(1)から(3)までで事足りるという。これについても後述する。

解説

オブジェクト指向を提唱する中でアラン・ケイLISPの影響を受けた事を言及しているが、具体的に参考とされたのは、lambdaのキーワードで表現される高階関数の仕組みと、atomと定義されるデータ表現であったという[1]。なお、他方ではSimula 67の言語仕様を始めて見た際に「あれはobject-orientedだな!」と語ったというエピソードも紹介されており、Smalltalk公開当時のケイは何か含む所があってSimula 67に対する言及を恐らく意図的に避けていたが、現実的にはLISPのatomとSimula 67のobjectclassの双方を参考にしてデータ(変数またはプロパティ)とコード(関数またはメソッド)の複合体であるオブジェクトというプログラム概念を考案したと見るのが衆目の一致する所となっている。80年代に入りC++が公開されると、Simula 67にも言及するようになった代わりに今度はC++をオブジェクト指向の観点から語ろうとはしなかったが、その言語仕様に内包される抽象化のプログラミング概念については度々触れていた。

ケイが

脚注

  1. ^ a b c d Alan C. Kay. “The Early History Of Smalltalk”. 2019年2月21日閲覧。
  2. ^ How Object-Oriented Programming Started
  3. ^ Jonathan Aldrich and Charlie Garrod (2014年). “OO History: Simula and Smalltalk”. 2019年2月2日閲覧。

関連項目

外部リンク