実務シチュエーション4 択難易度 標準

状況

ユーザごとの注文件数を返す処理の PR をレビューしている。users は数万件になる見込みだ。差分の中心は次のコード。

レビューコメントとして最も適切なのは?

for (const user of users) {  const orders = await db.query('SELECT * FROM orders WHERE user_id = ?', [user.id]);  result.push({ user, count: orders.length });}

正答

  1. このループは良くないので、別の書き方に直してください。
  2. 普通はこういう書き方はしないと思うので、見直してください。
  3. for...of より forEach のほうが読みやすいので書き換えてください。
  4. ユーザ数だけクエリが出て遅くなります。GROUP BY で一括集計しませんか。

解説

このコードはユーザ 1 人ごとに 1 回クエリを発行する(N+1 問題)ため、数万件では応答が大きく遅れる。伝わる指摘は「何が起きるか(事実)」「なぜ問題か(理由)」「どう直せるか(提案)」がそろっている。「良くない」「普通は」は根拠がなく、何を直せばよいか分からない。forEach への書き換えは好みの範囲で、しかも await を正しく待たなくなるため、かえってバグを生む。

参考: google.github.io

reviewcommunicationperformance

この問題を含む 実務シチュエーション のテストを制限時間つきで解く

実務シチュエーションクイズへ