本番で動いているコードは、直したつもりが別の所を壊します。通知を直したら課金が止まる、決済を足したら料金計算が落ちる、キャンセルしたはずの注文が発送される。出張整備士が Go のコードに潜む不具合の原因を追い、デザインパターンで整備し直していく全12話の連載です。
どの話からでも読めます。壊れた現場のコードがなぜ壊れたかを追い、整備後の形と見比べれば十分です。
このページは目次を兼ねた案内板です。初めてなら「まず読むなら」の3本から、手元に困っているコードがあるなら「困りごとから探す」から選んでください。
まず読むなら
- God Object — 通知を直したら課金まで壊れる回。1つの塊に何でも持たせた作りが、なぜ直すたびに別の所を壊すのかが分かる。以降の全話の出発点になる
- Strategy — 決済方法を足すたびに巨大な switch を開ける回。分岐を関数値と map で差し替えられる形にする、パターンの基本の型が押さえられる
- Dependency Injection — テストが1行も書けない回。部品を内部で作る癖が、テストのしにくさにどう直結するかを手を動かして確かめられる
困りごとから探す
機能を足すたび、本体を開けて壊してしまう
- God Object — 1つの塊に何でも持たせ、直すと別の所が壊れる
- Strategy — 決済方法を足すたびに switch を開ける
- Observer — 通知を足すと、ポイント付与が止まる
- Template Method — バッチの骨格をコピペして、直しが1本だけ漏れる
テストが書けない、取り違えをコンパイルで止めたい
- Dependency Injection — 本物のDBやAPIを内部で呼んでいて、テストが書けない
- Functional Options — 同じ型の引数を取り違えても、コンパイルもCIも通る
- Value Object — 支援者IDが寄付額として処理される
状態や処理の組み合わせが増えて、分岐や型が爆発する
共通の処理や部品同士のつなぎが、あちこちに散らばる
- Command — ハンドラーに作り付けた処理が、HTTP の外から呼べない
- Middleware — ログや認証の前置きが30個のハンドラーにコピペされている
- Mediator — 部品を分けたのに、つなぎ方が直結のN対Nで絡む
全話一覧
- 通知の改善を入れたら、課金まで壊れた。巨大な1クラスを責務ごとに切り出す【God Object】
- 決済方法を足したら、料金計算が本番で止まった。分岐を差し替え可能にする【Strategy】
- コンパイルもCIも緑なのに、本番だけ停止した。位置渡しをやめ名前で設定を渡す【Functional Options】
- テストが1行も書けない。部品を内部で作るのをやめ、外から受け取る【Dependency Injection】
- キャンセルしたはずの注文が発送された。状態の判断を状態自身に持たせる【State】
- 支援者IDが、そのまま寄付額として処理された。意味の違う値を別の型にする【Value Object】
- 通知を1本足しただけで、ポイント付与が止まった。反応を直書きせず「起きた」と知らせる【Observer】
- 1年前に保管した証跡が、監査の朝に開かなかった。暗号化や圧縮を1枚ずつ重ねる【Decorator】
- 同じ直しが、3本目のバッチにだけ当たらなかった。丸写しの骨格を1本にまとめる【Template Method】
- 共通関数にしても、HTTPの外から呼べない。ハンドラーに作り付けた処理を切り出す【Command】
- リクエストID の形式を変えるのに、30ファイルを直す羽目になった。横断処理を1か所に集める【Middleware】
- キャンセル機能を足したら、確認メールが2通届いた。部品同士の直結をやめ仲介役に集める【Mediator】
