存在しない本を検索すると null で処理が凍りつき、全部を try で囲うと原因が分からなくなる。Kotlin の安全呼び出しと Null Object で「空」を型に乗せて扱う。
会計の割引を足すたびに式が膨らみ、季節割引の客に別の割引が紛れ込む。割引の算法を1つの部品に切り出して差し替え可能にする(Strategy)。Kotlin で実装します。
見習い魔術師ルークの失敗と、師匠の問いから生まれる設計を、Kotlin のコードで追う全12話の目次。困りごと別の一覧から、読みたい話を選べます。
終了シグナルで即座に落とすと、処理中の仕事を切り捨て、接続やロックが解放されないまま残る。新規の受け付けを止め、処理中のものが終わるのを期限つきで待ってから閉じる。TypeScript で実装します。
重い処理が共有の接続プールを使い切り、健全な別機能まで動けなくなる。リソースを機能ごとの枠に分け、片方が溢れても他方の取り分が守られるようにする。TypeScript で実装します。
依存先が落ちると、その応答待ちで自分のリソースが尽き、関係ない機能まで止まる。失敗が続いたら呼び出しを断って代替を返し、頃合いを見て試し、戻ったら再開する。TypeScript で実装します。
push 通知を取りこぼした側が、古い状態のまま戻らない。push に定期取得を足し、バージョンで束ねて、遅れても必ず追いつき、古い通知では状態を戻さないようにする。TypeScript で実装します。
在庫を読んでから書き戻すまでの隙に別の更新が入り、一方の更新が黙って上書きされる(Lost Update)。値にバージョンを持たせ、衝突した側だけ読み直してやり直させる。TypeScript で実装します。
フラグを1つ足すたびに、「待機中かつ実行中」のようなありえない組み合わせが倍に増える。状態を判別可能ユニオンにまとめ、遷移を型で縛る。TypeScript で実装し、足し忘れも型で止めます。
1分あたりの上限を決めても、固定窓の境目をまたぐと上限の2倍が通り抜ける。窓の区切りをやめ、トークンが一定の速さで溜まる Token Bucket に替えて流量を抑える。TypeScript で実装します。
JavaScript はシングルスレッドでも、ロックを取り合う2つの処理が互いを待って永久に止まる。ロックを取る順を全体で揃えて循環を断ち、タイムアウトの限界にも触れる。TypeScript で実装します。
非同期処理を一斉に走らせると、相手の接続を取り合って共倒れになる。同時に通す数を N に絞り、溢れた分は行列で待たせる(Semaphore)。TypeScript で実装し、同時実行数の最大値をテストで確かめます。
相手が落ちるたびに即リトライすると、回復する前にリクエストを使い果たし、再開時に殺到する。待ちを倍に伸ばす指数バックオフと、ばらつきを足す Full Jitter で避ける。TypeScript で実装します。
キャンセルした非同期処理が裏で動き続け、接続やカーソルを握りっぱなしになる。AbortSignal を処理の前・中・待機中の3か所で見るようにして止める。TypeScript で実装します。
非同期処理の途中(await の間)に同じ操作がもう一度入り、二重送信になる。実行中フラグを置く位置を直し、二度目の呼び出しを締め出す。TypeScript で実装し、テストで確かめます。