0
1

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 Machineの設計原則と実装パターン

Posted at

概要

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はその秩序の設計を、状態というレンズでシンプルに見通すための技法である。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?