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

削除された内容 追加された内容
編集の要約なし
編集の要約なし
(4人の利用者による、間の73版が非表示)
1行目:
{{複数の問題
'''オブジェクト指向'''(オブジェクトしこう)とは、[[オブジェクト (プログラミング)|オブジェクト]]同士の相互作用として、システムの振る舞いをとらえる考え方である。英語の {{lang|en|object-oriented}} (直訳は、「対象物志向の」「目的重視の」という意味の形容詞) の日本語訳である。
|独自研究=2019年2月
|正確性=2019年2月
|出典の明記=2019年2月
}}
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|''object-oriented''}})は、[[ソフトウェア工学]]理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。元々は特定の[[プログラミングパラダイム|プログラミング・パラダイム]]を説明する為に考案された言葉だった。''object-oriented programming''のように修飾語として用いられるのが常であり、それ単体で扱われる事はない漠然とした設計構想でもある。{{main|オブジェクト指向プログラミング}}
 
== オブジェクト指向の方式成り立ち ==
オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。複雑なシステム記述、巨大な[[ライブラリ]](特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、オブジェクト指向の考え方は必須である。
オブジェクト指向(''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-01}}</ref>。他のエピソードによると、1967年に公開された「[[Simula|Simula 67]]」を当時大学院生だったケイが知った際に、''object-oriented''という咄嗟の造語で評論したのが発端だという。なお、Simula 67に結び付けられたオブジェクト指向と、後にケイ自身が開発するSmalltalkの理念とされたオブジェクト指向の性格は全く異なるものであったが、いずれにせよ[[クラス (コンピュータ)|クラス]]と[[オブジェクト (プログラミング)|オブジェクト]]の設計を備えたSimula 67もオブジェクト指向の草分けと見なされるようになった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。データとコードの複合体であるオブジェクト(''object'')という用語を確立したのは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-01}}</ref>、その設計は[[手続き型プログラミング]]の機能拡張に近いものである。ケイ自身は「[[LISP]]」の影響の方を強調しており<ref name="EarlyHistoryOfSmalltalk" />、実際に彼がSmalltalkで示したオブジェクト指向設計は全くの別物であった。その後、計算機科学者[[ビャーネ・ストロヴストルップ]]が1983年に公開した「[[C++]]」が契機となって、オブジェクト指向に関連する様々な考え方が再定義されている。C++の設計はSimula 67の方をモデルにしていた。
 
上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代から[[データベース]]と[[オペレーティングシステム|OS]]の開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。
==パラダイムとしてのオブジェクト指向==
 
*[[==オブジェクト指向モデリング]]の分野==
オブジェクト指向分析が提唱される以前には、システム分析のレベルにおいては、[[データ構造]]を中心としたシステムの分析技法である[[構造化技法]]が存在した。
 
==* [[オブジェクト指向プログラミングの構成要件==]] (1970年代から)
また、[[プログラミング (コンピュータ)|プログラミング]]のレベル ([[プログラミングパラダイム]]) では、[[プログラム (コンピュータ)|プログラム]]の実行の流れを決められた[[制御構造]]の組み合わせとして書き下す[[構造化プログラミング]]や、[[カプセル化]]を促す[[モジュールプログラミング]]、多態に対応する[[データ指向プログラミング]]という技法が存在していた。オブジェクト指向手法はそれらを一般化しさらに推し進めたものであるという考え方がある。
* [[オブジェクトデータベース]] (1980年代から)
* [[:Category:オブジェクト指向言語分析設計]] (1990年代から)
{{Main|* [[オブジェクト指向プログラミモデリング}}]] (1990年代から)
 
オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系である。そのデータ(変数またはプロパティ)とコード(関数またはメソッド)のセットを基本要素にして物事を解析する考え方が、1980年代から大きく注目され始めた事で、ソフトウェア工学のあらゆる局面に''object-oriented''を接頭辞にした分野が立ち上げられた。大まかな特徴としては、情報資源と処理手順を別々にして分析ないし設計を行っていた従来の標準的な手法に対し、オブジェクト指向と名が付く分野ではこの双方をひとまとめにして物事の解析と組み立てを行う点が共通している。
==オブジェクト指向プログラミングの構成要件==
{{Main|オブジェクト指向プログラミング}}
オブジェクト指向プログラミングを構成する概念は次のようなものである。
 
他にも、オブジェクト指向オペレーティングシステム、[[オブジェクト関係データベース]]、[[オブジェクト関係マッピング]]、[[オブジェクト指向ソフトウェア工学]]、オブジェクト指向ユーザーインターフェース、オブジェクト指向プロジェクト管理、[[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法]]など数々の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、一つの分野として特筆される事は少ない。
;[[カプセル化]] (情報隠蔽)
:[[オブジェクト (プログラミング)|オブジェクト]]の振る舞いを隠蔽したり、オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの実際の型を隠蔽したりすることをいう。これは古典的な可視性の定義である。
 
