ステートマシン:外部イベントなしで状態を変更するにはどうすればよいですか (過渡状態)?

StackOverflow https://stackoverflow.com/questions/884081

  •  22-08-2019
  •  | 
  •  

質問

シナリオ:
単純なステートマシンがあります。

幸せな道:

Uninitialized->Initialized->InProgress->Done

不幸な道:

Uninitialized->Initialized->Error

簡単に言うと、遷移(InProgress または Error 状態のいずれか)を引き起こす必要があります。 外部イベント/トリガーなし. 。つまり、初期化された状態は、直ちにこれらの状態のいずれかになります。

質問:

  1. 内部から状態遷移させても大丈夫ですか? Initialized.Enter() ?
  2. 使えるよ 州兵 しかし、ステート ガードに自明でないロジックを入れたくありません (初期化は非常に複雑になる可能性があります)。
  3. それが OK ではない場合、どうすれば別の方法で実行できますか?
  4. この決定をすべて FSM から取り出して、他のコンポーネントに適切な移行を行わせる必要がありますか?しかし、その場合、やはり内部からその外部コンポーネントを呼び出す必要があるのではないでしょうか Initialized.Enter() ?それで何も解決しないの?
役に立ちましたか?

解決

ステートマシンでは、次の状態は、入力と、現在の状態の両方の組み合わせ論理関数である。

は、あなたが記述されている場合は、同じ原因(Initialized状態)は、2種類のエフェクト(InProgressまたはError状態のいずれか)をトリガすることができるようです。私は、その値が違いを隠し入力があることを推測します。私はまた、この入力をUninitializedからInitializedへの移行の間に受信されていることを推測します。

そこで私は別のモデルを持つことになります:

Uninitialized -> Successfully initialized -> InProgress -> Done
             \
              `-> Failed Initialization -> Error

おそらくSuccessfully initializedInProgressFailed initializationError結合

<時間>

編集:あなたのコメントから、私は隠された入力が実際にアクション(デバイスの初期化)の結果であることを理解しています。あなたのモデルを撮影、私はInitialized状態で(のはInitializingそれを呼びましょう)しながら、その初期化が行われると仮定します。この方法では、デバイスからの結果は、いずれかの移行をトリガする外部イベントInProgressするかErrorすることです。

だからあなたのステートマシンを維持し、単に入力または外部イベントのリストにdevice.Initialize()の結果を追加します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top