AIが書いた「割り算でステータス判定」が話題に
Claude Opus 4.7が生成したJavaのコードに、こんな一行がありました。
if (response.statusCode() / 100 != 2) {
// エラー処理
}これを見た開発者の反応は真っ二つに分かれました。「賢い、自分もよく使う」派と「読みにくい、何やってるか一瞬わからない」派。エンジニアの間で大きな議論を呼びました。
そもそもこのコードは何をしているのか? HTTPステータスコードの基本から整理してみましょう。
そもそもHTTPステータスコードとは? ― 3桁の数字のルール
HTTPステータスコードは、サーバーがクライアントに返す3桁の数字で、リクエストの結果を伝えます。日常的に見る「404 Not Found」や「500 Internal Server Error」がそれです。
重要なのは、この3桁の「百の位」がカテゴリを表しているというルールです。これはHTTPの仕様(RFC 9110)で明確に定義されています。
| 百の位 | カテゴリ | 意味 | 代表例 |
|---|---|---|---|
| 1xx | 情報 | 処理中、続けてください | 100 Continue |
| 2xx | 成功 | リクエストは正常に処理された | 200 OK, 201 Created |
| 3xx | リダイレクト | 別のURLに移動してください | 301 Moved, 304 Not Modified |
| 4xx | クライアントエラー | リクエストに問題がある | 400 Bad Request, 404 Not Found |
| 5xx | サーバーエラー | サーバー側で問題が起きた | 500 Internal Server Error |
つまり、ステータスコードが「成功」かどうかを判定したい場合、百の位が2であるかを確認すればいい。200でも201でも204でも、2xxならすべて「成功」です。
なぜ`/ 100`で判定できるのか
Javaの整数同士の除算は小数点以下が切り捨てられます。この性質を使えば、百の位だけを取り出せます。
200 / 100 = 2 ← 成功
201 / 100 = 2 ← 成功
204 / 100 = 2 ← 成功
301 / 100 = 3 ← リダイレクト
404 / 100 = 4 ← クライアントエラー
500 / 100 = 5 ← サーバーエラーだからstatusCode() / 100 != 2は「2xx(成功)でなければエラー処理する」という意味になります。200だけでなく201や204もまとめて「成功」と判定できるのがこの書き方の利点です。
ただし、言語によっては整数除算にならないことに注意。JavaScriptやPythonの/は浮動小数点の除算なので、200 / 100は2.0になりますが、201 / 100は2.01になって!= 2がtrueに。意図した動作になりません。
// JavaScript: / は浮動小数点除算
201 / 100 // → 2.01(2ではない!)
201 / 100 !== 2 // → true(成功なのにエラー扱いされる)
// 正しくやるならMath.floorで切り捨てる
Math.floor(201 / 100) !== 2 // → false(正しい)Javaのような整数除算が保証される言語でのみ安全に使えるテクニックです。
他の書き方と比較
同じ「2xx判定」を実現する方法は複数あります。それぞれの可読性とトレードオフを見てみましょう。
| 書き方 | 可読性 | 正確性 | 備考 |
|---|---|---|---|
status / 100 == 2 |
△ 知ってれば一瞬 | ◎ | 整数除算の言語のみ |
status >= 200 && status < 300 |
◎ 誰でも読める | ◎ | 最も明示的 |
status == 200 |
◎ | △ 201, 204を見逃す | 厳密には不十分 |
response.ok(fetch API) |
◎ | ◎ | JSのfetch限定 |
isSuccessful()(OkHttp等) |
◎ | ◎ | ライブラリ依存 |
よくやりがちなstatus == 200は、実は不十分です。POSTリクエストで201(Created)が返ってきた時や、DELETEで204(No Content)が返ってきた時にエラー扱いになってしまいます。「成功判定は2xx全体で行う」のが正しいアプローチです。
結局どれを使うべき?
チームで統一するなら、以下の判断がおすすめです。
- ライブラリに判定メソッドがあるなら、それを使う(
response.ok、isSuccessful()等)。最も意図が明確 - 自前で判定するなら、
status >= 200 && status < 300が最も読みやすい。言語を問わず誰でも理解できる / 100方式は間違いではないが、コメントを添えないとチームの可読性が下がる。個人プロジェクトやAI生成コードのレビュー時に「何をやっているか」を知っておくレベルでOK
議論の本質は「正しいか間違いか」ではなく、「チームで読みやすいか」です。どの書き方でも動作は同じ。大事なのは、チーム内でスタイルを統一して迷いをなくすこと。
コード品質の意識を高める関連記事
- 「全部POSTでよくない?」がモヤる人へ|HTTPメソッド使い分けの正論と現場のリアル - HTTPメソッドとステータスコードの設計判断を深掘り
- Claude Codeとは?AI搭載のコーディングアシスタントを徹底解説 - AI生成コードのレビュー観点を持つために
- リリース前に必ず確認!バイブコーディング&非エンジニア向けWebアプリ安全チェックリスト - AI生成コードのセキュリティ・品質チェック
まとめ
- HTTPステータスコードは百の位がカテゴリ。2xxが成功、4xxがクライアントエラー、5xxがサーバーエラー
statusCode / 100 == 2は整数除算で百の位を取り出し、2xx全体を判定するテクニック- 整数除算が保証される言語でのみ有効。JavaScriptでは
Math.floorが必要 status == 200だけでは不十分。201や204を見逃す- チームでの推奨は
status >= 200 && status < 300。言語非依存で最も読みやすい
AI生成コードが増えるにつれて、「見慣れない書き方だけど合ってるの?」と立ち止まる場面は増えていきます。/ 100方式は正しい。でも可読性は好みが分かれる。大事なのは、仕組みを理解した上で「うちのチームではこう書く」と決めておくこと。コードスタイルの議論は正解探しではなく、チームの合意形成です。
