つくる 予約処理
2つの守りを重ねる
この章で4つを見ました。後回し、キュー、再試行、そして冪等の鍵です。
今回は新しいことを覚えません。冪等の鍵と在庫の確認を、1つの処理の中で順に並べます。
順番が答えを変えます。鍵を先に見ます。
在庫を先に見ると、二度押しの2回目が満席で弾かれます。
1回目で予約は取れているのに、利用者には失敗と表示されます。同じ人の同じ予約が、成功と失敗の両方になります。
鍵を先に見れば、2回目は1回目の結果をそのまま返せます。
断るのと重複は別物
結果は3つに分かれます。作った、重複だった、断った、です。
Python
# 鍵を見た → 重複。1回目の予約IDを返す
# 在庫がある → 作る
# 在庫がない → 断る。予約IDは無い呼ぶ側の次の動きが違います。
重複ならそのまま進んでよい、断ったなら別の席を探すです。まとめると呼ぶ側が判断できなくなり、たいてい間違ったほうに倒れます。
返す形は、受け取る側の次の一手から決めます。
演習
鍵付きの予約要求と残り席数を受け取り、3つに分けた結果と残り席数を返します。
要件
- 先に鍵を見る。すでに見た鍵なら status は "duplicate"、reservation はそのとき返した予約ID。席は減らさない
- はじめての鍵で、seats が残り席数以下なら status は "created"。予約IDは "res-" と作った順の番号。席をその数だけ減らす
- 足りなければ status は "rejected"、reservation は None。席は減らさない
ヒント
編集 ゆめさく編集部