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

削除された内容 追加された内容
m →‎コンセプト: い抜き言葉「やってる」「してる」の使用を回避
(同じ利用者による、間の15版が非表示)
1行目:
|{{独自研究|date=2019年2月}}
{{複数の問題
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|''object-oriented''}})は、[[ソフトウェア開発]]設計と[[プログラム (コンピュータ)|プログラミング]]記述ために用いられる考え方である。元々は特定の[[プログラミングパラダイム|プログラミング・パラダイム]]を説明するために考案された言葉だった。''object-oriented programming''のように修飾明確な用語として用いられるは1970年代に誕生し、1980年代前半に知名度を得て、考案者が常手を離れた自由あり曖昧な定義のまま発展を続けた後にそれ単体で扱わ1990年代に入ると[[ソフトウェア工学]]の様々な分野にも応用される事はようにい漠然とし設計構想で。[[ソフトウェア開発]]における一つの標語のような扱い方されている。{{main|オブジェクト指向プログラミング}}
|独自研究=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|publisher=}}</ref>。また本人の述懐によると、大学院時代のケイが1967年公開のプログラミング言語「[[Simula|Simula67]]」に感化されて日夜プログラミング・アーキテクチャの思索に耽っていた1967年頃、今何をしているのかと尋ねてきた知人に対して「''object-oriented programming''だよ」と咄嗟の造語で答えたのが発端だという。なお、Simula67に結び付けられたオブジェクト指向と、後にケイ自身がSmalltalkを開発する中で提唱したオブジェクト指向と、1980年頃からSimulaに結び付けられるようになったタームとしてのオブジェクト指向の性格は全く異なるものであったが、結果的に[[オブジェクト (プログラミング)|オブジェクト]]というプログラム概念が注目を集めた事で、そのルーツである[[クラス (コンピュータ)|クラス]]と[[オブジェクト (プログラミング)|オブジェクト]]の設計を備えたSimula67Simulaもオブジェクト指向の草分けと見なされるようになった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。データとコードの複合体であるオブジェクト(''object'')という用語を確立したのはSimula67Simulaであったが、その設計は[[手続き型プログラミング]]の機能拡張に近いものであり<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|publisher=}}</ref>、Smalltalk設計方では[[手続き関数型プログラミング]]の機能拡張に近先例と見なされてものであ。ケイ自身は「[[LISP]]」の影響の方強調されおりいた<ref name="EarlyHistoryOfSmalltalk" />、実際に彼がSmalltalkで示したオブジェクト指向は全くの別物であった。その後、計算機科学者[[ビャーネ・ストロヴストルップ]]が1983年に公開した「[[C++]]」が契機になってオブジェクト指向に関連する様々な考え方が再定義されている。C++の設計Simula67Simulaの方をモデルにしていた。
 
1986年から[[Association for Computing Machinery|ACM]]が[[OOPSLA]](オブジェクト指向会議)を年度開催するようになり、オブジェクト指向は[[コンピュータサイエンス]]の一つのムーブメントになった。[[OOPSLA]]初期のチェアパーソンは、[[Smalltalk]]が生まれた[[ゼロックス|ゼロックス社]][[パロアルト研究所]]のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語と[[グラフィカルユーザインタフェース|GUI]]運用環境を合わせた[[フレームワーク]]であり、[[Alto|ゼロックスAlto]]機上の[[ミドルウェア]]として開発されていた。Smalltalkは70年代の[[アラン・ケイ]]が構想していた[[ダイナブック]]のための[[グラフィカルユーザインタフェース|GUI]]環境でもあった。[[ダイナブック]]はパーソナルコンピュータの原型に位置付けられているものである。[[Alto]]は[[GUI]]を初めて汎用的にサポートしたコンピュータと[[オペレーティングシステム|OS]]であり、かの[[スティーブ・ジョブズ|スティーブ・ジョブス]]を啓発して[[Macintosh]]のモデルになったことはよく知られている。こうした背景からオブジェクト指向は、上述のプログラミング云々よりも、[[グラフィカルユーザインタフェース|GUI]](グラフィカル・ユーザー・インターフェース)を始めにした当時の先進的な[[ソフトウェア設計|ソフトウェアデザイン]]と[[ソフトウェアアーキテクチャ]]のための開拓的なモデル理論として受け止められる方が好まれた。[[デザインパターン (ソフトウェア)|デザインパターン]]、[[リファクタリング (プログラミング)|リファクタリング]]、[[モデル駆動工学]]、[[ドメインモデル]]、[[ドメイン固有言語]]、[[アジャイルソフトウェア開発]]といった数々のトピックが[[OOPSLA]]から生まれている。具体的に応用された最初の例は[[データベース]]開発と[[NEXTSTEP|NeXTSTEP]]などの[[オペレーティングシステム]]開発であった。
上述の様にオブジェクト指向とは元々[[プログラミング・パラダイム]]として編み出された理論であったが、1980年代から[[データベース]]と[[オペレーティングシステム|OS]]の開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。
 