==パラダイムとしてのオブジェクト指向とは==
また、オブジェクト指向プログラミングの概念拡大に伴い、必須と表現するのが不適切になりつつあるが、旧来の多くのオブジェクト指向言語が備えている性質には以下のものがある。
 
=== コンセプト ===
;[[ポリモーフィズム]] (多態性)
オブジェクト指向(''object-oriented'')の言葉を生み出した計算機科学者[[アラン・ケイ]]は、1970年代に発表した文書の中でその設計構想を六つの要約で説明している<ref name="EarlyHistoryOfSmalltalk" />。{{Quotation|1, ''EverythingIsAnObject.
:あるオブジェクトへの操作が呼び出し側ではなく、受け手のオブジェクトによって定まる特性。[[クラスベース]]のオブジェクト指向の場合には、派生クラスの複数分岐として多態性を実現する。 [[プロトタイプベース]]のオブジェクト指向の場合では関係がない概念とされる。
 
2, ''Objects communicate by sending and receiving messages (in terms of objects).
==オブジェクト指向の方式==
*[[クラスベース]]方式 &mdash; [[クラス (コンピュータ)|クラス]]を定義し、それを元に[[インスタンス]]を生成する方式である。'''継承ベース'''ともいう。
*[[プロトタイプベース]]方式 &mdash; 既存の[[インスタンス]]を元に、新たな[[インスタンス]]を生成する方式である。'''インスタンスベース'''ともいう。
*[[ミックスイン|Mixin]]方式 &mdash; さまざまなオブジェクトの原型を組み合わせて一つのオブジェクトを構成する方式である。
 
3, ''Objects have their own memory (in terms of objects).
==オブジェクト指向の名称とメッセージング==
[[Eclipse (統合開発環境)|Eclipse]]を開発したDave Thomasや、オブジェクト指向という言葉の生みの親であるAlan Kay博士は、オブジェクト指向という言葉は失敗だったと語っている。<ref>http://www.infoq.com/jp/news/2010/07/objects-smalltalk-erlang</ref>
これは、本来オブジェクト指向が重視すべきは'''「オブジェクト」'''ではなく'''「メッセージング」'''であるにもかかわらず'''「メッセージング」'''がおろそかにされているためである。特に言語の進歩において「オブジェクト」や「クラス」の側面ばかり強調される傾向にあり、Alan Kay博士は「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」と述べている。
 
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.|Alan Kay}}以下はその和訳である。
 
# すべてはオブジェクトである。
# オブジェクトはメッセージの受け答えによってコミュニケーションする。
==# オブジェクト指向は自身名称とッセモリジング==を持つ。
# どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
# クラスはその全インスタンスの為の共有動作を持つ。インスタンスはプログラムにおけるオブジェクトの形態である。
# プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
 
また、2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷のプログラミングで言われる「カプセル化、継承、多態性」を意識した上でこのように答えている。{{Quotation|''OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.''
 
(僕にとってのオブジェクト指向とは、メッセージング、ローカルな記憶保持と保護と実行状態の隠蔽、徹底的な遅延バインディング、これに尽きる)|Alan Kay}}オブジェクト指向を提唱する中でケイは「[[LISP]]」の影響を受けた事を言及しているが、具体的に参考とされたのは、''lambda''のキーワードで表現される[[高階関数]]の仕組みと、''atomと定義される''データ表現であったという<ref name="EarlyHistoryOfSmalltalk" />。それらに加えて、初期に発表された六つの要約と、後にケイが明かした三つのコンセプトを踏まえた上でオブジェクト指向を読み解いていく。
 
=== その解釈 ===
==脚注==
{{Reflist}}
<references/>
 
==関連項目==
*[[オブジェクト指向モデリング]]
*[[構造化プログラミング]]
*[[データ指向]]
*[[エージェント指向]]
*[[アスペクト指向]]
*[[ソフトウェア工学]]
*[[デザインパターン (ソフトウェア)]]
*[[統一モデリング言語|UML]]
*[[オブジェクトデータベース]]
*[[オブジェクト関係データベース]]
*[[オブジェクト指向プログラミ関係マッピング]]
*[[オブジェクト指向分析設計NEXTSTEP]] (- オブジェクト指向開発方法論)オペレーティングシステム
**[[オブジェクトモデル化技法]] (OMT)
**[[Booch法|ブーチメソッド]]
**[[オブジェクト指向ソフトウェア工学]] (OOSE/Objectory)
*[[統一モデリング言語|UMLUML(統一モデリング言語)]]
*[[:Category:オブジェクト指向言語]]
*[[NEXTSTEP]] - オブジェクト指向OSとしてその先進性をアピール。後続OSや開発環境に大きな影響を与えた。
*[[Cocoa]] - NEXTSTEPの後身のフレームワーク。
*[[統合開発環境]]
*[[コンテンツ管理システム]]
*[[CRCカード]]
*[[アクターモデル]]
*[[組合せ爆発]]
*[[エージェンアスペクト指向]]
*[[ジェント指向]]
 
==外部リンク==