← eli5

ELI5

切替の
あとかたづけ

となりの部屋へ移るとき、前の部屋の片づけをしていなかった話。

01

プロジェクトは「閲覧室」

アプリの中のプロジェクトを、図書館の閲覧室だと思ってください。部屋にはあなた専用の記録カード(最近開いたページ)と、ドアの名札(いま誰が居るか)があります。

閲覧室 A 記録カード 名札 退出 片づけたあと カードを閉じ、名札を外す
部屋を出るときは、カードをしまい、ドアの名札を外す。これが「あとかたづけ」。
02

移るときだけ、片づけが飛んでいた

片づけは「建物を出るとき」にだけ動く作りでした。部屋から部屋へ移るのは建物を出たことにならないので、何も片づかないまま次の部屋に入っていました。

期待 部屋 A 片づけ 部屋 B 実際 部屋 A 片づけ 部屋 B 素通り
部屋の移動では「退出」の処理が呼ばれず、片づけの箱ごと素通りしていた。
03

Aの記録が、Bのカードに書かれた

カードを持ったまま次の部屋に入ったので、その部屋には存在しないページが記録として書き込まれました。ドアの名札も A に残ったままで、同僚からはまだ A に居るように見えていました。

部屋 B の記録カード bf9fed39 B の Home 65331068 A のページ 56c06ca0 A のページ 649c9b61 A のページ 部屋 A のドア あなた (居ない) 名札が残る
4枠のうち3枠が「開けないページ」で埋まる。A のドアには居ないはずの名札が残る。
04

直し方 ① 入る前に、片づける

次の部屋の準備を始める場所で、「前の部屋がまだ開いていたら先に閉じる」を一箇所だけ足しました。ここは部屋を移るどの入口からも必ず通る場所です。

結果: B のカードには B のページだけが並び、A の名札も消えました。

05

ところが、早歩きすると崩れる

A で司書に本を頼んだあと、B、C と足早に移ると、遅れて届いた A の本が、いま居る C の棚に入ってしまいます。返事が届く順番は、頼んだ順番とは限りません。

時間 A で本を頼む B へ移る C へ移る C の棚 C の本 A の本が遅れて届く → C の棚へ 中身が A に戻る
返事の到着順は依頼順と一致しない。古い返事が、いまの部屋の棚を上書きする。
06

直し方 ② 依頼に番号札をつける

頼むときに番号札を渡し、届いた瞬間に「この番号はまだ最新か」を見ます。古ければ棚に入れずに捨てます。番号は部屋ごとではなく依頼ごとなので、A → B → A と戻ってきても、古い A と新しい A を取り違えません。

A の返事 ・ 札 1 C の返事 ・ 札 3 番号を照合 いま = 札 3 古い → 捨てる 最新 → 棚へ
棚に入れる直前に照合するのがポイント。届いてから捨てるのでは間に合わない場所がある。
07

直し方 ③ 退出は、いつでも片づける

片づけには時間がかかり、その間の入室は順番待ちの列に並びます。「誰も居ないなら片づけ不要」と判断すると、列で待っている入室を取り消せません。退出のときは何も確かめずに片づけを呼ぶことにしました。

修正前 片づけ①(処理中) 入室(順番待ち) 退出② →「誰も居ない」 片づけを呼ばない あとから入室が成立して残る 修正後 片づけ①(処理中) 入室(順番待ち) 退出② → 無条件に片づけ 待っている入室も取り消す
「片づける必要があるか」を判断する条件そのものが、取り消しの取りこぼしを生んでいた。
08

いまの状態

B に混入した A のページ
0 件(修正前 3 件)
A に残る名札
0
テスト
14,924 件 通過

実機(ローカルの Firebase エミュレータ)でも、A → B の切替後に B のカードには B のページだけが並び、A のドアの名札が消えることを確認しています。