0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで実装するStateパターン:状態に応じた振る舞いを柔軟に切り替える

Posted at

概要

State(ステート)パターンは、
オブジェクトの内部状態によって振る舞い(メソッドの実装)を変更したいときに、状態をオブジェクトとして抽象化し、切り替える設計パターンである。

条件分岐を減らし、状態ごとの処理を明示的に定義することで、コードの見通しと保守性が劇的に向上する。


1. なぜStateが必要か?

❌ 条件分岐による状態管理はスパゲッティ化しやすい

def handle(user):
    if user.state == "guest":
        ...
    elif user.state == "member":
        ...
    elif user.state == "admin":
        ...

分岐が増えるたびに関係性が複雑になり、修正コストが高くなる


✅ 状態をクラス化して動的に切り替える

user.set_state(MemberState())
user.handle()

状態ごとの振る舞いを独立したオブジェクトとして管理できる


2. 基本構造

✅ Stateインターフェース(振る舞い定義)

class State:
    def handle(self, context):
        raise NotImplementedError

✅ ConcreteState(具体的な状態)

class GuestState(State):
    def handle(self, context):
        print("ゲストとして閲覧のみ可能")

class MemberState(State):
    def handle(self, context):
        print("メンバーとしてコンテンツ閲覧・投稿可能")

class AdminState(State):
    def handle(self, context):
        print("管理者としてすべての操作が可能")

✅ Context(状態の保持と委譲)

class User:
    def __init__(self, state: State):
        self._state = state

    def set_state(self, state: State):
        self._state = state

    def handle(self):
        self._state.handle(self)

✅ 使用例

user = User(GuestState())
user.handle()

user.set_state(MemberState())
user.handle()

user.set_state(AdminState())
user.handle()

出力:

ゲストとして閲覧のみ可能  
メンバーとしてコンテンツ閲覧・投稿可能  
管理者としてすべての操作が可能

3. Python的応用:状態切り替えを辞書で管理するシンプル実装

class User:
    def __init__(self):
        self._state = "guest"
        self.handlers = {
            "guest": lambda: print("閲覧のみ"),
            "member": lambda: print("投稿可能"),
            "admin": lambda: print("管理操作可能")
        }

    def set_state(self, state):
        self._state = state

    def handle(self):
        self.handlers[self._state]()

少数の状態なら辞書でスリムに管理できる


4. 実務ユースケース

✅ ユーザーの権限管理(ゲスト・会員・管理者)

→ 権限に応じた操作制限・UI制御


✅ ワークフローの状態管理(未処理・処理中・完了・保留)

→ 各状態に応じた操作ルールや次遷移の制御


✅ ネットワーク接続の状態遷移(Disconnected → Connecting → Connected)

→ 状態に応じて異なるハンドリングを適用


✅ UIコンポーネントの表示状態(表示中・非表示・無効・ローディング)

→ 見た目や挙動を状態で柔軟に制御可能


5. よくある誤用と対策

❌ 状態の数が少ないのにクラス化して逆に冗長に

→ ✅ 2〜3状態なら辞書や関数でも十分


❌ 状態クラスがcontextの内部構造に依存しすぎる

→ ✅ 依存関係は明示的に注入 or 最小限の抽象に留める


❌ 状態遷移の管理がコンテキスト外でバラバラに

→ ✅ 遷移ルールは明示的にドキュメント or 遷移マップで制御


結語

Stateパターンとは、“変化する状態をオブジェクトとして封じ込め、統一されたインターフェースで振る舞いを切り替える設計”である。

  • 条件分岐をオブジェクトに変換し、状態ごとの責任を明確化
  • 状態の追加・変更がしやすく、拡張性と保守性が高い構造
  • Pythonではクラス/関数/辞書の柔軟な使い分けにより、状況に応じた最適な実装が可能

Pythonicとは、“状態を意識せず、振る舞いとして自然に表現すること”。
Stateパターンはその変化への対応力を、設計の動的柔軟性として定義する技法である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?