2009-05-19 60 views
2

場景:
我有一個簡單的狀態機:狀態機:如何在沒有外部事件(瞬態)的情況下改變狀態?

快樂路徑:

Uninitialized->Initialized->InProgress->Done 

不幸的路徑:

Uninitialized->Initialized->Error 

簡單地說,我需要引起轉換(進入InProgress或處於錯誤狀態)沒有外部連t /觸發器。即初始化狀態應立即導致其中一個狀態。

問題:

  1. 是否確定從Initialized.Enter()內導致狀態過渡?
  2. 我可以使用狀態警衛來做到這一點,但我寧願沒有在國家警衛非平凡的邏輯(初始化可能非常複雜)。
  3. 如果不行,我該怎麼做呢?
  4. 我是否應該將這個決定放在FSM之外,並讓其他組件導致相應的轉換?但是,那麼我是不是還必須從內部調用這個外部組件呢Initialized.Enter()?所以它什麼都不解決?
+0

相關:http://stackoverflow.com/questions/1647631/c-state-machine-design/1651187 – jldupont 2009-10-31 11:23:39

回答

2

在狀態機中,下一個狀態是輸入狀態和當前狀態的組合邏輯函數。

在您描述的情況下,同樣的原因(Initialized狀態)似乎能夠觸發兩種不同的效果(InProgressError狀態)。我猜想有一個隱藏的輸入,其價值造成了不同。我也猜測這個輸入是在從UninitializedInitialized的過渡期間收到的。

因此,我將有一個不同的模式:

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

可能與Error結合Successfully initializedInProgressFailed initialization


編輯:從您的意見,我的理解是隱藏的輸入實際上是一個動作(設備初始化)的結果。以你的模型爲例,我假設初始化發生在Initialized狀態(我們稱之爲Initializing)。這樣,設備的結果就是您的外部事件,它將觸發轉換到InProgressError

因此,保持狀態機,並簡單地將device.Initialize()的結果添加到輸入或外部事件列表中。