今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Template Method パターンは必要か?

昨日の日記にいくつかのコメントがあったので補足。
そもそも Template Method パターンってのは必要ではない適用可能な場面がかなり限られている。Template Method パターンを使う場合、仕様と実装が分離できていない。仕様と実装が密結合してしまうために保守性を低下させている。
Template Method パターンの意図は、サブクラスの仕様を定義しようとするところにある。つまりインタフェースで仕様を定義すればそれですむことだったりする。例として、3つのメソッドが順に呼ばれることを期待したインタフェースを書いてみる。*1

public interface Algorithm {
    public void first();
    public void second();
    public void third();
}

仕様をインタフェースで定義するこの方法ならば柔軟性が確保できる。Template Method パターンが持つ「スーパークラスの実装に依存する」という制約を回避できる。
また、次のように、各メソッドの前に別のメソッドを追加するといった、アルゴリズムを拡張したい要求があっても容易に対応できる。

public interface ExtendedAlgorithm extends Algorithm {
    public void prepareFirst();
    public void prepareSecond();
    public void prepareThird();
}

Template Method パターンとは、インタフェースで仕様を定義し、別のクラスで実装するという理想的なモデルが縮退した(仕様と実装が結合した)特殊なケースだ。つまり、縮退させることが妥当であることを説明できる合理的な理由がなければ、Template Method パターンを使ってはいけない。

*1:例に書いたメソッドの命名は良くない。後で first() と second() の間に何かの処理を追加したくなったときに困ることになる。メソッド名はそのメソッドの目的などを表すようにするのが良い