状态机:如何在没有外部事件(瞬态)的情况下改变状态?
问题描述:
场景:
我有一个简单的状态机:状态机:如何在没有外部事件(瞬态)的情况下改变状态?
快乐路径:
Uninitialized->Initialized->InProgress->Done
不幸的路径:
Uninitialized->Initialized->Error
简单地说,我需要引起转换(进入InProgress或处于错误状态)没有外部连t /触发器。即初始化状态应立即导致其中一个状态。
问题:
- 是否确定从Initialized.Enter()内导致状态过渡?
- 我可以使用状态警卫来做到这一点,但我宁愿没有在国家警卫非平凡的逻辑(初始化可能非常复杂)。
- 如果不行,我该怎么做呢?
- 我是否应该将这个决定放在FSM之外,并让其他组件导致相应的转换?但是,那么我是不是还必须从内部调用这个外部组件呢Initialized.Enter()?所以它什么都不解决?
答
在状态机中,下一个状态是输入状态和当前状态的组合逻辑函数。
在您描述的情况下,同样的原因(Initialized
状态)似乎能够触发两种不同的效果(InProgress
或Error
状态)。我猜想有一个隐藏的输入,其价值造成了不同。我也猜测这个输入是在从Uninitialized
到Initialized
的过渡期间收到的。
因此,我将有一个不同的模式:
Uninitialized -> Successfully initialized -> InProgress -> Done
\
`-> Failed Initialization -> Error
可能与Error
结合Successfully initialized
与InProgress
和Failed initialization
。
编辑:从您的意见,我的理解是隐藏的输入实际上是一个动作(设备初始化)的结果。以你的模型为例,我假设初始化发生在Initialized
状态(我们称之为Initializing
)。这样,设备的结果就是您的外部事件,它将触发转换到InProgress
或Error
。
因此,保持状态机,并简单地将device.Initialize()
的结果添加到输入或外部事件列表中。
相关:http://*.com/questions/1647631/c-state-machine-design/1651187 – jldupont 2009-10-31 11:23:39