削除した要素を記憶の推定値で挿し戻す逆操作では、元の長さや角度に戻らず、戻すたびに全体のバランスが悪くなる。変更前の状態そのものを、中身を外へ漏らさずに預けておく Memento を Rust で実装します。
生育段階を bool フラグ3つで持つと、ありえない組み合わせが生まれ、直しても呼び忘れた経路からまた出てくる。enum と match で状態を1つに決め、不正な組み合わせを型で作れなくする State を Rust で実装します。
株1つ用と花壇まるごと用で関数を分けていると、寄せ植え鉢のような「まとまりの中のまとまり」を入れる余地が無い。単体も集まりも同じトレイトで再帰的に扱う Composite を Rust で実装します。
生成ロジックを1つの match 関数に集めていると、新品種を足す変更で無関係な既存品種の表示まで壊れる。生成のしかたを品種ごとの実装に持たせる Factory Method を Rust で実装します。
水やり関数と記録関数を別々に呼ぶ作りでは、記録の呼び忘れや二重実行をコードが止められない。当番を表す値がスコープを抜ける瞬間に記録まで済ませる Drop トレイト(RAII)を Rust で実装します。
品種ごとの剪定ルールを match に積み上げると、収穫時期で関数を分けても6品種目でまた同じ関数が膨らむ。品種ごとの判定をトレイトの実装として分けて持たせる Strategy を Rust で実装します。
耐寒カバーと自動潅水、機能の組み合わせごとに構造体を書き足すと数が掛け算で増える。Self を返すトレイトが dyn で使えない壁も越えて、Box<dyn Trait> で外側から包む Decorator を Rust で実装します。
鉢サイズと水やり頻度、どちらも u32 の位置引数を入れ違えても、コンパイラは何も言わずに通してしまう。値に名前を付けて一つずつ積み、最後に一度だけ組み立てる consuming builder を Rust で実装します。
「コードガーデナー」シリーズ全12回の案内板です。手入れの行き届かなくなった Rust のコードを、寡黙な庭師と見習いのヒバリが剪定や接ぎ木のように整えていく連載を、困りごとから探せます。
船倉の総重量が、入れ子の箱を is_a? で判定する手書きの再帰で数え落とされ、2.8t ずれていた。単品と集合が同じ weight で答える Composite に引き直し、任意の深さを1回の呼び出しで集計する設計を Ruby で実装します。
座標と燃料量が裸の Float のまま渡され、単位や座標系を取り違えても数値としては通ってしまう。値を不変の小さなクラスにくるむ Value Object を、Ruby 3.2 以降の Data.define と Minitest で実装します。
一部のセンサーが欠測するだけで、集計側に if sensor.nil? が6か所並んでいた。本物と同じ口を持つ「何もしない」NullSensor で分岐を消し、隠してよい nil と隠してはいけない nil の線引きまで Ruby と Minitest で解説します。
同じ11手続きの呼び出しが7か所に散らばり、下位の順序が変わるたびに全部を直す羽目になる。段取りを PreflightCheck に集約する Facade を、キーワード引数の既定値による依存注入で Ruby に実装します。
キーストロークの打ち間違いで実行済みの yaw や thrust を戻せず、日誌にも「yaw変更」としか残らない。動作を実行と取り消しを持つオブジェクトにし、履歴スタックで巻き戻す Command を Ruby で実装します。
接舷シーケンスの状態を文字列と case 文で管理し、書き漏らしから許されない遷移が通る。状態をクラスに引き上げ、飛び越しを構造的に書けなくする State を Ruby で実装します。