インクリメント/デクリメントのリファクタリング例
では「悪いコード → 良いコード」のリファクタリング例を紹介します。実務でありがちな“インクリメント/デクリメントの危険な使い方”を、安全で読みやすい形に直していきましょう。
例1: 複雑な式に埋め込む
悪いコード(読みにくい・バグの温床)
int a = 2;
int b = a++ + ++a + a--;
Java- どのタイミングで増減するか分かりづらい
- レビューで「意図が分からない」と指摘されやすい
良いコード(安全で明確)
int a = 2;
a++;
int temp1 = a; // 先に増やした値を使う
int temp2 = a; // そのまま使う
a--;
int b = temp1 + temp2 + a;
Java👉 意図が一目で分かる。
👉 実務では「一行で書ける」より「誰でも理解できる」が大事。
例2: 条件式にインクリメントを入れる
悪いコード
int i = 0;
while (i++ < arr.length) {
System.out.println(arr[i]);
}
Javai++の評価タイミングで混乱しやすい- 最後に
ArrayIndexOutOfBoundsExceptionが出る可能性
良いコード
int i = 0;
while (i < arr.length) {
System.out.println(arr[i]);
i++;
}
Java👉 条件とインクリメントを分けることで安全。
例3: 配列アクセスでの混乱
悪いコード
int[] arr = {10, 20, 30};
int i = 0;
System.out.println(arr[++i]); // 最初の要素が飛ぶ
Java良いコード
int[] arr = {10, 20, 30};
int i = 0;
System.out.println(arr[i]); // まず使う
i++;
Java👉 「今の要素を使う」か「次の要素を使う」かを明確に分ける。
例4: 無限ループの原因
悪いコード
int i = 0;
while (i < 5) {
System.out.println(i);
// i++ を忘れて無限ループ
}
Java良いコード
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
Java👉 for文にまとめるとインクリメント忘れを防げる。
ベストプラクティスまとめ
- 複雑な式に埋め込まない
- 条件式に直接書かない
- 配列アクセスは意図を明確に
- ループは for文で書くと安全
- 「動くコード」より「読みやすいコード」を優先
💡 実務では「インクリメントをどう書くか」よりも「後から読んだ人が迷わないか」が最重要です。
