3

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

快乐之路:

Uninitialized->Initialized->InProgress->Done

不开心的路:

Uninitialized->Initialized->Error

简而言之,我需要在没有外部事件/触发器的情况下进行转换(进入 InProgress 或 Error 状态) 。即初始化状态应立即导致这些状态之一。

问题:

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

1 回答 1

2

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

在您所描述的情况下,相同的原因(Initialized状态)似乎能够触发两种不同的效果(InProgressError状态)。我想有一个隐藏的输入,其值会有所不同。我也猜想这个输入是在从Uninitialized到的转换过程中收到的Initialized

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

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

可能Successfully initializedInProgressFailed initialization结合Error


编辑:从您的评论中,我了解到隐藏的输入实际上是一个动作的结果(设备初始化)。以您的模型为例,我假设初始化发生在Initialized状态(我们称之为Initializing)。这样,设备的结果就是您的外部事件,它将触发 toInProgress或 to 的转换Error

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

于 2009-05-19T19:25:50.110 回答