Featured image of post コードディスパッチャー【Exception Translation】「自分の記録の付け方を疑っていました」〜200が返っても、契約を満たさなければ失敗として扱い直す〜

コードディスパッチャー【Exception Translation】「自分の記録の付け方を疑っていました」〜200が返っても、契約を満たさなければ失敗として扱い直す〜

LLM APIは200 OKのまま契約違反(空・打ち切り・拒否)を返すことがある。例外が上がらず成功として流れる静かな失敗を、独自例外への変換とraise...from eの例外チェーンで検出し直す設計をPython標準ライブラリだけで確かめます。

Featured image of post コードディスパッチャー【Output Contract】「これは障害ですか」に答えられなかった〜揺れてよい範囲を先に決めて、異常だと言えるようにする〜

コードディスパッチャー【Output Contract】「これは障害ですか」に答えられなかった〜揺れてよい範囲を先に決めて、異常だと言えるようにする〜

同じ問い合わせに毎回違う文章が返るLLM応答。揺れを止める代わりに、揺れてよい範囲と許さない範囲を出力の契約として先に決め、判定が揺れに影響されないことをPythonの標準ライブラリだけで確かめます。

Featured image of post コードガーデナー【Factory Method】新しい品種を迎えるたび、同じ分岐にまた手を入れる〜生まれ方は、品種自身に持たせる〜

コードガーデナー【Factory Method】新しい品種を迎えるたび、同じ分岐にまた手を入れる〜生まれ方は、品種自身に持たせる〜

種苗店で働く私が、新品種バジルの入荷登録でピーマンのラベルを壊してしまう。生成ロジックを一つのmatch関数に集約していたせいだと知り、庭師が見せてくれたRustのFactory Methodで、生まれ方そのものを品種ごとに持たせる手入れ。

Featured image of post コードガーデナー【RAII】当番は決めたのに、鉢だけがびしょ濡れか枯れかけになる〜世話係を一人に絞り、離れる瞬間に後片付けまで背負わせる〜

コードガーデナー【RAII】当番は決めたのに、鉢だけがびしょ濡れか枯れかけになる〜世話係を一人に絞り、離れる瞬間に後片付けまで背負わせる〜

訪問介護士の私が、家族で分担する冬越し観葉植物の水やり当番アプリで二重水やりと放置を繰り返す。水やりと記録が別々の関数呼び出しになっているせいだと知り、庭師が見せてくれたRustのDropトレイトで、当番の値が役目を終える瞬間に後片付けまで背負わせる手入れ。

Featured image of post コードガーデナー【Strategy】剪定のやり方が、全部同じ関数に積み上がっていく〜品種ごとの流儀は、任せる場所を持たせる〜

コードガーデナー【Strategy】剪定のやり方が、全部同じ関数に積み上がっていく〜品種ごとの流儀は、任せる場所を持たせる〜

電気工事士から果樹園を継いだ俺が、品種を足すたび肥大化するmatch関数に苦しむ。系統で関数を分ける応急処置は一度効いたが、6品種目でまた同じ場所が詰まった。庭師が見せてくれたRustのStrategyパターンで、品種ごとに任せる場所を持たせる手入れ。

Featured image of post コードナビゲーター【Composite】船倉、箱の中の箱〜重さを尋ねる相手は、1つでいいの〜

コードナビゲーター【Composite】船倉、箱の中の箱〜重さを尋ねる相手は、1つでいいの〜

船倉の総重量計算で、印字と現物合計の差 2.8t を目視で拾う。B-2 の Hash 化された入れ子(深さ3)を、`is_a?` で型判定して手書きで再帰する `TotalWeight` が丸ごと数え落としていた。単品と集合を別扱いする "型コード分岐" の旧航路を、葉と複合が同じ `weight` の口で答える Composite で引き直します。Ruby のダックタイピングと `Enumerable#sum(&:weight)` の連鎖で任意深さを1呼び出しで集計、`<<` で階層を動的に増やしても集計コードは無改変——Minitest で "同じ問いで深さが変わっても答えが返る" ところまで解説します。