1989年には[[IBM|IBM社]]、[[アップル (企業)|アップル社]]、[[ヒューレット・パッカード|ヒューレットパッカード社]]、[[サンマイクロシステムズ|サンマイクロシステムズ社]]、[[アメリカン航空]]などの11社がコンピュータ産業共同事業団体[[Object Management Group|OMG]](Object Management Group)を設立した。OMGの目的は、企業システムネットワークの基盤になる[[分散コンピューティング]]を構築するための基礎要素になる分散オブジェクト設計の標準化を図ることであった。ここでのオブジェクトもデータとメソッド(=コード)の組み合わせと定義されていたので、この業務用システムないしネットワークの構築を目的にした技術アーキテクチャも人々の共通認識としてオブジェクト指向にそのまま包括された。1991年に分散オブジェクトの規格パラダイムとなる[[CORBA]]が公開された。また1997年に[[Object Management Group|OMG]]が策定した[[統一モデリング言語|UML]]は[[オブジェクト指向ソフトウェア工学]]に準拠したものとして発表されている。
 
==オブジェクト指向の分野==
オブジェクト指向は[[プログラミングパラダイム]]として誕生した理論である。そのデータ([[変数 (プログラミング)|変数]]またはプロパティ)とコード([[関数 (プログラミング)|関数]]またはメソッド)のセットを基本要素にして物事を解析する考え方が1980年代から大きく注目され始めたことで、[[ソフトウェア工学開発]]あらゆる様々な局面に''object-oriented''を接頭辞にした分野が立ち上げられた。大まかな特徴としては情報資源と処理手順を別々にして分析ないし設計を行っていた従来の標準的な手法に対し、オブジェクト指向と名が付く分野ではこの双方をひとまとめにして物事の解析と組み立てを行う点が共通している。
 
* [[オブジェクト指向プログラミング]] (- 1970年代から)
* [[オブジェクトデータベース]] (- 1980年代から)
* [[{{仮リンク|オブジェクト指向分析設計]]オペレーティングシステム|en|Object-oriented operating system|label=}} - (19901980年代から)
* [[{{仮リンク|オブジェクト指向モデリユーザーイグ]]ターフェース|en|Object-oriented user interface|label=}} - (1990年から)
* [[Common Object Request Broker Architecture|CORBA]] - 1991年から
 
* [[オブジェクト関係データベース]] - 1990年代から
オブジェクト指向は、プログラミング・パラダイムとして誕生した理論である。そのデータ(変数またはプロパティ)とコード(関数またはメソッド)のセットを基本要素にして物事を解析する考え方が、1980年代から大きく注目され始めた事で、ソフトウェア工学のあらゆる局面に''object-oriented''を接頭辞にした分野が立ち上げられた。大まかな特徴としては、情報資源と処理手順を別々にして分析ないし設計を行っていた従来の標準的な手法に対し、オブジェクト指向と名が付く分野ではこの双方をひとまとめにして物事の解析と組み立てを行う点が共通している。
* [[オブジェクト指向分析設計]] - 1990年代から ←({{仮リンク|オブジェクト指向デザイン|en|Object-oriented design|label=オブジェクト指向設計}})
 
* [[オブジェクト関係マッピ指向モデリング]] - 1990年代から
上記の他にも以下のような数々の分野が存在する。
* [[オブジェクト指向ソフトウェア工学]] - 1990年代から
 
