2009-05-19 28 views
2

シナリオ:ステートマシン:外部イベントなしで状態を変更する方法(過渡状態)?

ハッピーパス:

Uninitialized->Initialized->InProgress->Done 

不幸パス:簡単に言えば

Uninitialized->Initialized->Error 

は、私が起こす必要がある私は、単純なステートマシンを持っている
移行(InProgressまたはError状態のいずれか)外部偶数なしt /トリガー。私。初期化された状態は、直ちにそれらの状態の1つになるはずです。

質問:

  1. それは、Initialized.Enter()内から状態遷移を引き起こすためにOKですか?
  2. これを行うにはステートガードを使用することができますが、私はステートガードで軽度ではないでしょう(初期化は非常に複雑になる可能性があります)。
  3. それがOKでない場合は、どうすれば違うのですか?
  4. 私はこの決定をFSMから一まとめにして、他のコンポーネントが適切な移行を起こさなければならないのでしょうか?しかし、それから私はその外部コンポーネントを内部から呼び出す必要はありませんInitialized.Enter()?それで何も解決しない?
+0

関連:http://stackoverflow.com/questions/1647631/c-state-machine-design/1651187 – jldupont

答えて

2

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

あなたが説明している場合、同じ原因(Initialized状態)が2つの異なる効果(InProgressまたはErrorのいずれかの状態)をトリガーできるようです。私は値がその違いをもたらす隠れた入力があると思います。私はまた、この入力がUninitializedからInitializedへの移行中に受け取られたと推測します。

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

はおそらくErrorInProgressFailed initializationSuccessfully initializedを組み合わせる:

したがって、私は別のモデルを持っているでしょう。


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

ステートマシンをそのまま使用して、入力または外部イベントのリストに単にdevice.Initialize()の結果を追加します。

関連する問題