注文ステータスの変更を焼き場・揚げ場・ドリンクバーへ1つずつ手で通知していて、通知先を足すたびに通知元を直す羽目になる。登録した相手へ自動で伝える形にする(Observer)。Perl と Moo で実装します。
is_occupied や is_billing のような真偽値フラグが増え、ありえない組み合わせの席ができる。状態ごとの部品に次の遷移を持たせ、矛盾した状態を作れなくする(State)。Perl と Moo で実装します。
割引計算の巨大な if/elsif を、割引ごとの小さな部品に分ける。会計の本体を変えずに割引を足せる形にする(Strategy)。Perl と Moo で実装します。
厨房の仕込みに見立てて、GoF のデザインパターンで困ったコードを直していく全24話の目次。困りごと別の一覧から、読みたい話を選べます。
税計算も在庫確認も通知も1つのクラスが引き受けていて、どの変更もそこへ流れ込む。責務ごとの専用クラスに切り出し、元のクラスは委譲だけをする薄い層にする(God Class)。シリーズ最終話。Perl と Moo で実装します。
0.08 が15か所に散らばっていて、1か所直すと他とのずれでテストが壊れ、洗い出しに2日かかった。TaxPolicy に税率と計算を集め、変更を1か所に閉じ込める(Shotgun Surgery)。Perl と Moo で実装します。
「将来使うかも」で作った基底クラスやロールが、今は1つの実装のためだけに読まれ続けている。YAGNI に従って、使われていない抽象化を取り除く(Speculative Generality)。Perl と Moo で実装します。
Notifier の中で ServiceLocator に問い合わせるため、何が必要かコンストラクタから分からず、テストの順序で結果も変わる。依存を required な属性で宣言する(Service Locator)。Perl と Moo で実装します。
$order->customer->address->city のように奥の構造まで直接たどると、中間のクラスを変えたとき呼び出し側まで壊れる。handles で直接の隣人にだけ委譲する(Law of Demeter)。Perl と Moo で実装します。
init() や setup() を先に呼ばないと動かない作りは、手順書を読み飛ばした瞬間に本番を落とす。段階ごとに別の型を返し、順番を間違えると呼べない形にする(Temporal Coupling)。Perl と Moo で実装します。
メールも電話番号も金額も Str と Int で持つと、取り違えてもエラーにならず、検証も呼び出し口ごとに散らばる。値に名前と制約を持たせた Value Object にする(Primitive Obsession)。Perl と Moo で実装します。
全メソッドを OrderService へ転送するだけの Manager クラスは、読む人に一段余計に掘らせ、変更も二重に波及する。取り除いて直接呼び、固有の処理だけを残す(Middle Man)。Perl と Moo で実装します。
読み取り専用のクラスが親の save や delete を拒否していて、呼ぶまで壊れていることに気づけない。extends を Role の合成や handles の委譲に置き換える(Refused Bequest)。Perl と Moo で実装します。
「念のため」残した使われないメソッドとコメントアウトが、生きたコードの変更まで止めている。呼び出し元の追跡、deprecation の警告、削除の3手順で片付ける(Dead Code)。Perl と Moo で実装します。
ReportGenerator が Order のデータを取りに行ってばかりで、Order の属性を変えるたびにレポートまで壊れる。メソッドをデータのあるクラスへ移し(Move Method)、必要なら handles で委譲する。Perl と Moo で実装します。