オブジェクト指向

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

オブジェクト指向(オブジェクトしこう、: object-orientation[1])は、ソフトウェア工学構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方あるいは概念(コンセプト)である。修飾語として用いられるobject-orientedは「オブジェクト指向の」という意味を持つ複合形容詞であり、修飾対象がオブジェクト指向に基づいていること、あるいはオブジェクト指向に関連することを意味する。

特にコンピュータプログラミング分野におけるオブジェクト指向のエッセンスおよびコンセプト自体は、もともと1962年に公開されたSimula Iと、その成功を受けて開発されたSimula 67で導入されたクラス機構を発端とする[2][3][4][5]。のちにSimulaの影響を強く受けたビャーネ・ストロヴストルップC++と、SimulaのほかにLISPの影響を強く受けたアラン・ケイSmalltalk[6]によってオブジェクト指向が再定義された。

起源[編集]

オブジェクト指向の起源自体は明確ではない。また、突発的に生まれたものでもなく、例えば以下に挙げるような様々な概念や技術が発展・融合して生まれたものである[7][8]

オブジェクト指向の分野[編集]

オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系である。そのデータとコードのセットを基本要素にして物事を解析する考え方が、特に1980年代から大きく注目され始め、ソフトウェア工学のあらゆる局面にobject-oriented (OO) を接頭辞にした分野が立ち上げられた。他にも、OOオペレーティングシステム、OOプロジェクトマネージメント、OOソフトウェアエンジニアリング、OOユーザーインターフェース、ブーチメソッドオブジェクトモデリングテクニックなど複数の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、明確な一つの分野として扱われることは少ない。

オブジェクト指向プログラミング[編集]

オブジェクト指向に基づいたプログラミングスタイルのことであり、Object-Oriented Programmingの頭文字をとってOOPと略されることもある。

主な要素[編集]

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

なお、アラン・ケイが提唱したSmalltalk系統のオブジェクト指向は、以下とは別の異なる概念を根幹としている(後述)。

オブジェクトのデータと、データに関連する振る舞い(操作、関数あるいはメソッド)をひとまとめにすること、またそれらに対して外部からのアクセスを制御・限定すること[9]
アクセス権限(可視性)の種別はプログラミング言語によって異なる[10]
派生元オブジェクトに任意のデータとメソッドを追加する形で派生先オブジェクトを作る方式(部品→全体)と、オブジェクトを複数の階層に分解して他オブジェクトと共有できる階層を派生元にする方式(全体→部品)の二通りの考え方がある[要出典]。継承によりデータ構造およびコードの再利用と拡張を可能にする。
クラスベースのオブジェクト指向では、派生元オブジェクトのデータ型はスーパークラスあるいは基底クラスなど、派生先オブジェクトのデータ型はサブクラスあるいは派生クラスなどと呼ばれる。派生クラスのインスタンスはまた基底クラスのインスタンスとしても扱えるようになる(リスコフの置換原則)。継承により、後述の多態性を実現することができるようになる。
任意のメソッドの呼び出し時に、メソッドが属する実際のオブジェクトの種類(クラス)によって呼び出し先の実装コードが選択され、処理内容が変化する性質。
通例、実行時の型(動的な型)に応じて呼び出されるコードが決定される「動的な多態性」のことを指す[11]
静的型付け言語において、メソッドの実引数として渡すオブジェクトの型に従って、呼び出されるメソッドが選択される多重定義(オーバーロード)[12]や、ジェネリックプログラミングにおいて、型引数に応じて生成されるコードが変化するパラメータ多相英語版なども多態性の一種と見なされる。これらは「静的な多態性」に分類され、実行時ではなくコンパイル時に動作が決まる。

なお、ビャーネ・ストロヴストルップ自身は、広義の「オブジェクト指向」として、以下に列挙する要素をプログラミング言語または技法が直接的にサポートすることを要件として提案している[13]。これにはC++、Simula、Smalltalkなど多くの言語が含まれることになるが、C言語Fortran 4、Pascalといった古典的な言語は除外される。

  1. 抽象化 (abstraction)
  2. 継承 (inheritance)
  3. 実行時の多態性 (run-time polymorphism)

オブジェクト指向とメッセージング[編集]

