Java | 実際の現場でレビューで指摘されやすい「インクリメントのアンチパターン集」

Java Java
スポンサーリンク

インクリメント/デクリメントのアンチパターン集

では「実務でレビューでよく指摘されるインクリメント/デクリメントのアンチパターン集」をまとめます。


1. 条件式に直接書く

while (i++ < arr.length) {
    System.out.println(arr[i]); // ❌ 範囲外アクセスの危険
}
Java
  • 問題点: 比較とインクリメントが同時に行われ、挙動が直感的でない。
  • 指摘される理由: 可読性が低く、バグを生みやすい。

👉 改善:

while (i < arr.length) {
    System.out.println(arr[i]);
    i++;
}
Java

2. 複雑な式に埋め込む

int b = a++ + ++a + a--;
Java
  • 問題点: どのタイミングで増減するか分かりにくい。
  • 指摘される理由: レビューで「意図が不明」とされる。

👉 改善:

a++;
int x = a;
a--;
int b = x + a;
Java

3. 配列アクセスでの混乱

System.out.println(arr[++i]); // ❌ 最初の要素が飛ぶ
Java
  • 問題点: ++ii++ の違いが曖昧で、意図が伝わらない。
  • 指摘される理由: インデックスのズレによるバグが発生しやすい。

👉 改善:

System.out.println(arr[i]);
i++;
Java

4. インクリメント忘れによる無限ループ

int i = 0;
while (i < 10) {
    // i++ を忘れて無限ループ
}
Java
  • 問題点: 条件が永遠に真のまま。
  • 指摘される理由: 実行時に止まらなくなる。

👉 改善:

for (int i = 0; i < 10; i++) {
    // 安全にループ
}
Java

5. 小さい型でのオーバーフロー

byte b = 127;
b++; // ❌ -128 に戻る
Java
  • 問題点: 型の範囲を超えて予期せぬ値になる。
  • 指摘される理由: 実務では int を使うのが基本。

👉 改善:

int b = 127;
b++;
Java

6. 条件判定と副作用を同時に行う

if (arr[i++] == 100) {
    // i が勝手に増える
}
Java
  • 問題点: 判定とインクリメントが同時に行われ、意図が不明確。
  • 指摘される理由: 条件式に副作用を入れるのは可読性が低い。

👉 改善:

int value = arr[i];
i++;
if (value == 100) {
    ...
}
Java

まとめ

  • 条件式に ++/– を入れない
  • 複雑な式に埋め込まない
  • 配列アクセスは意図を明確に
  • ループは for文で書くと安全
  • 型は int を基本に
  • 条件判定と副作用は分離する

💡 実務レビューでは「動くかどうか」より「読みやすく安全か」が重視されます。
インクリメント/デクリメントは便利ですが、“シンプルに書く”ことが最大の防御策です。

タイトルとURLをコピーしました