Javaプログラミング品質向上:完全ガイドライン&チェックリスト
保守性の高いJavaコードを書くための改善テクニックと、セルフレビューに使えるチェックリストを網羅しました。
1. 変数と型(設計とルール)
● 変数名に型の情報を含めない
静的型付け言語であるJavaでは、変数名から型を排除し、意味に集中します。
// Bad: String strName, int intCount
// Good: String name, int count
● マジックナンバーには名前をつける
生の数字は意味不明な「マジック」になります。定数で意味を定義しましょう。
// Bad: if (status == 1)
// Good:
public static final int STATUS_ACTIVE = 1;
if (status == STATUS_ACTIVE) { ... }
● スコープの最小化と再利用の禁止
変数は使う直前で宣言し、別の目的で使い回さないようにします。
// Good:
for (User user : users) { ... }
// 別の目的の計算は、新しい変数で行う
double totalPrice = items.stream().mapToDouble(Item::getPrice).sum();
2. 制御構造(分岐・繰り返し)
● ガード句によるネストの回避
正常ケースをifの主ルート(ネストの外側)に置くため、異常系を先にreturnさせます。
// Good:
if (input == null) return;
if (input.isEmpty()) return;
// ここからメインロジック(ネストが浅い)
● 添え字ループではなくイテレーション
添え字(i)の管理ミスによるバグを物理的に防ぎます。
// Good:
for (String element : list) {
process(element);
}
● switch-caseでのdefault処理
default節は「例外的なケース」を捕捉するために利用し、意図しない値への対策を徹底します。
switch (type) {
case A -> processA();
default -> throw new IllegalArgumentException("不正な種別です: " + type);
}
3. クラス・メソッド・設計
● メソッドの分割と引数のオブジェクト化
引数が多すぎる(目安4つ以上)場合は、引数自体をオブジェクト(Dto)にまとめます。
// Good:
public void registerUser(UserRegistrationRequest request) { ... }
● 属性・メソッドが多すぎるクラスの分割
「単一責任の原則」に基づき、責務が多すぎる場合はクラス自体を分割することを検討します。
4. 演算・配列・安全性
● ゼロ除算の考慮と型変換の明示
// Good:
if (count != 0) {
double average = (double) sum / count; // 明示的なキャスト
}
● 配列の境界チェック
配列サイズを超えたアクセスを避けるため、ロジックを慎重に設計します。
5. スタイル・コメント・IO
● try-with-resourcesによる確実なクローズ
try (var stream = Files.lines(path)) {
stream.forEach(System.out::println);
} catch (IOException e) {
logger.error("ファイルの処理に失敗", e);
}
● コードの意図をコメントにする
「何をしているか」はコードが語ります。コメントは「なぜこの方法を選んだか」という意図を書きます。
0 件のコメント:
コメントを投稿