Java中級

中級 Javaで学ぶリファクタリング|ケーススタディ編

導入

ソフトウェア開発の現場では、コードが複雑化するにつれてメンテナンスが困難になることが多い。特に、既存のコードを改善するためのリファクタリングは、エンジニアにとって重要なスキルである。今回は、架空のプロジェクトを通じて、Javaにおけるリファクタリングの具体的な適用例を見ていく。

教科書レベルの解説(リファクタリング)

重要な概念の整理

リファクタリングとは、既存のコードの内部構造を改善しつつ、外部の動作を変更しないようにするプロセスである。これにより、コードの可読性や保守性が向上し、将来的な機能追加や修正が容易になる。リファクタリングにはさまざまな手法があり、具体的な状況に応じて適切な手法を選択する必要がある。

コード例(Java)


public class Order {
    private List items;

    public Order() {
        this.items = new ArrayList<>();
    }

    public void addItem(Item item) {
        items.add(item);
    }

    public double calculateTotal() {
        double total = 0;
        for (Item item : items) {
            total += item.getPrice();
        }
        return total;
    }

    public void printOrder() {
        for (Item item : items) {
            System.out.println(item.getName() + ": " + item.getPrice());
        }
        System.out.println("Total: " + calculateTotal());
    }
}

コードの行ごとの解説

  1. クラス`Order`は、アイテムのリストを管理する。
  2. `addItem`メソッドでアイテムを追加する。
  3. `calculateTotal`メソッドで合計金額を計算するが、ここではリファクタリングの余地がある。
  4. `printOrder`メソッドでアイテム名と価格を出力し、合計金額を表示する。

ケーススタディ編

架空のオンラインストアのプロジェクトを考える。このプロジェクトでは、商品を注文するための`Order`クラスが実装されている。しかし、`calculateTotal`メソッドは、将来的に割引や税金を考慮する必要があるため、現状のままでは拡張性が不足している。ここで、リファクタリングを行うことで、より柔軟な設計に変更することを検討する。

具体的には、`calculateTotal`メソッドを拡張し、割引や税金の計算を別のメソッドに分離する。これにより、将来的に新しい計算ロジックを追加する際に、既存のコードに影響を与えずに済む。


public class Order {
    private List items;

    public Order() {
        this.items = new ArrayList<>();
    }

    public void addItem(Item item) {
        items.add(item);
    }

    public double calculateTotal() {
        return calculateSubtotal() + calculateTax() - calculateDiscount();
    }

    private double calculateSubtotal() {
        double subtotal = 0;
        for (Item item : items) {
            subtotal += item.getPrice();
        }
        return subtotal;
    }

    private double calculateTax() {
        return calculateSubtotal() * 0.1; // 10%税金
    }

    private double calculateDiscount() {
        return 0; // 割引のロジックは後から追加可能
    }

    public void printOrder() {
        for (Item item : items) {
            System.out.println(item.getName() + ": " + item.getPrice());
        }
        System.out.println("Total: " + calculateTotal());
    }
}

このリファクタリングにより、合計金額の計算が明確に分かれたメソッドに整理され、各メソッドが特定の責任を持つようになった。これにより、今後の機能追加が容易になり、コードの可読性も向上する。

まとめ

  • リファクタリングを通じて、コードの可読性と保守性を向上させる。
  • 特定の機能を持つメソッドを分離することで、拡張性が高まる。
  • リファクタリングは、現場で遭遇する具体的なシチュエーションに応じて適用することが重要である。