* [[統一モデリング言語]](UML) - 1997年から ←([[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法]])
* {{仮リンク|オブジェクト指向オペレマネティジメグシステム|en|Object-oriented operating systemManagement|label=}} - 2000年代から
* [[オブジェクト関係データベース]]
* [[{{仮リンク|オブジェクト関係マッピング]]指向存在論|en|Object-oriented ontology}} - 哲学分野
* {{仮リンク|オブジェクト指向ユーザーインターフェース|en|Object-oriented user interface|label=}}
* [[Booch法|ブーチメソッド]]
* [[オブジェクトモデル化技法]]
* [[オブジェクト指向ソフトウェア工学]]
* {{仮リンク|オブジェクト指向マネージメント|en|Object-oriented Management|label=}}
 
==オブジェクト指向とは==
 
=== コンセプト ===
1970年代に[[パロアルト研究所]]で誕生し、1981年頃から知名度を得るようになったオブジェクト指向(''object-oriented'')は同時に発案者である[[アラン・ケイ]]の手を離れて[[プログラミングパラダイム]]から[[ソフトウエア工学知識体系|ソフトウェア工学]]分野へと認識拡大し、1986年以降は[[Association for Computing Machinery|ACM]](計算機学会)開催の[[OOPSLA]](オブジェクト指向会議)が中心的な担い手の役割を果たしていた。70年代から80年代前半にかけてのオブジェクト指向は[[Smalltalk]]言語仕様の一環としてそれに当たることで一定の理解を得られたが、80年代後半以降は事情が異なっている。
オブジェクト指向(''object-oriented'')の言葉を生み出した計算機科学者[[アラン・ケイ]]は、1970年代に発表した文書の中でその設計構想を六つの要約で説明している<ref name="EarlyHistoryOfSmalltalk" />。{{Quotation|1, ''EverythingIsAnObject.
 
==== 1989年頃 ====
1989年に上梓されたUser Interface A Personal Viewという記事の中でアラン・ケイは、Smalltalkのオブジェクト指向性は大変示唆的であると前置きした上でこう述べている<ref>{{Cite web|url=http://worrydream.com/refs/Kay%20-%20User%20Interface,%20a%20Personal%20View.pdf|title=User Interface A Personal View|accessdate=2020-1|publisher=}}</ref>。{{Quotation|''object-oriented means that the object knows what it can do.''<br/>(オブジェクト指向とは、オブジェクトがなにかをできるのかを知っていることなんだ)|Alan Kay}}オブジェクトを指向=重視することの意味について、ケイは抽象的シンボル視点のプロセスと、具体的ユーザーインターフェース視点のプロセスを対照させながら説明している。前者では我々はまずオブジェクトの名前を示し、次にそのオブジェクトが行なうなにかを理解させるメッセージを続かせることになる。後者では我々はまず対象を選択し、次にその対象が提供するなにかの一覧を表示させることになる。この双方を踏まえた上でケイはこう結論している。{{Quotation|''In both case we have the object first and the desire second. this unifies the concrete with the abstract in highly satisfying way.''<br/>(双方の視点において僕たちはオブジェクト(対象)を第一とし、欲求を第二とする。これは高い満足度で具象と抽象を一体化する)|Alan Kay}}オブジェクト(対象)の重視と並行して、ケイはあらゆる物事からモード(''mode'')を取り除くべきだとするモードレス(''modeless'')の考え方も提唱している。モードとは決められた方法や作業手順や形態を指し、モーダルはタスクの指向=重視を意味することになる。オブジェクトとモードレスを融合させたユーザーインターフェースのデザインについて、ケイはテキストエディタの操作を例にした興味深い説明を加えている。テキストエディタの「挿入」「削除」「置換」といった操作はモーダルに当たる。それらは余りに基本的であるがゆえに対象と欲求に分解してのモードレスに再解釈できる余地がないように見える。ケイはこの命題から''Thus, there could be a zero-width selection, and thus every operation could be a replace.(もしゼロ幅選択枠というものがあるならば、全ての操作は置換になるだろう)といった解答を示している。「''ゼロ幅選択枠」という抽象的対象を導入することで「挿入」は始めに任意の文字間にあるゼロ幅選択枠を指定して次に置換→任意の文字列という欲求を伝えることになる。「削除」は始めに任意の選択文字列を指定して次に置換→ゼロ幅選択枠という欲求を伝えることになる。「置換」は選択文字列→置換→文字列である。文字実体のない抽象的なオブジェクトであるゼロ幅選択枠が、具体的なモーダル操作をモードレスに再解釈する役目を果たしてる。始めに対象を選択しても自由に他の対象または他の表示中の操作にも移れることがモードレスと言われる所以である。これが具象と抽象の一体化であると説明されている。
 
==== 1993年頃 ====
1992年に[[Association for Computing Machinery|ACM]]からプログラミング言語史編纂の一環として執筆を依頼された[[アラン・ケイ]]は、翌年のACM刊行記事においてオブジェクト指向の構想を改めて六つの要約にまとめて説明した<ref name="EarlyHistoryOfSmalltalk" />。{{Quotation|1, ''EverythingIsAnObject.
 
2, ''Objects communicate by sending and receiving messages (in terms of objects).
44 ⟶ 43行目:
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}}以下はその和訳であは以下のようになる。
 
# すべてはオブジェクトである。
# オブジェクトはメッセージの送信とけ答えによってコミュニケーションする。
# オブジェクトは自身のメモリー記憶を持つ。
# すべてのオブジェクトクラスのインスタンスであり、る。クラスもまたオブジェクトであるべきである。
# クラスはそのインスタンスたち為のために共有動作される振る舞いするインスタンス振る舞いはプログラムにおけるリストのオブジェクトの形態である。
# プログラム実行時リストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱わ処理される。
 
メッセージと記憶はオブジェクトの独自用語とされておりその解釈は先送りする。プログラムリストは[[LISP]]言語由来の言葉であり、計算シンボル、関数シンボル、変数シンボル、数列、数値をトークン単位で連ねたデータ列である。データ列をそのままコード列として解釈演算するのが評価(''eval'')である。評価の管理が制御(''control'')であり、この場合はどのプログラムスコープで管理されるかを意味する。プログラムリストはメッセージとして処理されると示されているので、すなわちメッセージを送られたオブジェクトのスコープでその評価は制御される事になる。スコープはコンテキストとも読み替えられ、同じシンボルでもコンテキストによって意味が変わった。オブジェクトの記憶の''have''に対して、振る舞いの''hold''の違いにも留意する必要がある。
また、2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷のプログラミングで言われる「カプセル化、継承、多態性」を意識した上でこのように答えている。{{Quotation|''OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.''
 
==== 1998年頃 ====
1998年にAn Introduction To Object-Oriented Programming''を出版した[[オレゴン大学]]コンピュータサイエンス教授ティム・バッドによると、この時期のアラン・ケイの構想はこのようになっていた''<ref>{{Cite web|url=http://wiki.c2.com/?AlanKaysDefinitionOfObjectOriented|title=Alan Kays Definition Of Object Oriented|accessdate=2020-1|publisher=}}</ref>''。''{{Quotation|1, ''EverythingIsAnObject.
 
2, ''Communication is performed by objects communicating with each other, requesting that objects perform actions. Objects communicate by sending and receiving messages. A message is a request for action, bundled with whatever objects may be necessary to complete the task.
 
3, ''Objects have their own memory, which consists of other objects.
 
4, ''Every object is an instance of a class. A class simply represents a grouping of similar objects, such as integers or lists.
 
5, ''The class is the repository for behavior associated with an object. That is, all objects that are instances of the same class can perform the same actions.
 
6, ''Classes are organized into a singly-rooted tree structure, called the inheritance hierarchy. Memory and behavior associated with instances of a class are available to any class associated with a descendent in this tree structure.|Alan Kay}}この和訳は以下のようになる。''
 
# すべてはオブジェクトである。
# コミュニケーションはオブジェクトに動作実効を要求するオブジェクトの相互通信で実効される。オブジェクトはメッセージの送受信でコミュニケーションする。メッセージはタスク遂行に必要なオブジェクトが付帯された動作要求である。
# オブジェクトは自身の記憶を持つ。記憶は他のオブジェクトたちで構成されている。
# すべてのオブジェクトはクラスのインスタンスである。クラスは数値集合やリスト集合といったように類似オブジェクトのグループ化をシンプルに表現する。
# クラスはオブジェクトに関連付けられた振る舞いのリポジトリである。同じクラスのインスタンスである全てのオブジェクトは共通動作を実効できる。
# クラスは継承階層と呼ばれる単一ツリー構造で組成される。クラスのインスタンスの記憶と振る舞いは、ツリー構造下の子孫であるクラスからも利用できる。
 
オブジェクトに動作を求めるメッセージ自体にもオブジェクトが含まれていることや、オブジェクトの記憶もオブジェクトの集合であることが示されており、メッセージと記憶の意味がより明らかにされている。また、プログラムリストを評価するなどの構想が、単一継承を重視する考えに置き換えられている。
 
==== 2003年頃 ====
 
2003年にとある知人からオブジェクト指向の意味を尋ねられたアラン・ケイはこのようにメール上で答えている<ref>{{Cite web|url=http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en|title=Dr. Alan Kay on the Meaning of “Object-Oriented Programming”|accessdate=2019-1|publisher=}}</ref>。{{Quotation|''OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.''
<br>(僕にとってのオブジェクト指向は、メッセージングと、ステートプロセスの局所保持かつ保護かつ隠蔽と、あらゆるもの同士の徹底的な遅延バインディングだけだ)|Alan Kay}}
 
「''messaging''」「''state-process''」「''late-binding''」三項うち一番いずれもがと二番目は、''object-oriented''と同様にケイの造語なので注意が必要である。一番目は[[メッセージパッシング|メッセージ・パッシング]]の派生語である。二番目のステートプロセスは状態処理が適訳と思われるが、元々が造語であるため詳細は漠然としている。三番目はあえてハイフンが付けられている点に留意せねばならず、ケイ流の[[ダイナミックバインディング|遅延バインディング]]といったところである。
 
==== 2020年頃 ====
オブジェクト指向を提唱する中でケイは「[[LISP]]」の影響を言及している。オブジェクト指向の実装言語である[[Smalltalk]]のメッセージング構文はLISPの式構文に似ており、また[[関数型プログラミング|関数型言語]]の構文にも似ている。LISPの設計の中で比較的重視されたのは[[高階関数|高階ロジック]]と[[S式|S式ストラクチャ]]であったという。それらに加えて初期に発表された六つの要約と、後にケイが明かした三つのコンセプトを踏まえた上でオブジェクト指向を読み解いていく。
Q&Aサイトの[[Quora]]で「66年ないし67年のオブジェクト指向という造語を発したアラン・ケイに誰かが影響を与えていたのか?」という質問に対して本人がこう回答している。なお、rotationとは「一つのコンピュータはどこかのコンピュータができることをできる、相互通信によってあらゆる規模の計算可能性を表現できる」を意味している。{{Quotation|''In the 1960s, software composites that were more complex than arrays, were often called “objects”, and all the schemes I had seen involved structures that included attached procedures. A month or so after the “rotation” someone asked me what I was doing, and I foolishly said “object-oriented programming”.''
<br>(60年代、配列より複雑なソフトウェア構成体はしばしばオブジェクトと呼ばれていた。手続きを付けた構造体を僕もそう見ていた。rotation構想の後、今何をしているのかと尋ねられた僕は愚かにもこう言った。オブジェクト指向プログラミングと。)|Alan Kay}}
{{Quotation|''The foolish part is that “object” is a very bad word for what I had in mind — it is too inert and feels too much like “data”. Simula called its instances “processes” and that is better.“Process-oriented programming” would have been much better, don’t you think?''
<br>(僕の考えを表現するのにオブジェクトはとても悪い言葉だった。データを過剰に意識させたからだ。Simulaはプロセスと呼んでいた。これはいい。プロセス指向プログラミングの方がずっと良かったんじゃないか?)|Alan Kay}}
 
=== その解釈 ===
67 ⟶ 96行目:
 
==関連項目==
*[[ソフトウェ工学ラン・ケイ]]
*[[Smalltalk]]
*[[オブジェクト関係データベース]]
*[[LISP]]
*[[オブジェクト関係マッピング]]
*[[Simula]]
*[[NEXTSTEP]] - オブジェクト指向オペレーティングシステム
*[[ダイナジェトモデル化技法]]
*[[Alto|Xerox Alto]]
*[[Booch法|ブーチメソッド]]
*[[GUI]]
*[[オブジェクト指向ソフトウェア工学]]
*[[仮想マシン]]
*[[統一モデリング言語|UML(統一モデリング言語)]]
*[[CRCカード]]
*[[アクターモデル]]
*[[アスペオブジェクト指向関係マッピング]]
*[[エージェント指向]]
 
==外部リンク==