状态机 : How to change state without external event (transient state)?

标签 state-machine

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

快乐之路:

Uninitialized->Initialized->InProgress->Done

不幸的道路:

Uninitialized->Initialized->Error

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

问题:

  1. 是否可以从 Initialized.Enter() 中引起状态转换?
  2. 我可以使用状态守卫来做到这一点,但我宁愿在状态守卫中没有非平凡的逻辑(并且初始化很可能很复杂)。
  3. 如果不行,我该如何做?
  4. 我是否应该将这个决定从 FSM 中取出,并让其他组件引起适当的转换?但是这样一来,我是否仍然需要从 Initialized.Enter() 中调用该外部组件?所以它解决不了任何问题?

最佳答案

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

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

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

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

可能将 Successfully initializedInProgressFailed initializationError 结合。


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

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

关于状态机 : How to change state without external event (transient state)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884081/

相关文章:

uml - 状态机和状态图是同一个意思吗?

java - 滥用 ragel,可能需要新的方法/工具

c# - 我应该触发触发器以从有限状态机中的 OnEntry() 方法更改状态吗?

ruby-on-rails - 使用 FactoryGirl 和 StateMachine 测试动态初始状态

JavaScript 事件状态机

uml - 创建显示自动展台所有状态的 UML 状态机图

ruby-on-rails - Rails : Displaying state_machine validation errors

UML 状态机 : Understanding regions, fork 并加入伪状态

swift - 我是否正确使用了状态模式?

c++ - 有限状态机编译器