13

Common Lisp Object System(CLOS)は、従来の(クラスベースの)オブジェクト指向システムよりも優れているという主張に出くわしました。CLOSのウィキペディアのエントリには、2つのアプローチの違いが記載されています。主に多重ディスパッチとCLOSのクラスとメソッドの分離です。これらはCLOSの単なる違いですか、それとも真の利点ですか?

4

1 に答える 1

20

あなたが利点として見るものに依存します。

最初のCLOSは、非クラスベースのプロトタイプ指向のオブジェクトシステムと比較して、クラスベースのオブジェクトシステムですCLOSには、多重継承を持つクラスがあります。CLOSオブジェクトはクラスのインスタンスです。

CLOSはクラスの名前空間を作成しません。CLOSは、メソッドをクラスおよびそれらのクラスの名前空間内に常駐させません。

これは、CLOSがメッセージパッシングOOではないことを意味します。あるオブジェクトにメッセージを渡さず、そこでオブジェクトは対応するメソッドを実行します。

CLOSが開発されたLispの歴史的に初期のオブジェクトシステムは、従来のクラスベースのメッセージパッシングシステム(LOOPSFlavours)として始まりました。数年間の実験と研究により、CLOSモデルはLispによりよく適合し、より強力であることがわかりました。

CLOSはジェネリック関数モデルを使用します。その主な利点は、関数型プログラミングパラダイムによりよく適合することです。CLOSは、ジェネリック関数の関数呼び出しを使用します。ジェネリック関数は複数の引数を持つことができ、複数の引数をディスパッチできます。他の関数も複数の引数を持つことができるので、これはCommonLispの残りの部分に適合します。CLOSジェネリック関数は、受け渡ししたり、関数から返したり、データ構造に格納したりすることもできます。したがって、これらは第一級関数でもあります。これらの機能(高階関数と多重ディスパッチ)が役立つ場合は、CLOSに利点があります。さらに、CLOSジェネリック関数はCLOSオブジェクトそのものです。

その場合、他のクラスベースのOOシステムとはいくつかの点が異なります。クラスごとに名前空間がなく、メソッドがクラスごとに編成されていないことは、すでに前述したとおりです。CLOSはメッセージパッシングOOではないため、あるオブジェクトに送信されたすべてのメッセージを別のオブジェクトに転送することは適用されません。メッセージパッシングがない場合、存在しないメッセージを転送することはできません。

明らかな利点の1つは、CLOSクラスがメソッドをバンドルせず、メソッドを個別に定義できるため、クラスとメソッドのセットが閉じられないことです。新しいメソッドはいつでも追加または削除できます。これは、新しい機能や変更された機能の場合、ソースコードを必要とせず、クラスを「再度開く」か、クラスをサブクラス化して新しい機能をサブクラスに追加する必要がないことを意味します。CLOSでは必要ありません。

他のいくつかの可能な利点:

  • CLOSには、機能を整理するためのジェネリック関数があります。したがって、機能をクラス全体に分散させる必要はありませんが、ジェネリック関数にまとめることができます。

  • CLOSのディスパッチメカニズムは非常に柔軟です。実行時に、効果的なメソッドを一連の適用可能なメソッドからアセンブルでき、アセンブリはほぼ任意の方法で制御できます。このようにして、基礎となる実装を変更することなく、ユーザーが新しいディスパッチ方法を実装できます。例として、契約による設計の実装があります。CLOSは非常に柔軟性があるため、ユーザーがこれを実装できます。

一般に、高度なCLOS実装は、デフォルトのオブジェクトシステムであるという考えに基づいていますが、オブジェクトシステム自体のさまざまなカスタマイズが可能です。したがって、CLOSは、単一の固定されたものではなく、可能なオブジェクトシステムの領域を定義します。デフォルトの機能はすでにかなり高度です:多重継承、動的更新、多重ディスパッチ、メソッドの組み合わせなど。

Common Lisp Object SystemであるCLOSの設計哲学の詳細については、次の論文を参照してください。

于 2011-02-21T17:30:46.493 に答える