1. はじめに
プログラミングにおけるスタイルは流行ではなく、生存戦略です。Java は巨大なチームで書かれることが多く、各自が「慣れたやり方」で書けば、プロジェクトはすぐにバラバラの断片集になり、作者本人でさえ把握できなくなることがあります。
コードスタイルとは、誰にとっても同じように読みやすくするための規則の集合です。道路標識のようなもので、無視すればたちまち交通は混乱します。
なぜ重要か?
- 可読性: コードは書くより読む回数の方が多いもの。悪いスタイルは判読不能な医者の字のようなものです。
- 保守性: 規約に沿って書かれたコードは変更しやすく、うっかり何かを壊す確率も低くなります。
- 共同作業: チームでは、余計な質問なしに互いのコードを理解できることが大切です。
- ツール: 自動整形や静的解析は、スタイルが統一されているほど効果を発揮します。
2. コードスタイルの主な落とし穴(回避方法)
インデントと波かっこの扱いの不備
誤り:
インデントがなく、波かっこがバラバラだと目にも頭にもつらい。
if(x>0){
System.out.println("x は正の数です");
}else{
System.out.println("x は正の数ではありません");
}
正しい例:
if (x > 0) {
System.out.println("x は正の数です");
} else {
System.out.println("x は正の数ではありません");
}
コメント:
ネストの各レベルにスペース4個を使いましょう(Java の標準)。チーム全体で合意しない限り、タブは避けましょう。
変数・メソッド・クラスの命名が不適切
誤り:
int a = 5;
String s = "Vasya";
void f() { /* ... */ }
正しい例:
int age = 5;
String userName = "Vasya";
void printReport() { /* ... */ }
コメント:
名前は意味が通り、変数やメソッドの役割を表すべきです。
- クラスは先頭大文字の CamelCase: UserAccount。
- メソッドと変数は先頭小文字の camelCase: calculateSalary、userList。
メソッドやクラスが長すぎる
誤り:
100行のメソッド、1000行のクラスは、保守における本当の nightmare mode です.
正しい例:
各メソッドは一つのことだけを行い、短く保ちましょう(理想は画面1ページに収まること)。クラスも『戦争と平和』のような長さにならないように。
例:
悪い例:
public void processOrder() {
// 200 行のコード
}
良い例:
public void processOrder() {
validateOrder();
calculateTotal();
saveToDatabase();
sendEmailConfirmation();
}
マジックナンバーやマジック文字列の使用
誤り:
if (status == 42) {
// ...
}
正しい例:
public static final int STATUS_APPROVED = 42;
if (status == STATUS_APPROVED) {
// ...
}
コメント:
「マジック」な数値や文字列の代わりに定数(static final)を使いましょう。最近の Java には enum もあるので、取り得る値が限られている場合は enum を使うのが適切です。
コメント:不足または過剰
誤り 1:
コメントが全くない — 複雑なコードの意図が分かりません。
誤り 2:
明らかな処理にまで一つ一つコメントを書く。
// x を 1 増やす
x = x + 1;
// x が 10 に等しいかを確認する
if (x == 10) {
// ...
}
このようなコメントは邪魔なだけです!コメントは複雑または自明でない箇所に限定しましょう。理想的には、良いコードはコメントがなくても理解でき、コメントは「何を」ではなく「なぜ」を説明するために必要です。
// VIP 顧客の割引を考慮する
double total = calculateTotalWithDiscount();
3. Java の規約: プロはこう書く
Java には公式および事実上のコード整形標準があります。Oracle Java Code Conventions と Google Java Style Guide が最も一般的です。
インデントと波かっこ
開き波かっこは宣言と同じ行に置きます:
public void print() {
// ...
}
ネストはスペース4個。
命名
- クラスとインターフェース: 先頭大文字の CamelCase(Person、UserAccount)。
- メソッドと変数: 先頭小文字の camelCase(calculateSalary、userList)。
- 定数: すべて大文字+アンダースコア(例: MAX_SIZE、DEFAULT_TIMEOUT)。
- パッケージ: 小文字のみ、ドット区切り可(com.example.project)。
スペース
演算子の前後とカンマの後にスペースを入れます:
int sum = a + b;
System.out.println(name, age);
開き括弧の直後と閉じ括弧の直前にはスペースを入れません:
if (x > 0) { ... }
行の長さ
1 行は 100〜120 文字を超えないのが推奨です。(大きなモニターを使っていても、横に長く流れない方が読みやすいのです。)
クラスメンバーの宣言順序
(Oracle 推奨)順序:
- フィールド(まず static、次にインスタンス)
- コンストラクタ
- メソッド
例:
public class User {
private static int userCount;
private String name;
public User(String name) {
this.name = name;
userCount++;
}
public String getName() {
return name;
}
}
4. 例: 悪いスタイルのリファクタリング
現場で実際に遭遇しそうなクラスの例です:
class person{String n;int a;void p(){System.out.println(n+" "+a);}}
どこかのオフィスで、このコードを見て Java 開発者が泣いています。
改良しましょう:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void print() {
System.out.println(name + " " + age);
}
}
何が変わったか:
- クラスとメンバーに適切なアクセス修飾子を付与。
- 意味のある読みやすい名前。
- 各クラスメンバーは新しい行から。
- 初期化にコンストラクタを使用。
- フィールドは private とし、カプセル化を維持。
5. 役立つ小ネタ
自動フォーマッタ
最新の IDE(IntelliJ IDEA、Eclipse、VS Code)は規約に沿って自動整形できます。
ショートカット:
- IntelliJ IDEA: Ctrl + Alt + L
- Eclipse: Ctrl + Shift + F
静的解析
Checkstyle、SonarLint、PMD のようなツールは、プログラムを実行する前にスタイル違反や潜在的な不具合を見つけるのに役立ちます。
例えば:
- Checkstyle は、変数名が x のような曖昧な名前だと、userAge にすべきだと指摘します.
- SonarLint は、メソッドが長すぎたり、クラスが SOLID 原則に反している場合に指摘します。
責務分割と「クリーン」コード
- 各クラスは一つの責務だけを持つ(Single Responsibility Principle)。
- クラスやメソッドを増やすことを恐れないでください — それは「肥大化」ではなく、将来の読者への配慮です。
- コードの重複は避けましょう。似た断片を見つけたら、共通のメソッドに切り出します。
定数とマジックナンバー:正しい扱い方
次のように書く代わりに:
double price = 100 * 0.18;
この方が良い:
public static final double VAT_RATE = 0.18;
double price = 100 * VAT_RATE;
固定された値の集合が頻出するなら enum を使いましょう:
public enum Status {
NEW, IN_PROGRESS, DONE
}
6. スタイルと可読性に関する典型的なミス
エラー №1: code conventions の無視。
チームでスタイルが統一されていないと、コードはすぐに読みにくくなり、保守が困難になります。一人で書いている場合でも、1 年後の自分が感謝するはずです。
エラー №2: 名前が短すぎる/長すぎる。
変数 a や temp はよくありません。theCurrentUserNameThatIsUsedForAuthorizationInTheSystem のような極端に長い名前も避けましょう。バランスを取りましょう: userName、age、bookList。
エラー №3: マジックナンバー。
数値や文字列をコードに直書きすると、保守性が下がり、ミスの確率が上がります。
エラー №4: 巨大なメソッドやクラス。
メソッドが大きいほど、テストも理解も難しくなります。論理的な部分に分割しましょう。
エラー №5: クラス構造が悪い。
フィールドがあちこちに散らばり、メソッドの宣言順もバラバラ — これでは目的の場所を素早く見つけられません。
エラー №6: コメントの過剰または不足。
int x = 0; の横に「変数の初期化」と書く必要はありません。複雑なビジネスロジックを説明するコメントはとても重要です。
エラー №7: 一貫性のないフォーマット。
プロジェクトの一部ではスペース4個、別の部分ではタブ、こちらでは波かっこが改行後、あちらでは同じ行 — 見た目がだらしなく、同僚を苛立たせます。
GO TO FULL VERSION