操作方法と動作対象という2つの軸を継承とロールで1つにまとめると、同名メソッドの衝突で初期化が狂う。2軸を別々に持って委譲でつなぎ、どちらも独立に増やせるようにする(Bridge)。Perl と Moo で実装します。
isa で相手を見分けて呼び分け、データ復号まで抱え込んだスキャナーを、変換専用のクラスを挟んで整理する。古い側は書き換えない(Adapter)。Perl と Moo で実装します。
罠がないとき undef が返り、呼び出し側の判定漏れで処理が止まる。「何もしない」オブジェクトを返して、undef チェックそのものを不要にする(Null Object)。Perl と Moo で実装します。
ハッシュ展開の浅いコピーで量産すると、複製同士が同じ内部オブジェクトを共有し、1つへの変更が全部に波及する。複製の責任を各オブジェクトに持たせて安全に増やす(Prototype)。Perl と Moo で実装します。
コンストラクタに引数を並べるやり方では、渡し忘れや不正な値のまま未完成のオブジェクトが使われる。組み立て専用のクラスで段階的に作り、完成品だけを渡す(Builder)。Perl と Moo で実装します。
環境ごとに防護服と動力炉を個別に作るため、砂漠用と氷雪用がちぐはぐに組み合わさる。部品一式を作る工場ごと切り替えて、不整合を作れなくする(Abstract Factory)。Perl と Moo で実装します。
暗闇なら灯り、岩ならツルハシと、環境ごとに道具を作り分ける if/elsif が本体に居座っている。生成を切り出して、環境を足しても本体を触らずに済むようにする(Factory Method)。Perl と Moo で実装します。
認証情報を書き込んだオブジェクトと、ゲートが参照するオブジェクトが別物で、状態が食い違う。インスタンスを1つに保って解消する(Singleton)。Perl と Moo で実装します。
GoF のデザインパターン23種と Null Object を、遺跡のコードを直す冒険として1話ずつ書いた全24話の目次です。実装は Perl と Moo です。
レシピ指示の追加で if/elsif が泥沼化した文字列解析を、文法をオブジェクト化した式ツリーに置き換える。既存コードを直さずに指示を足せるようにする(Interpreter)。Perl と Moo で実装します。
Singleton がテストを難しくし、並列実行で状態を汚す。その危うさを確かめたうえで、依存性注入(DI)に置き換えて堅牢でテストしやすい形にする(Singleton)。Perl と Moo で実装します。
大量の注文データでメモリが肥大化して OOM になる。変わらないメニュー情報を共有し、注文ごとに違う情報は外から渡す形にする(Flyweight)。Perl と Moo で実装します。
同じ設定のオブジェクトを毎回 new で生成し、初期化コストが跳ね上がる。Storable::dclone による深いコピーと Moo の writer で、安全に複製する(Prototype)。Perl と Moo で実装します。
新しい操作を追加するたびにすべての食材クラスを改修することになる。既存クラスを変えずに操作を足せるよう、操作を別クラスに出して巡回させる(Visitor)。Perl と Moo で実装します。
メニューを追加するたびにクラスファイルが倍々に増える「継承爆発」。調理法クラスが食材ロールを委譲で持つ形にして、2つの軸を独立に増やせるようにする(Bridge)。Perl と Moo で実装します。