🌀

避けたいコーディング例と改善策

2025/01/16に公開

はじめに

プログラミングを学び始めた頃、何が良いコーディングで何が悪いコーディングなのかを理解するのは難しいものです。しかし、良いコーディングの習慣を身につけることで、コードの可読性や保守性、生産性が大幅に向上します。そこで、本記事では、よくある悪いコーディングの例と、具体例を交えて、どのように改善できるのかを解説していきます。


1. 意味が分かる名前をつけよう

1-1. 技術駆動命名

悪い例

public class DataProcessor {
    private String str;
    
    public void proc() {
        // 処理
    }
}
  • 問題点: strprocといった名前は、クラスやメソッドの意図が明確に伝わりません。

良い例

public class CustomerDataProcessor {
    private String customerData;
    
    public void processCustomerData() {
        // 顧客データを処理
    }
}
  • 解説:「何をしているのか」「何のデータを扱っているのか」が名前からすぐに分かると、コードを読む人が迷うことなく意図を理解できます。
    例えば、processCustomerDataという名前にすると、「顧客データを処理する」ことが明確になります。

1-2. 連番命名

悪い例

String data1 = "John";
String data2 = "Doe";
String data3 = "30";
  • 問題点: data1, data2, data3は意味が不明で、データの内容を推測できません。

良い例

String firstName = "John";
String lastName = "Doe";
String age = "30";
  • 解説: 具体的な名前をつけることで、コードを読む人だけでなく、未来の自分も「この変数は何のデータなのか」を一目で理解できます。例えば、firstNameとすれば、そのデータが「名前」であることがすぐ分かります。

2. 深いネストはこうして避けよう!

コードのネストが深くなると、どこで何をしているのかが分かりにくくなります。特に初心者の方にとって、複雑なネストはエラーの原因にもなりがちです。以下の例を見ながら、どのようにシンプルに改善できるか確認してみましょう。

悪い例

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        for (int k = 0; k < 10; k++) {
            System.out.println(i + j + k);
        }
    }
}
  • 問題点: ネストが深くなると、コードの可読性が著しく低下します。

良い例

for (int i = 0; i < 10; i++) {
    processRow(i);
}

private void processRow(int i) {
    for (int j = 0; j < 10; j++) {
        processCell(i, j);
    }
}

private void processCell(int i, int j) {
    for (int k = 0; k < 10; k++) {
        System.out.println(i + j + k);
    }
}
  • 解説: ネストをメソッドに分割することで、コードの構造がシンプルになり、読みやすさが向上します。

3. 重複コードを見つけてスッキリ解消しよう!

悪い例

public double calculateDiscount(double price) {
    if (price > 100) {
        return price * 0.9;
    } else {
        return price;
    }
}

public double calculateSpecialDiscount(double price) {
    if (price > 100) {
        return price * 0.8;
    } else {
        return price;
    }
}
  • 問題点:
    同じ構造のコードを繰り返すと、変更が必要になったときにすべての箇所を修正しなければならず、
    時間がかかります。また、ミスの原因にもなります。そのため、共通部分を1つのメソッドにまとめるのが
    効果的です。

良い例

public double calculateDiscount(double price, double discountRate) {
    if (price > 100) {
        return price * discountRate;
    } else {
        return price;
    }
}

public double calculateSpecialDiscount(double price) {
    return calculateDiscount(price, 0.8);
}
  • 解説: 共通部分をメソッドに抽出することで、重複を避け、保守性を高めています。

4. コードの読みやすさとは

コードの読みやすさは、他人や未来の自分がコードを理解しやすくするために欠かせない要素です。

  • 自問自答を習慣化する:
    書いたコードを見返し、「このコードは理解しやすいか?」と自問しましょう。

  • 半年後の自分でも理解できるコード:
    書いた直後は理解できても、時間が経つと意図を忘れることがあります。半年後の自分が見ても分かるように意識しましょう。


5. 名前に情報を詰め込む

5-1. 汎用的な名前を避ける

悪い例

String tmp = "データ";
  • 問題点: tmpという名前では、何を意味するのか全くわかりません。

良い例

String customerName = "データ";
  • 解説: 名前に具体的な情報を含めることで、変数の役割が一目でわかります。

5-2. 単位を名前に含める

良い例

int responseTime_ms = 123;
  • 解説: 変数名に単位を含めることで、数値が何を表しているのかが明確になります。

6. 誤解されない名前をつける

名前は、コードを読む人に誤解を与えないように注意する必要があります。

6-1. 曖昧な名前を避ける

悪い例

List<String> filteredList = filter(list);
  • 問題点: filterという名前では「選択」なのか「除外」なのかが曖昧です。

良い例

List<String> selectedItems = selectItems(list);
  • 解説: 動詞を具体的にすることで、意図が明確になります。

7. コードの美しさ

7-1. 空行で段落を分ける

コードの読みやすさを向上させるために、関連する処理ごとに空行を挟んで段落分けを行いましょう。

良い例

public void processOrder() {
    checkStock();

    calculateTotalPrice();

    shipOrder();
}

7-2. 一貫性を保つ

コード内での要素の並びは、一貫性を持たせることが重要です。

悪い例

int a = 10;
int c = 30;
int b = 20;

良い例

int a = 10;
int b = 20;
int c = 30;
  • 解説: 並び順を統一することで、予測しやすくなります。

8. コメントすべきこと

8-1. コメントは必要なところだけ

コードを読めばすぐに分かる内容にコメントをつける必要はありません。

悪い例

int count = 10; // カウントを10に設定

良い例

int maxRetryCount = 10; // 最大リトライ回数
  • 解説: 読者が「なぜこの値なのか」と疑問に思う箇所にコメントを付けましょう。

9. コメントは正確で簡潔に

9-1. 曖昧な言葉を避ける

悪い例

// これを処理
process(data);

良い例

// 顧客データを処理
process(customerData);

9-2. 関数の動作を正確に説明

良い例

/**
 * 顧客データを検証し、不正な場合は例外をスローする。
 * @param customerData 検証する顧客データ
 */
public void validateCustomerData(Customer customerData) {
    // 実装
}
  • 解説: コメントは簡潔でありながらも、正確に機能を説明するように心がけましょう。

Discussion