メインメニューを開く

オブジェクト指向(オブジェクトしこう、: 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日閲覧。

関連項目編集

外部リンク編集