拡張オブジェクトパターンを学ぶ

以下の3部構成ブログエントリに,Eclipseで多用されている「拡張オブジェクト」パターンの非常に分かりやすい説明があります。

  1. Planet Eclipse
  2. Planet Eclipse
  3. Planet Eclipse

1では,プロパティビューにドメインモデルのプロパティを表示するために,ドメインモデルを構成するクラスがIPropertySourceを実装している例が示されています。ドメインモデルがプロパティビューに深く依存してしまっています。

2では,上記クラスがIPropertSourceを直接実装するのではなく代わりにIAdaptableを実装し,IPropertySourceを実装するアダプタを返すようにコードを変更します。これにより,少なくともIPropertySourceに依存しないドメインモデルとなります。でも,まだIAdaptableというEclipse特有のインタフェースに依存しています。

3では,アダプタファクトリを導入し,ドメインモデルから完全にEclipseへの依存を取り払います。

「拡張オブジェクト」は,既存のクラスを一切変更することなく新しい機能(アダプタ)を追加する,という凄い仕掛けです。その凄い仕掛けを,目的に向かって順序だてて説明されているので,非常にわかりやすいと思いました。(英語ですけど)

なお,上記ブログエントリと似た説明が以下の書籍の29章でも行われています。これですと日本語ですね。

Eclipseプラグイン開発

Eclipseプラグイン開発

ちなみに,パターンの定義によると,上記2の段階が「拡張オブジェクト」パターンです。上記3は更なる発展となります。しかし,一般には上記3のようにアダプタファクトリを導入することで完全に独立したドメインモデルを構築することが多いと思います。したがって,議論の際に「拡張オブジェクト」という言葉を利用する際には,ちょっと注意が必要かもしれません。
(「拡張オブジェクト」パターンの定義については以下の書籍にあります)

プログラムデザインのためのパターン言語―Pattern Languages of Program Design選集

プログラムデザインのためのパターン言語―Pattern Languages of Program Design選集