Featured image of post 3つの処理の正しい呼び出し順を、書いた人しか知らない。順番ごと窓口に閉じ込める【Facade】

3つの処理の正しい呼び出し順を、書いた人しか知らない。順番ごと窓口に閉じ込める【Facade】

土壌診断・灌漑・施肥の3つのモジュールは、正しい順で呼ばないと過湿の土に肥料を入れてしまう。その順序を知る窓口を1つ用意し、呼ぶ側が順番を覚えなくて済む Facade を Rust で実装します。

連載 コード庭師 (第11話 / 全12話)
Featured image of post コピペした手順の順番が入れ替わり、古い値で判定していた。骨格を1か所に固定する【Template Method】

コピペした手順の順番が入れ替わり、古い値で判定していた。骨格を1か所に固定する【Template Method】

品種ごとにコピーした手順関数は、いつの間にか呼び出し順が入れ替わり、前回の日照の値で収穫を判定してしまう。トレイトのデフォルトメソッドで手順の骨格を固定し、品種ごとの差分だけを実装させる Template Method を Rust で実装します。

連載 コード庭師 (第10話 / 全12話)
Featured image of post 通知先を1つ増やすたび、検知コードに呼び出しを書き足している。通知を登録制にする【Observer】

通知先を1つ増やすたび、検知コードに呼び出しを書き足している。通知を登録制にする【Observer】

検知処理の最後に通知関数を直接並べていると、知らせる相手が増えるたびに検知側を書き換えることになる。通知先を登録制にして、検知する側が相手を知らなくて済む Observer を Rust で実装します。

連載 コード庭師 (第9話 / 全12話)
Featured image of post 「元に戻す」を推定値の逆操作で書いたら、元の値に戻らない。変更前の状態を保存する【Memento】

「元に戻す」を推定値の逆操作で書いたら、元の値に戻らない。変更前の状態を保存する【Memento】

削除した要素を記憶の推定値で挿し戻す逆操作では、元の長さや角度に戻らず、戻すたびに全体のバランスが悪くなる。変更前の状態そのものを、中身を外へ漏らさずに預けておく Memento を Rust で実装します。

連載 コード庭師 (第8話 / 全12話)
Featured image of post bool 3つで「休眠中なのに開花中」が記録される。状態を enum 1つにする【State】

bool 3つで「休眠中なのに開花中」が記録される。状態を enum 1つにする【State】

生育段階を bool フラグ3つで持つと、ありえない組み合わせが生まれ、直しても呼び忘れた経路からまた出てくる。enum と match で状態を1つに決め、不正な組み合わせを型で作れなくする State を Rust で実装します。

連載 コード庭師 (第7話 / 全12話)
Featured image of post 単体と集まりで関数が別々で、中間の単位を足せない。同じトレイトで再帰的に扱う【Composite】

単体と集まりで関数が別々で、中間の単位を足せない。同じトレイトで再帰的に扱う【Composite】

株1つ用と花壇まるごと用で関数を分けていると、寄せ植え鉢のような「まとまりの中のまとまり」を入れる余地が無い。単体も集まりも同じトレイトで再帰的に扱う Composite を Rust で実装します。

連載 コード庭師 (第6話 / 全12話)
Featured image of post 「実行」と「記録」が別の関数で、片方の呼び忘れが防げない。Drop で必ず記録させる【RAII】

「実行」と「記録」が別の関数で、片方の呼び忘れが防げない。Drop で必ず記録させる【RAII】

水やり関数と記録関数を別々に呼ぶ作りでは、記録の呼び忘れや二重実行をコードが止められない。当番を表す値がスコープを抜ける瞬間に記録まで済ませる Drop トレイト(RAII)を Rust で実装します。

連載 コード庭師 (第4話 / 全12話)
Featured image of post 箱の中に箱がある船倉の重さを、型判定の再帰で数え落とす。単品も集合も同じ口で答えさせる【Composite】

箱の中に箱がある船倉の重さを、型判定の再帰で数え落とす。単品も集合も同じ口で答えさせる【Composite】

船倉の総重量が、入れ子の箱を is_a? で判定する手書きの再帰で数え落とされ、2.8t ずれていた。単品と集合が同じ weight で答える Composite に引き直し、任意の深さを1回の呼び出しで集計する設計を Ruby で実装します。

連載 コード航海士 (第12話 / 全12話)
Featured image of post 座標も燃料も生の Float で持ち回り、単位や座標系の取り違えが静かに通る。値を不変の小さなクラスでくるむ【Value Object】

座標も燃料も生の Float で持ち回り、単位や座標系の取り違えが静かに通る。値を不変の小さなクラスでくるむ【Value Object】

座標と燃料量が裸の Float のまま渡され、単位や座標系を取り違えても数値としては通ってしまう。値を不変の小さなクラスにくるむ Value Object を、Ruby 3.2 以降の Data.define と Minitest で実装します。

Featured image of post 欠測センサーの nil チェックが6か所に並び、1か所忘れると NoMethodError になる。「何もしない」実装で分岐を消す【Null Object】

欠測センサーの nil チェックが6か所に並び、1か所忘れると NoMethodError になる。「何もしない」実装で分岐を消す【Null Object】

一部のセンサーが欠測するだけで、集計側に if sensor.nil? が6か所並んでいた。本物と同じ口を持つ「何もしない」NullSensor で分岐を消し、隠してよい nil と隠してはいけない nil の線引きまで Ruby と Minitest で解説します。