Featured image of post コードナビゲーター【Value Object】航路計算室、混ざる数字たち〜数字は、単位を着てないと、混ざるの〜

コードナビゲーター【Value Object】航路計算室、混ざる数字たち〜数字は、単位を着てないと、混ざるの〜

座標が生の Float ペア、燃料量が裸の Float で持ち回られ、単位取り違えも座標系混同も「数値としては通ってしまう」静かな事故になっていた。半年前の 0.3 光秒到着ズレ near-miss の航海日誌を読み返し、応急処置が結果は直したが根の位置は値そのものだったと気づく。値そのものを不変の小さなクラスにくるむ Value Object パターンで引き直します。Ruby 3.2+ の `Data.define` で座標系識別子と単位を型に閉じ込め、生成時 raise と演算時 raise の 2 系統で混在を弾き、`Struct` との使い分けまでを Minitest で解説します。

Featured image of post コードナビゲーター【Null Object】欠測センサーの見張り所〜"ない"を、"何もしない"で置くの〜

コードナビゲーター【Null Object】欠測センサーの見張り所〜"ない"を、"何もしない"で置くの〜

外周センサーの一部が欠測しているだけで、集計側には `if sensor.nil?` の見張りが六箇所並び、一箇所書き忘れれば深宇宙で `NoMethodError` が鳴る予告になっていた。呼び出し側の nil チェックを消すために、本物と同じインターフェースを持つ「何もしない」実装 NullSensor を用意する Null Object パターンで引き直します。ダックタイピングと組み合わせて集計側の分岐を消し、`&.`(safe navigation)との役割分担、そして「隠していい nil / 隠してはいけない nil」の線引きまでを Ruby と Minitest で解説します。

Featured image of post コードナビゲーター【Facade】出航前点検、ブリッジに漏れた四系統の作法〜入口は一つでも、部屋は四つ残る〜

コードナビゲーター【Facade】出航前点検、ブリッジに漏れた四系統の作法〜入口は一つでも、部屋は四つ残る〜

出航前点検の手順書は「点検を1回呼ぶ」と1行なのに、実コードのブリッジ側では四系統の呼び出しが11手続き分並び、同じ11手続きが7箇所に散らばっていた。下位の内部順序が変わるたびに7箇所全部を直す羽目になる旧設計を、一枚の窓口 PreflightCheck に段取りを集約する Facade パターンで引き直します。Rubyのキーワード引数のデフォルト値による依存注入で、既定の入口を提供しつつ下位への直接アクセス余地を残す実装を解説します。

Featured image of post コードナビゲーター【Command】操舵訓練で消えた一手〜戻し方を知ってるのは、動かした本人だけ〜

コードナビゲーター【Command】操舵訓練で消えた一手〜戻し方を知ってるのは、動かした本人だけ〜

操舵訓練の一手をキーストロークで打ち間違えたとき、既に実行した yaw と thrust を戻す手段がコードに無く、日誌には "yaw変更" とだけ残っていた。動作をオブジェクトに引き上げ、実行と戻し方の両方をそのオブジェクトが持つ Command パターンを、Rubyの兄弟クラス群と履歴スタックで解説します。

Featured image of post コードナビゲーター【State】接舷シーケンスの飛び越し事故〜順番は、書き並べるものじゃなくて、渡っていくものよ〜

コードナビゲーター【State】接舷シーケンスの飛び越し事故〜順番は、書き並べるものじゃなくて、渡っていくものよ〜

接舷シーケンスの状態を文字列フラグと巨大case文で回した旧設計が、書き漏らしから「許されない遷移」を通してしまう。状態そのものをクラスに引き上げ、書けない場所を作って構造的に防ぐStateパターンを、Rubyのシンボルとダックタイピングで解説します。

Featured image of post コードナビゲーター【Decorator】保冷・防振・保険、掛け算で増えた積荷台帳〜一枚ずつ包んで重ねる航法術〜

コードナビゲーター【Decorator】保冷・防振・保険、掛け算で増えた積荷台帳〜一枚ずつ包んで重ねる航法術〜

積荷の保冷・防振・保険という3オプションを組み合わせごとのサブクラスで表現し、クラス数が指数的に増殖した旧設計を、Decoratorパターンで独立したラッパークラスの重ね掛けに引き直します。Rubyの継承と合成(is-a/has-a)の使い分けを解説します。