インクリメント/デクリメントのアンチパターン集
では「実務でレビューでよく指摘されるインクリメント/デクリメントのアンチパターン集」をまとめます。
1. 条件式に直接書く
while (i++ < arr.length) {
System.out.println(arr[i]); // ❌ 範囲外アクセスの危険
}
Java- 問題点: 比較とインクリメントが同時に行われ、挙動が直感的でない。
- 指摘される理由: 可読性が低く、バグを生みやすい。
👉 改善:
while (i < arr.length) {
System.out.println(arr[i]);
i++;
}
Java2. 複雑な式に埋め込む
int b = a++ + ++a + a--;
Java- 問題点: どのタイミングで増減するか分かりにくい。
- 指摘される理由: レビューで「意図が不明」とされる。
👉 改善:
a++;
int x = a;
a--;
int b = x + a;
Java3. 配列アクセスでの混乱
System.out.println(arr[++i]); // ❌ 最初の要素が飛ぶ
Java- 問題点:
++iとi++の違いが曖昧で、意図が伝わらない。 - 指摘される理由: インデックスのズレによるバグが発生しやすい。
👉 改善:
System.out.println(arr[i]);
i++;
Java4. インクリメント忘れによる無限ループ
int i = 0;
while (i < 10) {
// i++ を忘れて無限ループ
}
Java- 問題点: 条件が永遠に真のまま。
- 指摘される理由: 実行時に止まらなくなる。
👉 改善:
for (int i = 0; i < 10; i++) {
// 安全にループ
}
Java5. 小さい型でのオーバーフロー
byte b = 127;
b++; // ❌ -128 に戻る
Java- 問題点: 型の範囲を超えて予期せぬ値になる。
- 指摘される理由: 実務では int を使うのが基本。
👉 改善:
int b = 127;
b++;
Java6. 条件判定と副作用を同時に行う
if (arr[i++] == 100) {
// i が勝手に増える
}
Java- 問題点: 判定とインクリメントが同時に行われ、意図が不明確。
- 指摘される理由: 条件式に副作用を入れるのは可読性が低い。
👉 改善:
int value = arr[i];
i++;
if (value == 100) {
...
}
Javaまとめ
- 条件式に ++/– を入れない
- 複雑な式に埋め込まない
- 配列アクセスは意図を明確に
- ループは for文で書くと安全
- 型は int を基本に
- 条件判定と副作用は分離する
💡 実務レビューでは「動くかどうか」より「読みやすく安全か」が重視されます。
インクリメント/デクリメントは便利ですが、“シンプルに書く”ことが最大の防御策です。
