【 マイレース開発記録(12)】detect_zoneの二重定義事件
原因が見えない不具合がいちばん怖い
マイレース開発の中盤、ゾーン判定(追い風 / 慎重 / 楽しさ重視 / 整える)がだいぶ形になってきた頃、
「見た目は動くのに、結果が腑に落ちない」状態に遭遇しました。
- ロジック上は追い風っぽいのに、結果が整えるゾーンになる
- 何度試しても、あるカテゴリだけ違和感がある
- エラーは出ない。落ちない。静かに“変”な結果が出る
いちばん厄介なタイプです。
そしてこの不具合の正体が、タイトル通り――
detect_zone が二重定義されていた事件
でした。
ゾーン判定は「マイレースの核」
マイレースでは、各カテゴリ(仕事/金運/恋愛/健康/勝負)について、
- 速い(fast)かどうか
- 跳ねる(jump)かどうか
この2つの組み合わせでゾーンを決めています。
- fast × jump → 追い風ゾーン
- fast × not jump → 慎重ゾーン
- not fast × jump → 楽しさ重視ゾーン
- not fast × not jump → 整えるゾーン
このゾーンは、UIの表示にも、メッセージにも影響します。
つまり、ここが狂うと「占いとしての意味」が崩れます。
何が起きていたか:関数が“上書き”されていた
原因はシンプルでした。
app.py の中で、同じ名前の関数が 2回定義されていたのです。
Python
def detect_zone(is_fast: bool, is_jump: bool) -> str:
...
Pythonは「後に書かれた定義」が勝ちます。
つまり、上の detect_zone は存在しないのと同じになります。
怖いのはここで、二重定義していても、
- エラーは出ません
- 警告も出ません
- ただ静かにロジックが変わります
“気づけない”のが問題でした。
「修正したのに直らない」地獄が始まる
この手のバグでつらいのは、こういう状態に入ることです。
- detect_zone を直した
- 結果が変わらない
- もう一度直した
- まだ変わらない
- 「キャッシュ?」「反映?」と疑い始める
- でも実は別の detect_zone が動いている
私はまさにこの状態でした。
発達特性もあって、「一度こうだと思ったら」そこに意識が固定されやすく、
“同じ名前がもう一つある”という発想が、すぐには出ませんでした。
AIが「見落としの可能性」を提示してくれたこと
ここでAIに相談したとき、助かったのはコードそのものではなく、
「同名関数が別の場所で定義されていませんか?」
「ファイル内検索で detect_zoneを探してください」
という提案でした。
私は、実装の整合性や条件式のほうを疑っていたので、
“構造の問題”に目が向いていなかったんです。
AIは「ありがちな落とし穴」を候補として出してくれて、私の視野を一段広げてくれました。
解決:detect_zone を1箇所に集約する
やったことは、派手ではありません。
- detect_zone を 1つだけ残す
- 他は削除
- 以後は「判定ロジックはここ」と決める
そして、今後同じ事故を防ぐために、
- 同じ役割の関数名を増やさない
- “コアロジック”は1箇所に集める
- 必要ならコメントで「ここが正」と書く
というルールを、自分の中で決めました。
学び:静かなバグほど、設計が効く
今回の事件でいちばん大きかった学びは、
「エラーが出ないバグほど、整理が効く」
ということでした。
- 関数をどこに置くか
- 名前をどう扱うか
- “正の定義”をどこに置くか
これは技術力というより、開発の作法に近いものですが、実務ではこういう“静かな地雷”を踏まないことが本当に大事だと思っています。
発達特性 × AI活用:私にとっての「安全柵」
この開発ブログでは、うまくいったことだけでなく、“自分が詰まりやすいパターン”も残したいと思っています。
私の場合、
- 目の前の条件式に集中しすぎて、構造を見落とす
- 反映されない=キャッシュだと思い込みやすい
- 同じ箇所を延々いじって消耗する
こういう癖があります。
AIは、答えをくれるというより、
「別の可能性」を提示して、視点を切り替える補助輪になってくれます。
結果として、消耗の連鎖を止められる場面が増えました。
次回予告
次回は、ゾーン判定と並んで苦戦した――
【マイレース開発記録(12)】finish_bonus調整地獄
(ジャンプ補正が“楽しさ”になるまで)
を書いていきます。
「数式が合っているのに、体感が合わない」あの沼の話です・・・


