概要
State Machine(状態機械)は、
あるオブジェクトが明確な状態とその遷移ルールを持ち、入力に応じて振る舞いを変化させる構造設計パターンである。
この構造は UI、ゲーム、プロセス制御、通信プロトコル、ワークフローなど、状態依存ロジックが必要なあらゆる場面に登場する。
1. なぜState Machineが必要か?
❌ 条件分岐で状態を管理するとコードが崩壊する
if status == "login":
...
elif status == "confirm":
...
elif status == "completed":
...
→ 状態が増えるたびに分岐地獄とロジックの重複が発生
✅ 状態ごとに専用のクラスを定義し、責任を分離する
state = LoginState()
state.handle(user_context)
→ 状態ごとの責務を明確化し、拡張・保守が容易に
2. 基本構造
✅ Stateインターフェース
class State:
def handle(self, context):
raise NotImplementedError
✅ Context(状態を管理する主体)
class UserContext:
def __init__(self):
self.state = LoginState()
def set_state(self, state):
self.state = state
def request(self):
self.state.handle(self)
✅ 各Stateの具象クラス
class LoginState(State):
def handle(self, context):
print("ログイン状態:確認画面へ遷移")
context.set_state(ConfirmState())
class ConfirmState(State):
def handle(self, context):
print("確認状態:完了画面へ遷移")
context.set_state(CompletedState())
class CompletedState(State):
def handle(self, context):
print("完了状態:処理終了")
✅ 使用例
user = UserContext()
user.request() # ログイン状態
user.request() # 確認状態
user.request() # 完了状態
出力:
ログイン状態:確認画面へ遷移
確認状態:完了画面へ遷移
完了状態:処理終了
3. Python的応用:辞書による簡易ステートマシン
transitions = {
"login": ("confirm", lambda: print("→ 確認へ")),
"confirm": ("done", lambda: print("→ 完了へ")),
"done": (None, lambda: print("→ 終了"))
}
state = "login"
while state:
next_state, action = transitions[state]
action()
state = next_state
→ 状態と遷移をデータとして定義することで柔軟に再利用可能
4. 実務ユースケース
✅ ユーザー登録フロー、購入ステップの制御
→ 各画面・段階の状態と遷移を厳密に設計
✅ ゲームやアニメーションのステート管理
→ キャラクターの行動状態を**「待機」「移動」「攻撃」などで管理**
✅ プロトコル通信ステータスの管理
→ クライアントの接続・認証・送受信・切断などを状態として設計
✅ フィニットステートマシンを使ったDSLパーサ
→ 入力文字列に応じて状態を遷移しながら構文解析
5. よくある誤用と対策
❌ 状態が増えるたびにif-elseが肥大化
→ ✅ 状態ごとのクラスまたは辞書ベースの遷移表で制御
❌ 状態オブジェクトにビジネスロジックを混在
→ ✅ Stateクラスは状態遷移の責務のみに集中
❌ Contextクラスが状態に過度に依存する実装
→ ✅ 状態が自己完結的に責務を持ち、Contextに最小限の影響だけ与える
結語
State Machineとは、“状態と振る舞いを明確に分離し、制御の流れを構造化する設計技法”である。
- 状態依存ロジックを可読性と拡張性を維持したまま記述可能に
- 状態と遷移を独立管理することで、高い保守性と変更耐性を確保
- PythonではOOPとデータ駆動を併用し、柔軟かつ直感的なステートマシンが構築可能
Pythonicとは、“複雑さを管理し、変化を秩序に落とし込むこと”。
State Machineはその秩序の設計を、状態というレンズでシンプルに見通すための技法である。