メインメニューを開く

オブジェクト指向(オブジェクトしこう、: 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)のメッセージ送受信とは、パラメータ付きサブルーチン呼び出しとリターン値のやり取りに近いものであるが、違った角度から再解釈されている。オブジェクト指向の下では数式もメッセージングとなった。「3+5」は3というオブジェクトに+と5というメッセージが送られて結果値オブジェクトの8が返るといった具合である。+の演算子と5の引数値もオブジェクトであった。コードブロックもまたオブジェクトであり同時にメッセージにも出来たので、比較式オブジェクトが返す真偽値に対してオブジェクト状態の基礎的な判定を行う予約語オブジェクトと併せてコードブロックを送信する事で条件分岐や反復といった制御構文を表現する事も出来た。数値に対してコードブロックを送ると回数反復となった。オブジェクトを次々と引き合わせるのは順次処理となった。従来のプログラムリストで広く使われていたフローチャートが別の視点から眺められて、その図表上にある数値や記号や変数および順次や分岐や反復のフローといったあらゆる要素がオブジェクトとして分解され、オブジェクトにオブジェクトを引き合わせて双方に関連した処理を行わせるという全く新しいフローがメッセージと名付けられた。

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

解説編集

あらゆるオブジェクト指向プログラミング言語において、オブジェクト(object)とはデータ(変数またはプロパティ)とコード(関数またはメソッド)の複合体であるという点は共通している。

留意すべきは、本来の意味でのオブジェクト指向プログラミングと、従来の一般的な手続き型プログラミングまたは構造化プログラミングは共存するパラダイムではないという事である。オブジェクト指向の下では数値、真偽値、コードブロック、セレクタ(オブジェクトの基礎的な判定と振る舞いを規定した予約語とその他)といった要素までがオブジェクトだったので、真偽値または回数値にセレクタとコードブロックを引き合わせるルーチンがそのまま条件分岐または反復処理の制御フローになった。オブジェクトに次々と引数オブジェクトを引き合わせるルーチンは順次フローとなった。オブジェクト指向の軸となるメッセージパッシングとは、オブジェクトにオブジェクトを引き合わせて、双方に関連したプロセスまたはフローを発生させるルーチンワークを意味していた。プロセスは同時に曖昧化も可能で、いわゆる間を持たせての柔軟な拡張性も表現していた。これは自然言語の中で、名詞と動詞または主語と述語がつながり、明確ないし曖昧な意味内容が表現される事にも通じていた。

オブジェクトにオブジェクトを引き合わせるメッセージングがプロセスそのものとなる本来のオブジェクト指向に対して、その枝葉の部分であるはずのクラスとインスタンスの仕組みに注目したC++などのOOP言語がプログラミング上の利便性からより多くの支持を得て広く普及した為に、オブジェクト指向の本質は見失われ、その定義も曖昧化している。クラスのメカニズムを主眼にしたOOP言語においてのオブジェクトは、プロセスの中でユーティリティ的に扱われるプログラム要素になったと言っても差し支えなく、同時にメッセージングの存在意義も失われる事になった。以降に立ち上げられたオブジェクト指向を接頭辞とする様々なソフトウェア工学分野も、データとコードの複合体としてのオブジェクトの概念のみに因んでいると言ってもよく、元々の発案者から見ればオブジェクト指向の用語が完全に一人歩きしている状態であった。なお、発案者による情報発信の中にも実際のSmalltalk実装との関係を見出せない、オブジェクト指向に対する解釈を曖昧化させる様なメタファーが少なからず含まれていたという側面もある。更に1973年に提唱されたアクターモデルの中でも、非同期通信及びリモートメソッドとレシーバーに類似したシステムであるメッセージパッシングという用語が定義されたので、こちらとの混同も生じる様になった。

C++は様々なOOP論争を巻き起こしているが、よく聞かれた中に「何故ただの関数コールをわざわざメッセージと呼ぶのか?」というものがある。これは素人意見の様に見えて実際は的を射ており、如何なる形態であれオブジェクトのメソッドからの他オブジェクトのメソッド呼び出しは関数コールの延長でしかなく、元々のメッセージングの詳細を見ずにその用語だけを当てはめてOOPの体裁を整えていると言ってもよかった。オブジェクトの代表メソッドであるレシーバーが、バイトデータを基本とするパラメータを受け取り、レシーバー内で多様な処理と移譲を行うメカニズムについても同じであった。リモートメソッドのシステムが普及すると、遠隔プロセス実行の為のバイトデータ送受信もメッセージパッシングであると認識されるようになったが、これもメッセージングの本質から離れていた。オブジェクト同士を引き合わせて双方に関連したプロセスを発生させそれを連鎖的かつ再帰的に積み重ねるといったメッセージング本来の理念が広まらなかった事で、オブジェクト指向はその根幹よりも枝葉の部分に焦点が当たり、亜流が本流に取って代わるという紆余曲折と解釈上の齟齬が続いた。結果として詳しい細目を持ちながらその本質はいまいち掴みどころがない、千差万別の見解が存在するソフトウェア工学理論となるに到っている。

脚注編集

  1. ^ a b c 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日閲覧。

関連項目編集

外部リンク編集