状态机:如何在没有外部事件(瞬态)的情况下改变状态?

时间:2009-05-19 17:34:28

标签: state-machine

情景:
我有一个简单的状态机:

快乐路径:

Uninitialized->Initialized->InProgress->Done

路径不快:

Uninitialized->Initialized->Error

简单地说,我需要进行转换(进入InProgress或处于错误状态)没有外部事件/触发器。即初始化状态应立即导致其中一种状态。

问题:

  1. 是否可以从 Initialized.Enter()中导致状态转换?
  2. 我可以使用状态守卫来做到这一点,但我宁愿在状态守卫中没有非平凡的逻辑(初始化也很复杂)。
  3. 如果不行,我该怎么办?
  4. 我是否应该一起从FSM中做出这个决定并让其他一些组件导致适当的转换?但是,我还不得不在 Initialized.Enter()中调用该外部组件吗?所以什么都解决不了?

1 个答案:

答案 0 :(得分:2)

在状态机中,下一个状态是输入和当前状态的组合逻辑功能。

在您描述的情况下,相同的原因(Initialized状态)似乎能够触发两种不同的效果(InProgressError状态)。我猜有一个隐藏的输入,其值有所不同。我还猜测在从Uninitialized过渡到Initialized期间会收到此输入。

因此我会有一个不同的模型:

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

可能将Successfully initializedInProgressFailed initializationError合并。


编辑:从您的评论中,我了解隐藏的输入实际上是操作的结果(设备初始化)。采用您的模型,我假设初始化发生在Initialized状态(让我们称之为Initializing)。这样,设备的结果就是您的外部事件,它会触发转换为InProgressError

因此请保留您的状态机,只需将device.Initialize()的结果添加到输入或外部事件列表中。