感想
先日読んだ「レガシーコードからの脱却」はレガシーコードと戦うマインド、こちらはレガシーコードと戦う具体的なテクニック集という印象を受けた。DDDっぽくリファクタリングしたはいいものの、テストのやり方にてこずっていたので、インターフェースで抽象化してテスト用サブクラスを作成する手法は目から鱗だった。今回初めて書籍内に出てきたコードをphpで写経してみたが、理解レベルが格段に上がった(気がする)ので今後もそうしていくことにする。
忘れずにしたいメモ
Liskovの置換原則(LSP)
Rectangle(長方形)クラスを継承するSquare(正方形)クラスが以下のコードを実行した時、面積はどうなるべきか。
LSP違反例.php
$r = new Square();
$r->setWidth(3); // 横幅指定
$r->setHeight(4); // 縦幅指定
echo $r->getArea(); // 戻り値は 16
これは、Liskovの置換原則の違反の古典的な例です。サブクラスのオブジェクトは、どんな場合においてもスーパークラスのオブジェクトの代わりに使えなければなりません。
機能スケッチと影響スケッチ
機能スケッチ
- クラス内のインスタンス変数を表す円を描く
- クラス内のメソッドを表す円を描く
- 各メソッドの円からそのメソッドがアクセスする、もしくはそのメソッドが変更するあらゆるインスタンス変数とメソッドに対して矢印を引く
- 複数まとまりがあることを確認したら、それを別のクラスに抽出する。
影響スケッチ
機能スケッチの矢印の向きが逆。変更点を基にした影響調査に適している。
スプラウトメソッドとスプラウトクラス
システムに要件を追加する必要があり、それをまったく新しいコードで実現できる場合には、そのコードを新しいメソッド(またはクラス)として記述する。
FactoryMethodの抽出とオーバーライド
コンストラクタ内におけるオブジェクト生成処理を別メソッド(FactoryMethod)として抽出し、テスト用サブクラスでFactoryMethodをオーバーライドする。