Java中級

中級 Javaで学ぶリファクタリング|練習問題編

導入

リファクタリングは、ソフトウェアの内部構造を改善しながら外部の動作を変えない技術です。特に中級エンジニアにとって、実務で遭遇する具体的なシチュエーションを通じてリファクタリングの重要性を理解することが求められます。本記事では、実際の業務でのリファクタリングの一例を挙げ、その過程を詳しく解説します。

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

重要な概念の整理

リファクタリングは単なるコードの整理ではなく、保守性や可読性、再利用性を高めるための手法です。具体的には、以下のようなポイントに注目します。

  • コードの可読性: 他の開発者が理解しやすいコードを書くこと。
  • 重複の排除: 同じコードを何度も書かないようにする。
  • 単一責任の原則: 各クラスやメソッドが一つの責任を持つように設計する。

コード例(Java)


public class Order {
    private List items;

    public Order(List items) {
        this.items = items;
    }

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

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

コードの行ごとの解説

  1. クラス Order は商品リストを保持します。
  2. calculateTotalPrice メソッドは商品の合計価格を計算します。
  3. printReceipt メソッドはレシートを出力しますが、計算処理と出力処理が混在しています。
  4. リファクタリングの目的は、出力処理を別メソッドに分割することです。

練習問題編

以下の練習問題を通じて、リファクタリングの理解を深めてください。

  1. 問題1: 上記のコードをリファクタリングして、出力処理を別のメソッドに分けてください。
  2. 問題2: 商品リストが空の場合の処理を追加してください。
  3. 問題3: 商品の価格を計算する際に、割引を考慮するメソッドを追加してください。

模範解答と解説

  • 問題1の解答: 出力処理を printItem メソッドに分割することで、メソッドの責任を明確にします。
  • 
    public void printItem(Item item) {
        System.out.println(item.getName() + ": " + item.getPrice());
    }
    
  • 問題2の解答: 商品リストが空の場合に適切なメッセージを表示するようにします。
  • 
    if (items.isEmpty()) {
        System.out.println("No items in the order.");
    }
    
  • 問題3の解答: 割引を考慮するメソッドを追加し、合計価格計算を改善します。
  • 
    public double calculateDiscountedPrice(double discount) {
        return calculateTotalPrice() * (1 - discount);
    }
    

まとめ

  • リファクタリングはコードの可読性や保守性を向上させるための重要な技術です。
  • 実務での具体的なシチュエーションに基づいたリファクタリングを行うことで、より実践的なスキルを身につけることができます。