ステートマシン
有限個の状態と遷移で振る舞いを定義する計算モデルで、ワークフローや UI の状態管理に使う
設計アルゴリズム
ステートマシンとは
ステートマシン (有限状態機械, FSM) は、有限個の状態と、イベントによる状態遷移で振る舞いを定義する計算モデルである。ワークフロー、UI の状態管理、プロトコル設計に使われる。
基本要素
| 要素 | 説明 |
|---|---|
| 状態 (State) | システムが取りうる状態 |
| イベント (Event) | 状態遷移のトリガー |
| 遷移 (Transition) | イベントによる状態の変化 |
| 初期状態 | 開始時の状態 |
| 最終状態 | 終了時の状態 |
注文のステートマシン
[pending] --pay--> [paid] --ship--> [shipped] --deliver--> [delivered]
| |
+--cancel--> [cancelled]
|
+--expire--> [expired]
TypeScript での実装
type OrderState = 'pending' | 'paid' | 'shipped' | 'delivered' | 'cancelled';
type OrderEvent = 'pay' | 'ship' | 'deliver' | 'cancel';
const transitions: Record<OrderState, Partial<Record<OrderEvent, OrderState>>> = {
pending: { pay: 'paid', cancel: 'cancelled' },
paid: { ship: 'shipped', cancel: 'cancelled' },
shipped: { deliver: 'delivered' },
delivered: {},
cancelled: {},
};
function transition(state: OrderState, event: OrderEvent): OrderState {
const next = transitions[state]?.[event];
if (!next) throw new Error(`Invalid: ${state} + ${event}`);
return next;
}
ステートマシンのメリット
定義されていない遷移はエラーになるため不正な状態遷移を防止できる。状態遷移図で全体を可視化でき、状態 × イベントの組み合わせで網羅的にテストしやすい。状態遷移表がそのまま仕様書として機能する。
XState (フロントエンド)
import { createMachine } from 'xstate';
const toggleMachine = createMachine({
initial: 'inactive',
states: {
inactive: { on: { TOGGLE: 'active' } },
active: { on: { TOGGLE: 'inactive' } },
},
});
React の複雑な UI 状態管理に XState を使うと、状態遷移が明示的になる。
現場での応用を知るには関連書籍も役立つ。