staging を追加したときに Mailer の分岐を書き漏らし、アラートが届かなかった。環境ごとの Logger と Mailer を一式で提供するファクトリを差し替える形にする(Abstract Factory)。Perl と Moo で実装します。
レシピ管理アプリで呼び出し側が変更前の状態を手でコピーしていて、serving_size を足したときに1か所コピー漏れが出た。Recipe 自身がスナップショットを作り、履歴はスタックで管理する(Memento)。Perl と Moo で実装します。
GrillStation・FryStation・DrinkCounter が互いを直接保持していて、ステーションを足すたびに全クラスを修正する。全員が KitchenCoordinator だけを知るスター型の構造にする(Mediator)。Perl と Moo で実装します。
undef チェックが3つの関数に散らばり、1か所の書き忘れが実行時エラーになる。本物と同じ Moo::Role を持つ「何もしない会員」で undef を置き換え、defined チェックをなくす(Null Object)。Perl と Moo で実装します。
権限チェックとキャッシュが3つの呼び出し元に散らばり、1か所の書き忘れがセキュリティバグになる。本物と同じ check_stock を持つ代理クラスに認可とキャッシュを任せ、呼び出し元は差し替えるだけにする(Proxy)。Perl と Moo で実装します。
承認フローを店舗別に関数コピーしていて、閾値を変えても反映されずバグになる。限度額を属性に持つハンドラを実行時につなぎ、コピーなしに店舗別のルールを作る(Chain of Responsibility)。Perl と Moo で実装します。
注文履歴を配列で持つクラスの内部をファイルに変えたら、それを使う全コードが壊れた。「1件ずつ渡す窓口」を作り、内部表現を変えても外に波及しないようにする(Iterator)。Perl と Moo::Role で実装します。
弁当注文システムのルーティングループが2か所に重複し、検証の書き忘れでバグが出た。add_item が振り分けを一手に引き受ける詰め役クラスにまとめる(Builder)。Perl と Moo で実装します。
注文ハンドラが厨房の仕込み・加熱・盛り付けを直接呼んでいて、厨房の内部を変えるたびに呼び出し元まで影響を受ける。窓口クラスを1つ挟んで段取りを隠す(Facade)。Perl と Moo で実装します。
「注文する」「取り消す」が手続きとして散らばり、取り消しも履歴も持てない。操作を execute/undo を持つ部品にまとめ、やり直しのきく形にする(Command)。Perl と Moo で実装します。
単品とコースを if で分けて計算していて、コースの中にコースが入ると合計が崩れる。単品もコースも同じ扱いにして、合計を再帰的に求める(Composite)。Perl と Moo で実装します。
外部モジュールの内部仕様への依存が3サービスに散らばり、仕様が変わるたびに修正漏れが起きる。変換役を1か所に集める仲立ちクラスを挟む(Adapter)。Perl と Moo で実装します。
トッピングの追加のたびに cost と describe の2か所を直す必要があり、フラグも増えていく。1つの機能を1クラスにまとめて重ねられるようにし、既存コードを変えずに足せる形にする(Decorator)。Perl と Moo で実装します。
通知の生成コードが複数のサービスに散らばり、直すたびに修正漏れが出る。何を new するかの判断を呼び出し側から切り離し、窓口の追加だけで種類を増やせるようにする(Factory Method)。Perl と Moo で実装します。
日報生成クラス3種が同じ骨格をコピペで持ち、1か所直すと残りで修正漏れが起きる。手順の骨格を親クラスに一本化し、変わる部分だけサブクラスに任せる(Template Method)。Perl と Moo で実装します。