オブジェクト指向プログラミングは、歴史的にSimulaのオブジェクトおよびクラスの概念を発端とするが、Simulaの理念を直接的に受け継いだC++系統と、1970年代から研究開発が進められていたメッセージ・パッシングの仕組みを主体とするSmalltalk系統に大別されており、理想的なオブジェクト指向本来の形態を正しく表現しているのは後者のSmalltalk系統のほうだと評されていた。しかし、20世紀後半当時の計算機資源(CPU処理能力やメモリ容量など)の問題や、理論より実務上の利便性を重視する開発現場の事情から、より簡便な設計および少ないリソース下でもオブジェクト指向プログラミングのための機能を「クラス機構」を活かして実現できるC++系統のほうが主流となった。

Smalltalk系統のオブジェクト指向の主要概念であるメッセージパッシング (message passing) は、従来のサブルーチンコールの形態を変えたものであり、基本はバイトデータの送受信でメソッド名とパラメータ値およびリターン値をやり取りするという仕組みだった。このバイトデータの羅列が「メッセージ」と呼ばれ、大抵は先頭の伝言名と後続の引数名&引数値の配列で構成された。オブジェクトのレシーバー関数が引数として渡されたメッセージを読み込み、オブジェクト内部でそれに準じた処理を行い、結果をリターンした。レシーバーの仕組みは結果的に「カプセル化」を実現できた。オブジェクト内部での自由自在な処理実装によるリターンはこれも結果的に「多態性」を実現できた。この多態性が示す多重ディスパッチないし動的ディスパッチを円滑に実装するために、クラス構造定義を自由に操作できる「リフレクション」の機能が備えられた。

Smalltalkの構想は以下の6つのアイディアに体系化されている[6]

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

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

このオブジェクトを中心にしてシステムを組み立てていく考え方がSmalltalkのオブジェクト指向である。

なお、Smalltalk開発者の一人であり、オブジェクト指向開発環境のパイオニアと見なされているアラン・ケイは「オブジェクト指向という用語を作り出したのは自分だが、これは悪い選択だった。なぜならば、メッセージ送信のもっと重要なアイディアを十分強調していない。」というコメントを残している[14][15]

上述の通り、Smalltalkが主体とするメッセージングは堅牢なカプセル化と高度に柔軟な多態性を自然に表現できる仕組みだった。それに対して、C++やJavaに見られる「クラス機構」と継承をベースにした同様の機能の実現はトリッキーと言えた。しかし、実際には「クラス機構」重視の、言わば亜流のほうがオブジェクト指向の主流となってしまった。アラン・ケイは「自分自身もSmalltalkの大ファンではない。とはいえ、今日のたいていのプログラミングシステムに比べれば好ましいものだが。」とも述べている。

脚注[編集]

  1. ^ object orientationの意味・使い方|英辞郎 on the WEB:アルク
  2. ^ How Object-Oriented Programming Started
  3. ^ Ole-Johan Dahl (2001年6月). “The Birth of Object Orientation: the Simula Languages”. 2019年2月2日閲覧。
  4. ^ INTRODUCTION TO SIMULA
  5. ^ Jonathan Aldrich and Charlie Garrod (2014年). “OO History: Simula and Smalltalk”. 2019年2月2日閲覧。
  6. ^ a b Alan C. Kay. “The Early History Of Smalltalk”. 2019年2月21日閲覧。
  7. ^ Part2 オブジェクト指向の発展の歴史 | 日経 xTECH(クロステック)
  8. ^ オブジェクト指向(おぶじぇくとしこう) - ITmedia エンタープライズ
  9. ^ カプセル化とは - IT用語辞典
  10. ^ C++ではどのコード領域からもアクセス可能なpublic、自クラスと派生クラスからのみアクセス可能なprotected、自クラス内でのみアクセス可能なprivate、の三種を規定しており、C++の派生言語では類似のアクセス修飾子英語版をサポートしていることが多い。
  11. ^ C++では同じシグネチャを持つ仮想関数(仮想メソッド)のオーバーライドにより動的な多態性を利用できるが、内部的には通例仮想関数テーブルによる動的ディスパッチを用いて実現されている。仮想メソッドのオーバーライドでは1変数に関する動的ディスパッチしかできないが、2変数以上に関する動的ディスパッチ(多重ディスパッチ)の仕組みをサポートする言語もある。
  12. ^ 被演算子を演算子関数の引数とみなし、ユーザー定義の演算子オーバーロードをサポートする言語もある。言語組み込みの演算子も被演算子の型に応じてコードが変化するため、これも演算子オーバーロードの一種である。
  13. ^ Why C++ is not just an Object-Oriented Programming Language”. 2019年2月21日閲覧。
  14. ^ オブジェクト指向プログラミングは間違いだったか? - InfoQ
  15. ^ Object Oriented Programming: The Wrong Path? - InfoQ

関連項目[編集]

外部リンク[編集]