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 で解説します。

Featured image of post 手順書は「点検を1回呼ぶ」の1行なのに、コードは11手続きが7か所に散らばる。段取りを1つの窓口に集める【Facade】

手順書は「点検を1回呼ぶ」の1行なのに、コードは11手続きが7か所に散らばる。段取りを1つの窓口に集める【Facade】

同じ11手続きの呼び出しが7か所に散らばり、下位の順序が変わるたびに全部を直す羽目になる。段取りを PreflightCheck に集約する Facade を、キーワード引数の既定値による依存注入で Ruby に実装します。

Featured image of post 操作を打ち間違えても、実行済みの操作を戻す手段がコードにない。動作をオブジェクトにして、戻し方も持たせる【Command】

操作を打ち間違えても、実行済みの操作を戻す手段がコードにない。動作をオブジェクトにして、戻し方も持たせる【Command】

キーストロークの打ち間違いで実行済みの yaw や thrust を戻せず、日誌にも「yaw変更」としか残らない。動作を実行と取り消しを持つオブジェクトにし、履歴スタックで巻き戻す Command を Ruby で実装します。

Featured image of post 状態を文字列と巨大な case 文で回し、許されない遷移を通してしまう。状態をクラスにして、書けない場所を作る【State】

状態を文字列と巨大な case 文で回し、許されない遷移を通してしまう。状態をクラスにして、書けない場所を作る【State】

接舷シーケンスの状態を文字列と case 文で管理し、書き漏らしから許されない遷移が通る。状態をクラスに引き上げ、飛び越しを構造的に書けなくする State を Ruby で実装します。