Java | switch文を戦略パターンにリファクタリングする練習問題」

Java Java
スポンサーリンク

では「練習問題1:注文ステータス管理」の switch文 → 戦略パターン リファクタ解答と解説を順に示します。


元のコード(switch文)

switch (status) {
    case "NEW":
        System.out.println("新規注文を登録しました");
        break;
    case "PROCESSING":
        System.out.println("注文を処理中です");
        break;
    case "SHIPPED":
        System.out.println("注文を発送しました");
        break;
    case "CANCELLED":
        System.out.println("注文をキャンセルしました");
        break;
    default:
        throw new IllegalArgumentException("不明なステータス: " + status);
}
Java

戦略パターンでのリファクタ解答

1. 戦略インターフェース

interface OrderStatusHandler {
    void handle();
}
Java

2. 具体的な戦略クラス

class NewHandler implements OrderStatusHandler {
    public void handle() {
        System.out.println("新規注文を登録しました");
    }
}

class ProcessingHandler implements OrderStatusHandler {
    public void handle() {
        System.out.println("注文を処理中です");
    }
}

class ShippedHandler implements OrderStatusHandler {
    public void handle() {
        System.out.println("注文を発送しました");
    }
}

class CancelledHandler implements OrderStatusHandler {
    public void handle() {
        System.out.println("注文をキャンセルしました");
    }
}
Java

3. コンテキスト(戦略選択)

import java.util.HashMap;
import java.util.Map;

class OrderStatusContext {
    private static final Map<String, OrderStatusHandler> handlers = new HashMap<>();

    static {
        handlers.put("NEW", new NewHandler());
        handlers.put("PROCESSING", new ProcessingHandler());
        handlers.put("SHIPPED", new ShippedHandler());
        handlers.put("CANCELLED", new CancelledHandler());
    }

    public static void execute(String status) {
        OrderStatusHandler handler = handlers.get(status);
        if (handler != null) {
            handler.handle();
        } else {
            throw new IllegalArgumentException("不明なステータス: " + status);
        }
    }
}
Java

4. 利用側

public class Main {
    public static void main(String[] args) {
        OrderStatusContext.execute("NEW");       // 新規注文を登録しました
        OrderStatusContext.execute("PROCESSING"); // 注文を処理中です
    }
}
Java

解説

  • switch文の問題点
    • caseが増えるとコードが肥大化する。
    • フォールスルーの危険がある。
    • 責務が集中してテストしづらい。
  • 戦略パターンのメリット
    • 各ステータスごとにクラスを分けるので責務が明確。
    • 新しいステータス追加時はクラスとMap登録だけで済む。
    • 単体テストが容易(例:NewHandlerだけテスト可能)。
    • switch文が消え、可読性・保守性が向上。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました