概要
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パターンはその変化の秩序を、柔らかく、かつ強靭にコードへ刻むための知的構造である。