2009-05-19 170 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()的结果添加到输入或外部事件列表中。

相关问题