この記事について
現在 Qiita 内でキーワード ImtStateMachine にて検索するとこちらの記事がトップに出てくる。
-
ステートマシン実装の決定版ImtStateMachineについて語り尽くす
2021年10月現在ではこちらの記事に書かれたものと若干 ImtStateMachine の内容が変わっているようなので、ここにメモを残しておく。 - GitHub上の最新版
なお、ImtStateMachine のファイル内にバージョン表記が見受けられなかったため、便宜上前述の記事で使われているものを 2018年版
と呼ぶ(2018年に書かれた記事であるため)。最新のものは 2021年版
と呼ぶ。この呼称は一般のものではなくこの記事内に限定したものである。
ソースを目視で見て確認しているだけなので間違ってたらごめんなさい。
主な差分
変更
- ファイル名変更
- 2018年版:
ImtStateMachine.cs
- 2021年版:
StateMachine.cs
- ただしクラス名は ImtStateMachine のまま。
- 2018年版:
- クラス定義の型パラメータ変更
- 2018年版:
public class ImtStateMachine<TContext>
- 2021年版:
public class ImtStateMachine<TContext, TEvent>
- ただし 2021年版を基底クラスとして、TEvent を int で固定して従来と同じ型パラメータにした派生クラスが互換性のため(?)に作られている。
-
TEvent
はAddTransition<TPrevState, TNextState>(TEvent eventId)
やSendEvent(TEvent eventId)
で使われている引数。2018年版では int で固定されていたが、2021年版では任意の型を使えるようになった。
- 2018年版:
- ステートクラスのインスタンスは2018年版では内部で作成していたが、2021年版では新規追加されたメソッド
RegisterStateFactory(Func<Type, State> stateFactory)
によって、生成する Func を登録できるようになった。これにより既存のインスタンスをステートクラスとして使用することができると思われる。多分。- Factory でも生成できなかった場合は
protected virtual TState CreateStateInstance<TState>()
にてインスタンス化をするので、これを override して任意のインスタンスを使えるように書き換えられるかもしれない。
- Factory でも生成できなかった場合は
追加
- 最後に受理された eventId が
public TEvent LastAcceptedEventID
プロパティから取れるようになった。
廃止
- 可変長引数で一気に遷移構造を登録できる
AddTransitionRange()
が廃止された。 -
SetStartState
の非ジェネリクス版SetStartState(Type startStateType)
が廃止された。ジェネリクス版のSetStartState<TStartState>()
を使おう。 - クラス
ImtSynchronizationStateMachine<TContext>
の廃止。SynchronizationContext は使ったことが無いのでわからない。
まとめ
廃止されたメソッドやクラスがありますが、概ね互換性は維持されているように見えます。よかったよかった。