プロトタイプベース・プログラミング
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/27 00:07 UTC 版)
「Self」の記事における「プロトタイプベース・プログラミング」の解説
詳細は「プロトタイプベース」を参照 本来のオブジェクト指向言語は以下の双対関係に基づいている: クラスはオブジェクトの基本的な機能と振る舞いを定義する。 オブジェクト・インスタンスはあるクラスの個別の具現である。 例えば、Vehicle クラスのオブジェクトが「名前」を持ち、「運転」とか「建材を運ぶ」といった機能を持つとする。Porsche 911 が Vehicle クラスの1つのオブジェクト(インスタンス)で、「ポルシェ 911」という「名前」を持つとする。理論的には Porsche 911 に対して「建材を運べ」というメッセージを送ることができる。 この例はオブジェクト指向のはらんでいる問題を示している。ポルシェはどう考えても建材を運ぶのには適さないが、モデル化された Vehicle にはその機能が与えられている。より適したモデルを生成するには Vehicle に特殊化を施したサブクラスを使えばよい。例えば、Sports Car とか Flatbed Truck である。この場合、Flatbed Truck クラスのオブジェクトだけが「建材を運ぶ」という機能を持てばよい。一方、Sports Car にその機能を与えるのは間違いであり、単に高速に運転できればよい。 このような問題がプロトタイプという考え方を生む要因となった。クラスやオブジェクトが将来どのような機能を持つようになるか確実に予測できないと、クラス階層を正しく設計することはできないのである。Smalltalkのような初期のオブジェクト指向言語では、この手の問題が頻繁に生じた。システムがある程度まで成長すると、全体として硬直化が起きて、特に基本的なクラス群は相互の関連に縛られ、機能追加が困難となる。 Smalltalk のような動的言語では、クラスの変更によって容易にオブジェクトの振る舞いを変えられるという特徴でこれに対処できる。しかし、このような変更は注意深く行われるべきである。さもなくば、変更されたクラスに所属する、挙動が変更されるべきでないオブジェクトは「誤った」挙動を示してしまう。この問題は脆弱な基底クラス問題の一つである。一方で、C++のように、基底クラスと派生クラスを別々にコンパイルできる言語では、事前にコンパイルした派生クラスのメソッドに、基底クラスでの変更が派生しない。この問題は脆弱な基底クラス問題のもう一つの形式であり、脆弱なバイナリ・インターフェース問題の一つでもある。 Self や他のプロトタイプベース言語では、クラスとオブジェクトの双対関係が排除されている。 何らかの「クラス」に基づくオブジェクトの「インスタンス」を作るのではなく、Self では既存のオブジェクトをコピーし、それに修正を加える。従って、Porsche 911 を作るには、他の Vehicle オブジェクトをコピーし、「高速運転」メソッドを追加すればよい。コピー元となるオブジェクトを「プロトタイプ」と呼ぶ。この技法によりダイナミズムが劇的に単純化されると言われている。既存のオブジェクトがモデルとして不適切であった場合、プログラマは単にオブジェクトに修正を加えて正しい振る舞いをするようにして、それを新たなプロトタイプとして使えばよい。既存のオブジェクトを使っているコードはそのまま使うことができる。
※この「プロトタイプベース・プログラミング」の解説は、「Self」の解説の一部です。
「プロトタイプベース・プログラミング」を含む「Self」の記事については、「Self」の概要を参照ください。
- プロトタイプベース・プログラミングのページへのリンク