プロトタイプベース
プロトタイプベース(英: Prototype-based)は、
オブジェクト指向プログラミング(OOP)の戦略の一つで、主に既存のオブジェクトを複製して新しいオブジェクトを生成する手法です。この手法では、直前にどのような新しいメンバーを追加するかに重点が置かれています。プロトタイプベースは、
インスタンスベースとも呼ばれ、クラスベースのアプローチと対比されることが多いです。
起源
プロトタイプベースOOPは、1987年に登場した
SelfというSmalltalk方言から派生しました。この言語は、クラスベースの設計を便利にするために考案され、その後、
Luaや
JavaScriptなどさまざまな
プログラミング言語に影響を与えています。プロトタイプは、複製元のオブジェクトを指し、生成されたオブジェクトはこのプロトタイプから特性やメソッドを引き継ぎます。
クラスベース設計の複雑さを軽減するために、プロトタイプベースの考え方が生まれました。
アラン・ケイによって示されたSmalltalkの基本的な設計概念は、
インスタンス、クラス、メタクラスといった階層的な関係を伴い、非常に美しい理論を提供しましたが、開発現場ではその複雑さから不満も多く寄せられていました。そこで、クラスを無くし、オブジェクトそのものに対するシンプルなアプローチが採取され、プロトタイプが生まれたのです。
構造と機能
プロトタイプベースのOOPでは、オブジェクトは「スロット」と呼ばれる可変長の配列として実装されます。これらのスロットは、シンボルとそのコンテンツをペアで持ち、シンボルがプロパティ名やメソッド名を表し、コンテンツが実際の値やコードを指します。オブジェクトの作成方法には、既存のオブジェクトを複製する「クローン」方式や、空のオブジェクトを生成する「エクスニヒロ」方式があり、それぞれが特有の機能を持ちます。
クローン方式では元のオブジェクトをコピーした後、新たにプロパティやメソッドを追加したり削除したりできます。一方、エクスニヒロ方式では、最初は空のオブジェクトを生成し、その後に必要なプロパティやメソッドを追加できます。
プロトタイプベースの設計では、オブジェクトが自身のプロパティやメソッドを持たない場合、プロトタイプに遡ってその特性を検索する仕組みが導入されています。これにより、オブジェクト同士の継承関係が形成され、クラスが存在しない状態での多様なオブジェクトの組み合わせが可能になります。
利点と課題
プロトタイプベースは、
動的型付けを望むプログラマにとって非常に魅力的な方法ですが、
カプセル化に関しては、それほど重視されないことがあります。また、クラスが存在しないため、クラスベース設計におけるメソッド
オーバーライドや仮想関数の概念が適用できず、動的バインディングに依存する必要があります。たとえば、
JavaScriptのような言語では、クラスベースの構文が導入されても、プロトタイプベースの遺伝的特性が残ったままオブジェクト指向が機能しています。
これにより、開発者はオブジェクトがどのように振る舞うかに集中でき、振る舞いの実装をシンプルにします。プロトタイプベースは、少数派として存在するものの、現在でも多くの
プログラミング言語に影響を与えています。