Featured image of post staging を足したら Mailer の分岐を書き漏らし、アラートが届かなかった。環境ごとの部品を一式で差し替える【Abstract Factory】

staging を足したら Mailer の分岐を書き漏らし、アラートが届かなかった。環境ごとの部品を一式で差し替える【Abstract Factory】

staging を追加したときに Mailer の分岐を書き漏らし、アラートが届かなかった。環境ごとの Logger と Mailer を一式で提供するファクトリを差し替える形にする(Abstract Factory)。Perl と Moo で実装します。

Featured image of post 変更前の状態を呼び出し側が手でコピーしていて、項目追加でコピー漏れ。スナップショットは本人に切り出させる【Memento】

変更前の状態を呼び出し側が手でコピーしていて、項目追加でコピー漏れ。スナップショットは本人に切り出させる【Memento】

レシピ管理アプリで呼び出し側が変更前の状態を手でコピーしていて、serving_size を足したときに1か所コピー漏れが出た。Recipe 自身がスナップショットを作り、履歴はスタックで管理する(Memento)。Perl と Moo で実装します。

Featured image of post ステーション3つが互いを直接持ち合い、1つ足すたびに全クラスを直す。仲介役だけを知る形にする【Mediator】

ステーション3つが互いを直接持ち合い、1つ足すたびに全クラスを直す。仲介役だけを知る形にする【Mediator】

GrillStation・FryStation・DrinkCounter が互いを直接保持していて、ステーションを足すたびに全クラスを修正する。全員が KitchenCoordinator だけを知るスター型の構造にする(Mediator)。Perl と Moo で実装します。

Featured image of post undef チェックが3つの関数に散らばり、書き忘れで実行時エラー。「何もしない」オブジェクトで置き換える【Null Object】

undef チェックが3つの関数に散らばり、書き忘れで実行時エラー。「何もしない」オブジェクトで置き換える【Null Object】

undef チェックが3つの関数に散らばり、1か所の書き忘れが実行時エラーになる。本物と同じ Moo::Role を持つ「何もしない会員」で undef を置き換え、defined チェックをなくす(Null Object)。Perl と Moo で実装します。

Featured image of post 権限チェックとキャッシュが3つの呼び出し元に散らばり、書き忘れでセキュリティバグ。同じ窓口を持つ代理に任せる【Proxy】

権限チェックとキャッシュが3つの呼び出し元に散らばり、書き忘れでセキュリティバグ。同じ窓口を持つ代理に任せる【Proxy】

権限チェックとキャッシュが3つの呼び出し元に散らばり、1か所の書き忘れがセキュリティバグになる。本物と同じ check_stock を持つ代理クラスに認可とキャッシュを任せ、呼び出し元は差し替えるだけにする(Proxy)。Perl と Moo で実装します。

Featured image of post 店舗ごとに承認フローの関数をコピーして、閾値の変更が反映されない。限度額を持つ担当をつなぐ【Chain of Responsibility】

店舗ごとに承認フローの関数をコピーして、閾値の変更が反映されない。限度額を持つ担当をつなぐ【Chain of Responsibility】

承認フローを店舗別に関数コピーしていて、閾値を変えても反映されずバグになる。限度額を属性に持つハンドラを実行時につなぎ、コピーなしに店舗別のルールを作る(Chain of Responsibility)。Perl と Moo で実装します。

Featured image of post 注文履歴の中身を配列からファイルに変えたら、使うコードが全部壊れた。1件ずつ渡す窓口を作る【Iterator】

注文履歴の中身を配列からファイルに変えたら、使うコードが全部壊れた。1件ずつ渡す窓口を作る【Iterator】

注文履歴を配列で持つクラスの内部をファイルに変えたら、それを使う全コードが壊れた。「1件ずつ渡す窓口」を作り、内部表現を変えても外に波及しないようにする(Iterator)。Perl と Moo::Role で実装します。

Featured image of post 弁当注文のルーティングが2か所に重複し、検証の書き忘れでバグが出た。振り分けを詰め役にまとめる【Builder】

弁当注文のルーティングが2か所に重複し、検証の書き忘れでバグが出た。振り分けを詰め役にまとめる【Builder】

弁当注文システムのルーティングループが2か所に重複し、検証の書き忘れでバグが出た。add_item が振り分けを一手に引き受ける詰め役クラスにまとめる(Builder)。Perl と Moo で実装します。

Featured image of post 注文ハンドラが厨房の段取りを全部知っていて、厨房の変更が波及する。窓口を1つ挟む【Facade】

注文ハンドラが厨房の段取りを全部知っていて、厨房の変更が波及する。窓口を1つ挟む【Facade】

注文ハンドラが厨房の仕込み・加熱・盛り付けを直接呼んでいて、厨房の内部を変えるたびに呼び出し元まで影響を受ける。窓口クラスを1つ挟んで段取りを隠す(Facade)。Perl と Moo で実装します。

Featured image of post 注文と取り消しが手続きで散らばり、やり直しも履歴も持てない。操作を部品にして undo を持たせる【Command】

注文と取り消しが手続きで散らばり、やり直しも履歴も持てない。操作を部品にして undo を持たせる【Command】

「注文する」「取り消す」が手続きとして散らばり、取り消しも履歴も持てない。操作を execute/undo を持つ部品にまとめ、やり直しのきく形にする(Command)。Perl と Moo で実装します。

Featured image of post 外部モジュールの内部仕様に頼るコードが3サービスに散って、仕様変更で修正漏れ。変換役を1か所に置く【Adapter】

外部モジュールの内部仕様に頼るコードが3サービスに散って、仕様変更で修正漏れ。変換役を1か所に置く【Adapter】

外部モジュールの内部仕様への依存が3サービスに散らばり、仕様が変わるたびに修正漏れが起きる。変換役を1か所に集める仲立ちクラスを挟む(Adapter)。Perl と Moo で実装します。

Featured image of post トッピングを足すたびに cost と describe の2か所を直す。包んで機能を重ねる【Decorator】

トッピングを足すたびに cost と describe の2か所を直す。包んで機能を重ねる【Decorator】

トッピングの追加のたびに cost と describe の2か所を直す必要があり、フラグも増えていく。1つの機能を1クラスにまとめて重ねられるようにし、既存コードを変えずに足せる形にする(Decorator)。Perl と Moo で実装します。

Featured image of post 通知の生成コードが複数サービスに散らばって修正漏れ。new する判断を窓口に集める【Factory Method】

通知の生成コードが複数サービスに散らばって修正漏れ。new する判断を窓口に集める【Factory Method】

通知の生成コードが複数のサービスに散らばり、直すたびに修正漏れが出る。何を new するかの判断を呼び出し側から切り離し、窓口の追加だけで種類を増やせるようにする(Factory Method)。Perl と Moo で実装します。

Featured image of post 日報生成クラス3種が同じ手順をコピペ、直すと修正漏れが出る。共通の流れを親クラスにまとめる【Template Method】

日報生成クラス3種が同じ手順をコピペ、直すと修正漏れが出る。共通の流れを親クラスにまとめる【Template Method】

日報生成クラス3種が同じ骨格をコピペで持ち、1か所直すと残りで修正漏れが起きる。手順の骨格を親クラスに一本化し、変わる部分だけサブクラスに任せる(Template Method)。Perl と Moo で実装します。