恒星間貨物船〈オリオール号〉の機関士ダグが持ち込む、Ruby コードの困りごとを、航法士のミラが設計パターンで引き直していく全12話の連載です。分岐が膨らむ、コピペが散らばる、nil を見張る場所が増える。現場でよく出会う形から始まります。
どの話からでも読めます。直す前のコードがどこで破綻するかを追い、直した後の構造と見比べれば十分です。Ruby の細かい機能は、出てきた所でその場で説明します。
このページは目次を兼ねた案内板です。初めてなら「まず読むなら」の3本から、手元に困っているコードがあるなら「困りごとから探す」から選んでください。
まず読むなら
- Strategy — 航路の方針を足すたびに if/elsif が膨らみ、触っていない計算まで狂う回。条件分岐の膨張は多くの現場で出会う困りごとで、連載の型がいちばん素直に出る
- Null Object — 欠測センサーの nil チェックが6か所に並ぶ回。パターン名を知らなくても、Ruby を書くなら明日のコードにそのまま使える
- Observer — 通知先を直接呼んでいて、新設の区画にだけ警報が届かない回。通知先が増えるたびに送り手を開いているコードを抱えているなら、いちばん効く
困りごとから探す
条件分岐が増えて、足すたびにどこかが壊れる
- Strategy — 航路の方針ごとに if/elsif が膨らみ、足すたびに既存の計算が狂う
- State — 状態を文字列と case 文で回し、許されない遷移を通してしまう
- Factory Method — 生成の case 文が2か所に散らばり、新型を足すたび修正が連鎖する
同じ手順がコピペされて、直し漏れが出る
- Template Method — 港ごとに写した寄港手順に、規約改定の修正が行き渡らない
- Facade — 同じ11手続きの呼び出しが7か所に散らばっている
変更が広がる、組み合わせが増える
手を入れられないもの、戻せないものがある
nil・数値・入れ子で、値の扱いが危うい
- Null Object — nil の見張りが6か所に並び、1か所忘れると落ちる
- Value Object — 生の Float で持ち回った単位や座標系が、静かに混ざる
- Composite — 入れ子の箱の重さを、型判定の再帰で数え落とす
全話一覧
- 新しい方針を足すたび、if/elsif が膨らんで既存の航路計算まで壊れる。方針ごとに部品へ分けて差し替える【Strategy】
- 港ごとにコピペした手順に、規約改定の修正が行き渡らない。共通の骨格を親クラスに一本化する【Template Method】
- 通知先をセンサーが直接呼んでいて、新設の区画にだけ警報が届かない。購読の名簿に一斉通知する【Observer】
- プローブの型を足すたび、散らばった case 文を全部直す羽目になる。生成の窓口を1つにまとめる【Factory Method】
- 港ごとに通信規格が違い、増えるたびに交信コード本体の case 分岐を開く。違いを通訳に押し込む【Adapter】
- 保冷・防振・保険の組み合わせごとにクラスを作り、掛け算で増えていく。オプションを1枚ずつ重ねる【Decorator】
- 状態を文字列と巨大な case 文で回し、許されない遷移を通してしまう。状態をクラスにして、書けない場所を作る【State】
- 操作を打ち間違えても、実行済みの操作を戻す手段がコードにない。動作をオブジェクトにして、戻し方も持たせる【Command】
- 手順書は「点検を1回呼ぶ」の1行なのに、コードは11手続きが7か所に散らばる。段取りを1つの窓口に集める【Facade】
- 欠測センサーの nil チェックが6か所に並び、1か所忘れると NoMethodError になる。「何もしない」実装で分岐を消す【Null Object】
- 座標も燃料も生の Float で持ち回り、単位や座標系の取り違えが静かに通る。値を不変の小さなクラスでくるむ【Value Object】
- 箱の中に箱がある船倉の重さを、型判定の再帰で数え落とす。単品も集合も同じ口で答えさせる【Composite】
