ステートマシン:外部イベントなしで状態を変更するにはどうすればよいですか (過渡状態)?
-
22-08-2019 - |
質問
シナリオ:
単純なステートマシンがあります。
幸せな道:
Uninitialized->Initialized->InProgress->Done
不幸な道:
Uninitialized->Initialized->Error
簡単に言うと、遷移(InProgress または Error 状態のいずれか)を引き起こす必要があります。 外部イベント/トリガーなし. 。つまり、初期化された状態は、直ちにこれらの状態のいずれかになります。
質問:
- 内部から状態遷移させても大丈夫ですか? Initialized.Enter() ?
- 使えるよ 州兵 しかし、ステート ガードに自明でないロジックを入れたくありません (初期化は非常に複雑になる可能性があります)。
- それが OK ではない場合、どうすれば別の方法で実行できますか?
- この決定をすべて FSM から取り出して、他のコンポーネントに適切な移行を行わせる必要がありますか?しかし、その場合、やはり内部からその外部コンポーネントを呼び出す必要があるのではないでしょうか Initialized.Enter() ?それで何も解決しないの?
解決
ステートマシンでは、次の状態は、入力と、現在の状態の両方の組み合わせ論理関数である。
は、あなたが記述されている場合は、同じ原因(Initialized
状態)は、2種類のエフェクト(InProgress
またはError
状態のいずれか)をトリガすることができるようです。私は、その値が違いを隠し入力があることを推測します。私はまた、この入力をUninitialized
からInitialized
への移行の間に受信されていることを推測します。
そこで私は別のモデルを持つことになります:
Uninitialized -> Successfully initialized -> InProgress -> Done
\
`-> Failed Initialization -> Error
おそらくSuccessfully initialized
とInProgress
とFailed initialization
とError
結合
編集:あなたのコメントから、私は隠された入力が実際にアクション(デバイスの初期化)の結果であることを理解しています。あなたのモデルを撮影、私はInitialized
状態で(のはInitializing
それを呼びましょう)しながら、その初期化が行われると仮定します。この方法では、デバイスからの結果は、いずれかの移行をトリガする外部イベントInProgress
するかError
することです。
だからあなたのステートマシンを維持し、単に入力または外部イベントのリストにdevice.Initialize()
の結果を追加します。
所属していません StackOverflow