Java | 「switch → 戦略パターン」リファクタ練習問題

Java Java
スポンサーリンク

「switch → 戦略パターン」書き換えステップ教材

では、ここまでの内容をまとめて、「switch → 戦略パターン」ステップ別解説教材 を作ります。
プログラミング初心者向けに、順を追って理解できる形式にしています。


1. 目的の理解

元の switch 文の問題点

switch (userType) {
    case "ADMIN":
        logAccess();
        showAdminMenu();
        break;
    case "USER":
        showUserMenu();
        break;
    case "GUEST":
        showGuestMenu();
        break;
}
Java
  • フォールスルーで意図しない処理が発生する可能性
  • 分岐が増えると可読性が低下
  • 新しい条件追加のたびに switch 文を修正する必要あり

戦略パターンのメリット

  • 各条件ごとの処理を クラス化
  • switch 文の複雑さを排除
  • 拡張・テスト・保守が容易

2. ステップ1:インターフェース作成

interface UserStrategy {
    void execute(); // 共通メソッド
}
Java
  • 「どのユーザータイプでも必ず持つメソッド」を定義
  • メソッド名は統一しておくと、mainコードで統一的に呼び出せる

3. ステップ2:条件ごとのクラスを作成

class AdminUser implements UserStrategy {
    public void execute() {
        logAccess();
        showAdminMenu();
    }
    private void logAccess() { System.out.println("アクセスログ記録"); }
    private void showAdminMenu() { System.out.println("管理者メニュー表示"); }
}

class NormalUser implements UserStrategy {
    public void execute() {
        showUserMenu();
    }
    private void showUserMenu() { System.out.println("ユーザーメニュー表示"); }
}

class GuestUser implements UserStrategy {
    public void execute() {
        showGuestMenu();
    }
    private void showGuestMenu() { System.out.println("ゲストメニュー表示"); }
}
Java
  • 各クラスで その条件専用の処理 をまとめる
  • 共通処理はクラス内で呼び出すか、共通メソッドにまとめても良い

4. ステップ3:ファクトリでオブジェクト生成

class UserFactory {
    static UserStrategy getStrategy(String userType) {
        switch (userType) {
            case "ADMIN": return new AdminUser();
            case "USER": return new NormalUser();
            case "GUEST": return new GuestUser();
            default: throw new IllegalArgumentException("不明なユーザー種別");
        }
    }
}
Java
  • ファクトリで ユーザー種別に応じたオブジェクト を返す
  • mainコードから switch を消せる
  • 将来的に Map や DI を使うとさらに可読性向上

5. ステップ4:mainコードを簡潔に

public class Main {
    public static void main(String[] args) {
        String userType = "ADMIN";
        UserStrategy strategy = UserFactory.getStrategy(userType);
        strategy.execute();
    }
}
Java
  • mainコードから条件分岐を完全に排除
  • 新しいユーザータイプが追加されても、mainコードは変更不要
  • フォールスルーの心配もなくなる

6. ステップ5:UML図で整理(ASCII版)

           +----------------+
           |  UserStrategy  |  <<interface>>
           +----------------+
           | + execute()    |
           +----------------+
                   ^
                   |
   ---------------------------------
   |               |               |
+-----------+   +-----------+   +-----------+
| AdminUser |   | NormalUser|   | GuestUser |
+-----------+   +-----------+   +-----------+
| +execute()|   | +execute()|   | +execute()|
+-----------+   +-----------+   +-----------+
       ^
       |
+----------------+
| UserFactory    |
+----------------+
| +getStrategy() |
+----------------+

7. 補足ポイント

ポイント解説
インターフェース共通メソッドを統一して呼び出しやすくする
条件ごとのクラス条件ごとの処理をまとめ、可読性と拡張性を高める
ファクトリ生成処理を一箇所にまとめ、mainからswitchを排除
mainコードシンプルに、戦略オブジェクトの呼び出しだけで処理完結
拡張性新しい条件を追加する場合はクラスとファクトリに追加するだけ

💡 このステップ教材を使えば、初心者でも switch → 戦略パターン を段階的に理解しながら実装できます。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました