「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 → 戦略パターン を段階的に理解しながら実装できます。
