Implementation Patternsネタ

Versioned Interface パターンが面白そうなネタでした。

「インターフェースに新規にメソッドを追加したいけど、インターフェースを変更することはできない」という状況での実装パターン。

// 当初のインターフェース
interface Worker {
void do();
}

//---------------------------------

// 新メソッドを追加したインターフェース
interface UndoWorker extends Worker{
void undo();
}

//---------------------------------


// 呼び出し元
Worker worker = WorkerFactory.create();
worker.do();

// 新機能を使いたいところでだけダウンキャスト
if(worker instanceof UndoWorker) {
worker.undo();
}

なにかフレームワークを作って広く公布(publish)されてしまったあとにインターフェースを変更したくなった時なんか便利そうです。元のインターフェースをどこの誰がimplementsしているか把握できない状況で、既存のソースに影響を与えずにメソッドを追加できる。


毎度毎度言いっぱなしですけど、実際どれだけ活用されているかはわかりません。googleコードサーチで「versioned interface」でググッた範囲ではそれっぽいのが見つかりませんでした*1。通常のGoogle検索ではそこそこヒットするので、もう少し確認とってみる予定。
自分も使う機会があったら使ってみたいですけど、よっぽど汎用性の高いフレームワークでないとなかなかこういう状況はなさそうです。




というネタをmixiJavaコミュで「instanceofを実践で使うか否か」という話を読んでて書いてみたくなりますた。


2008-01-22 22:55 追記
当初「使ってみたい」とか書いちゃいましたが、積極的に使うパターンではないですね。ケント・ベック氏も「複数のバージョン付きインターフェースが出てきたら、それはデザインを練り直すサインなのだ」と述べています*2

ブチャラティの兄貴風に言うなら「新しい操作を追加する」「既存の実装も動かす」両方やらなくっちゃあならないってのがフレームワーク拡張のツラいところだなというところでしょうか。

*1:ググってパターン名がそうそう出てくるわけねーよなと後で反省

*2:『Implementation Patterns』p28を超意訳