Featured image of post コードシェフの仕込み帳 シリーズ目次【困りごとから探す案内板】

コードシェフの仕込み帳 シリーズ目次【困りごとから探す案内板】

厨房の仕込みに見立てて、GoF のデザインパターンで困ったコードを直していく全24話の目次。困りごと別の一覧から、読みたい話を選べます。

困ったコードを、食堂の厨房の仕込みに見立てて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 — 内部表現を変えると全部壊れる注文履歴

重い、メモリが尽きる

  • Flyweight — 大量の注文データで膨らむメモリ
  • Prototype — 毎回 new して重い初期化

環境やテストで差が出る

  • Abstract Factory — 環境ごとの部品の分岐の書き漏れ
  • Singleton — テストしにくく、並列で汚れるグローバル依存

変更を元に戻せない

  • Command — 取り消しも履歴も持てない操作
  • Memento — 変更前の状態を手でコピーしている

全話一覧

公開日パターンGoF の分類記事
6/3Strategy振る舞い割引の if/elsif が膨らんで、触るのが怖い。割引ごとの部品に分けて差し替える【Strategy】
6/5State振る舞い空席のはずの席が「会計待ち」になる。bool フラグの組み合わせをやめて状態を部品にする【State】
6/7Observer振る舞い注文ステータスが変わるたびに全ステーションへ手で通知している。登録した相手へ自動で伝える【Observer】
6/9Template Method振る舞い日報生成クラス3種が同じ手順をコピペ、直すと修正漏れが出る。共通の流れを親クラスにまとめる【Template Method】
6/9Factory Method生成通知の生成コードが複数サービスに散らばって修正漏れ。new する判断を窓口に集める【Factory Method】
6/10Decorator構造トッピングを足すたびに cost と describe の2か所を直す。包んで機能を重ねる【Decorator】
6/10Adapter構造外部モジュールの内部仕様に頼るコードが3サービスに散って、仕様変更で修正漏れ。変換役を1か所に置く【Adapter】
6/11Composite構造コースの中にコースが入ると料金計算が崩れる。単品もセットも同じ顔で扱って合計する【Composite】
6/11Command振る舞い注文と取り消しが手続きで散らばり、やり直しも履歴も持てない。操作を部品にして undo を持たせる【Command】
6/12Facade構造注文ハンドラが厨房の段取りを全部知っていて、厨房の変更が波及する。窓口を1つ挟む【Facade】
6/12Builder生成弁当注文のルーティングが2か所に重複し、検証の書き忘れでバグが出た。振り分けを詰め役にまとめる【Builder】
6/13Iterator振る舞い注文履歴の中身を配列からファイルに変えたら、使うコードが全部壊れた。1件ずつ渡す窓口を作る【Iterator】
6/13Chain of Responsibility振る舞い店舗ごとに承認フローの関数をコピーして、閾値の変更が反映されない。限度額を持つ担当をつなぐ【Chain of Responsibility】
6/14Proxy構造権限チェックとキャッシュが3つの呼び出し元に散らばり、書き忘れでセキュリティバグ。同じ窓口を持つ代理に任せる【Proxy】
6/14Null ObjectGoF 以外undef チェックが3つの関数に散らばり、書き忘れで実行時エラー。「何もしない」オブジェクトで置き換える【Null Object】
6/15Mediator振る舞いステーション3つが互いを直接持ち合い、1つ足すたびに全クラスを直す。仲介役だけを知る形にする【Mediator】
6/15Memento振る舞い変更前の状態を呼び出し側が手でコピーしていて、項目追加でコピー漏れ。スナップショットは本人に切り出させる【Memento】
6/16Abstract Factory生成staging を足したら Mailer の分岐を書き漏らし、アラートが届かなかった。環境ごとの部品を一式で差し替える【Abstract Factory】
6/16Bridge構造メニューを足すたびにクラスファイルが倍々に増える。調理法と食材の2軸に分けて組み合わせる【Bridge】
6/17Visitor振る舞い新しい操作を足すたびに全部の食材クラスを改修している。操作を別クラスに出して巡回させる【Visitor】
6/17Prototype生成同じ設定のオブジェクトを毎回 new で作って、初期化コストが重い。出来上がったものを clone して増やす【Prototype】
6/18Flyweight構造大量の注文データでメモリが膨らみ OOM になる。共通のメニュー情報を共有して減らす【Flyweight】
6/18Singleton生成Singleton のせいでテストが書けず、並列実行で状態が汚れる。グローバルな依存を DI に置き換える【Singleton】
6/19Interpreter振る舞いレシピ指示を足すたびに文字列解析の if/elsif が伸びる。文法をオブジェクトの式ツリーにする【Interpreter】
comments powered by Disqus
システム開発・AIワークフローのご相談は Meetsource へ
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。