2
2

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パターンが必要か?

❌ 巨大なif-else構文による状態管理

def handle(state):
    if state == "idle":
        ...
    elif state == "running":
        ...

→ 状態が増えるたびに分岐が肥大化し、保守性が崩壊


✅ 状態ごとにクラスを分け、動的に状態を切り替える

context.set_state(RunningState())
context.request()  # 状態ごとの挙動

状態ロジックの局所化・追加・切り替えが柔軟に


2. 基本構造

✅ Stateインターフェース

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

✅ 具体的な状態クラス

class IdleState(State):
    def handle(self, context):
        print("現在: 待機中 → 実行状態へ遷移")
        context.set_state(RunningState())

class RunningState(State):
    def handle(self, context):
        print("現在: 実行中 → 待機状態へ遷移")
        context.set_state(IdleState())

✅ Context(状態を持つ本体)

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

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

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

✅ 使用例

ctx = Context(IdleState())
ctx.request()  # 待機中 → 実行中
ctx.request()  # 実行中 → 待機中

3. Python的応用:状態を辞書でマップして柔軟に遷移

class TrafficLight:
    def __init__(self):
        self._state = "red"
        self._transitions = {
            "red": self._to_green,
            "green": self._to_yellow,
            "yellow": self._to_red
        }

    def change(self):
        self._transitions[self._state]()

    def _to_green(self):
        print("赤 → 緑")
        self._state = "green"

    def _to_yellow(self):
        print("緑 → 黄")
        self._state = "yellow"

    def _to_red(self):
        print("黄 → 赤")
        self._state = "red"
light = TrafficLight()
light.change()
light.change()
light.change()

小規模状態機械に対する関数ベース実装も可能


4. 実務ユースケース

✅ UIやフロントエンドの状態制御

→ 編集・保存・読み取りなどのモード切替を状態として管理


✅ ゲーム開発におけるエンティティの状態遷移

→ 立ち・攻撃・被弾・死亡などの状態ごとの振る舞いを定義


✅ ワークフロー・フェーズ進行管理

→ 承認フローやプロセスの状態に応じた処理の切り替え


✅ IoT制御・ロボティクスの状態機械

→ 状態が明確に定義される物理デバイスの制御ロジック構築


5. よくある誤用と対策

❌ 状態クラスに過剰な責務を持たせる

→ ✅ 状態クラスは状態の振る舞いのみに責任を持たせる


❌ 状態の変更を外部から自由に行う

→ ✅ context.set_state()明示的に制御された経路のみ許可


❌ Contextクラスが状態を意識しすぎている

→ ✅ request() のみ呼び出せばよい設計にし、状態ごとの詳細は隠蔽


結語

Stateパターンとは、“状態ごとに振る舞いを封じ込め、システムの秩序と柔軟性を保つ設計技法”である。

  • 状態をクラスに昇格させることで、条件分岐からの解放と構造化を両立
  • 状態の追加・変更を局所的に完結させ、可読性・保守性を最大化
  • Pythonではクラス/辞書/関数ベースいずれのアプローチも取り得るため、規模と柔軟性に応じた選択が可能

Pythonicとは、“状態の変化を、条件ではなく構造で表現する”ことであり、
Stateパターンはその変化の秩序を、柔らかく、かつ強靭にコードへ刻むための知的構造である。

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?