Java | フォールスルーを使わないで同じ挙動を実現するリファクタ例

Java Java
スポンサーリンク

では、ADMIN / USER / GUEST の全ユーザー種別をまとめた処理フロー図を作ります。
左に「フォールスルー switch」、右に「戦略パターン」の比較を並べてみます。


フォールスルー switch                 戦略パターン
─────────────────────────────
userType = "ADMIN"                 userType = "ADMIN"
        │                                  │
        ▼                                  ▼
 ┌─────────┐               ┌──────────────┐
 │ switch開始     │               │ UserFactory.getStrategy │
 └─────────┘               └──────────────┘
        │                                  │
        ▼                                  ▼
 ┌─────────┐               ┌─────────┐
 │ case "ADMIN"   │               │ AdminUser      │
 └─────────┘               └─────────┘
        │                                  │
notifyAdmin()  ← ADMIN 特有              execute()
        │                                  │
        ▼                                  ▼
 フォールスルーで                     ┌──────────────┐
 case "USER" 実行                   │ AdminUser.execute()     │
        │                          │ 1) notifyAdmin()        │
 showMenu()  ← 共通処理             │ 2) showMenu()           │
        │                          └──────────────┘
        ▼                                  │
 switch終了                             処理終了
────────────────
userType = "USER"                  userType = "USER"
        │                                  │
        ▼                                  ▼
 ┌─────────┐               ┌─────────┐
 │ case "USER"    │               │ NormalUser    │
 └─────────┘               └─────────┘
        │                                  │
 showMenu()  ← USER の処理              execute()
        │                                  │
 switch終了                             showMenu()
                                        │
                                        処理終了
────────────────
userType = "GUEST"                 userType = "GUEST"
        │                                  │
        ▼                                  ▼
 ┌─────────┐               ┌─────────┐
 │ case "GUEST"   │               │ GuestUser     │
 └─────────┘               └─────────┘
        │                                  │
 showGuestMenu()                      execute()
        │                                  │
 switch終了                             showGuestMenu()
                                        │
                                        処理終了

解説

  1. フォールスルー switch
    • ADMIN の場合のみ意図的に USER の処理に流れる
    • 読む人は「break がない → 下に流れる」ことを理解しておく必要がある
    • USER / GUEST は独立処理
  2. 戦略パターン
    • 各ユーザー種別の処理は execute() 内にまとめられて完結
    • Main 側では 単一の execute() 呼び出し だけ
    • フォールスルーなし、処理順序が直感的で安全
  3. 全体比較ポイント
    • フォールスルー switch は短く書けるが、意図を知っていないと理解しづらい
    • 戦略パターンは少しクラスが増えるが、拡張性・保守性・テストのしやすさが格段に上がる

希望であれば、この図をさらに 「ユーザーが増えた場合(例: SUPER_ADMIN, MODERATOR)」も簡単に追加できるバージョン にして、
「switch と戦略パターンの拡張性の差」を一目で示すこともできます。

作りますか?

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