wildcatsの日記

赤羽在住でIT関係の会社の社長やってます。

Re:Template Method パターンは必要か?

個人的にずいぶん昔に業務のフレームワークを作っていてひどい目にあったことがあります。
あまり深く考えずにTemplate Methodパターンを用いて
親クラスの責務で制御を行い
子クラスの責務で業務部分の差分実装という形にしたのですが
子クラスが肥大化し重複コードが目立ってきた為に
親クラスの別メソッドに移動させたところ
親クラスの責務が制御+子クラスの業務部分の差分実装共通となってしまい
SRP違反となった経験があります。(Javaでは多重継承は行えない為)
よってその経験からはTemplate Methodパターンを用いなくなりました。
# 親クラスを自分が作っていて子クラスを別の方が作っていました。


またTemplate Method以外の単一継承でもひどい目(ひどい目が多いなぁ(汗))にあっていて
あるクラスの継承元にTreeMapを用いており
ある日にHashMapで仕様的に問題がないことが判明したため
継承元を修正しようとしたら
クライアントのコードで


TreeMap map = (TreeMap) ×××; // ×××が自分が作ったクラス
とあちこちがなっていて、泣く泣く修正できなかったことがあります。
# というか何でキャストするんだよ!ってツッコミを入れてましたが
# 今から考えると私がLSP違反のクラスを作っていたんでしょうね。

それ以来は分類分けにインタフェースを用いて、動作の継承には委譲を用いるようになりました。

また最近Meyer本を読んでいて感じたのは
具象継承と動的束縛と事前条件・事後条件・クラス不変条件の関係がわからないと
具象継承は恐くて使えないと感じました。