困ったコードを、食堂の厨房の仕込みに見立てて1話ずつ直していく全24話の連載です。語り手は食堂で働く見習いエンジニアで、持ち込まれたコードの困りごとを、シェフがデザインパターンで仕立て直す様子を見ていきます。
どの話からでも読めます。実装は Perl と Moo ですが、コードを書ける必要はありません。直す前と後のコードを見比べて、何が変わったかを追えれば十分です。
このページは目次を兼ねた案内板です。初めてなら「まず読むなら」の3本から、手元に困っているコードがあるなら「困りごとから探す」から、全話を公開順に見たいなら「全話一覧」から選んでください。
まず読むなら
- Strategy — 育ちすぎた if/elsif を片付ける回。多くの現場で出会う困りごとで、ほかのパターンを読む足場になる
- Template Method — コピペした手順の修正漏れを防ぐ回。手順の骨格を親クラスに一本化する基本形
- State — 真偽値フラグを重ねて、ありえない状態に入り込む回。フラグが増えてきたコードを抱えているなら読みどころ
困りごとから探す
条件分岐が伸び続けて、触るのが怖い
- Strategy — 割引計算の巨大な if/elsif
- State — フラグの組み合わせで管理する席の状態
- Interpreter — 指示の追加で伸びる文字列解析
- Chain of Responsibility — 店舗ごとにコピーした承認フロー
同じ修正をあちこちに入れていて、1か所漏れる
- Template Method — 同じ骨格をコピペした日報生成クラス
- Factory Method — 複数サービスに散らばった通知の生成コード
- Builder — 2か所に重複した弁当注文のルーティング
- Adapter — 外部モジュールの内部仕様に頼る3サービス
- Proxy — 3つの呼び出し元に散らばった権限チェックとキャッシュ
- Null Object — あちこちに書いた undef チェック
1つ足すと、関係ないはずの所まで直すことになる
- Observer — 通知先を足すたびに通知元を直している
- Mediator — 互いを直接持ち合うステーション
- Decorator — トッピングのたびに2か所を直す
- Bridge — メニューを足すと倍々に増えるクラス
- Visitor — 操作を足すたびに全クラスを改修
- Composite — コースの中にコースが入ると崩れる料金計算
- Facade — 厨房の段取りを全部知っている注文ハンドラ
- Iterator — 内部表現を変えると全部壊れる注文履歴
重い、メモリが尽きる
環境やテストで差が出る
- Abstract Factory — 環境ごとの部品の分岐の書き漏れ
- Singleton — テストしにくく、並列で汚れるグローバル依存
