土壌診断・灌漑・施肥の3つのモジュールは、正しい順で呼ばないと過湿の土に肥料を入れてしまう。その順序を知る窓口を1つ用意し、呼ぶ側が順番を覚えなくて済む Facade を Rust で実装します。
品種ごとにコピーした手順関数は、いつの間にか呼び出し順が入れ替わり、前回の日照の値で収穫を判定してしまう。トレイトのデフォルトメソッドで手順の骨格を固定し、品種ごとの差分だけを実装させる Template Method を Rust で実装します。
検知処理の最後に通知関数を直接並べていると、知らせる相手が増えるたびに検知側を書き換えることになる。通知先を登録制にして、検知する側が相手を知らなくて済む Observer を Rust で実装します。
削除した要素を記憶の推定値で挿し戻す逆操作では、元の長さや角度に戻らず、戻すたびに全体のバランスが悪くなる。変更前の状態そのものを、中身を外へ漏らさずに預けておく 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 で解説します。