Fableにバグ修正をやってもらった

今回修正した主なバグ


バグをこちらから示したのは1〜3、その他はコードを渡して提案してもらいました。


1. 過去問追加時に要チェック問題の☆が初回表示に反映されない


症状

科目選択画面を開いたとき、要チェック問題の件数が0のまま表示される。一度問題画面に入って戻ってくると正しく表示される。


原因

要チェック問題の保存方式を「index番号」から「問題ID」に移行した際、件数の再計算処理が件数(分母)は更新するのに、集計表の未解答数(分子)を一部のケースで更新していなかった。

具体的には「○か×がついている科目は未解答数を更新しない」という条件分岐があり、回追加後に○×が記録されている科目の未解答数が古い値のまま残っていた。


新しい試験回を追加すると問題の並び順が変わり、「3番目」が別の問題になってしまいます。これを防ぐためIDで管理するようにしたのですが、その移行のタイミングで集計の更新処理が追いついていませんでした。


修正内容

集計表更新部分は、○×を引き継がない仕様なので、常に「○=なし、×=なし、未解答=☆の数」としてリセットするように変更しました。


2. 過去問追加時にAIの回答が引き継がれない


症状

ユーザーが保存したAIの解説(参考情報)が、試験問題を追加したあとに表示されなくなる。


原因その1:クォート文字の除去漏れ

AI.csvをダウンロードして解析するとき、1列目・2列目のダブルクォート(")は除去していたが、3列目の問題IDは除去し忘れていた。

その結果:


保存された問題ID:"A001"(クォートあり)

照合に使う問題ID:A001(クォートなし)


修正後:3列まで処理

また表示側・保存側でも同様に.Trim('"')を追加して、古いデータとの照合も正しく行えるようにしました。


原因その2:原因:スロットのずれ問題

AI回答は_AI_1、_AI_2…という番号付きの保存場所(スロット)に科目や回ごとに保存しています。

試験回を追加すると古い回が削除され、残りが詰められます。

その結果スロット番号と中身の対応が変わり、ユーザーが保存した回答が別のスロットに移ってしまいます。

従来の処理は「今のスロット番号・今のファイルの中だけ」を探すため、移動前のデータを見つけられずそのまま上書きしていました。


修正内容

保存前に全スロットを丸ごと読んで「問題ID→ユーザー保存済みデータ」の辞書を作ります。保存時にはこの辞書で照合するため、スロット番号やファイルが変わっても問題IDで正しく引き継がれます。


3. 要チェック問題の削除が効かなくなっていた


症状

要チェック問題の「削除」ボタンを押すと画面上では0になるが、問題画面に入ると要チェック問題表示が復活し、集計表でも復活している。


原因

上記 によりチェック問題の実体が2箇所に存在するようになったのに、削除処理が古い保存先しか消していなかった。


4. フィルタ表示の二重登録バグ


5. ダウンロード失敗時に「完了」扱いになる


6. 新規作成時のデータ末尾に"0"が2重付加症状


7. ダウンロード完了前にIDが上書きされる


8. AIDatasに前科目のデータが残留


9. その他の小修正


起動時クラッシュ防止:問題数を取得するint.Parseを、失敗しても落ちないint.TryParseに変更

画像の先読み二重起動:同じ先読み処理が2箇所から呼ばれていたのを1箇所に整理


今回の作業を振り返って


今回はコードを渡してFableに全体を読んでもらいながら進めました。

自分では気づいていなかったバグがいくつも見つかりました。