上篇博文简单记录怎么配置状态机,那状态机使用场景和相关概念怎么理解呢?
我结合官方英文文档记录一下
官方文档
背景
状态机是强大的,因为它保证行为一致并且相对容易调试,在状态机启动的时候就加载好了操作规则。它的理念是应用程序存在于有限数量的状态中,发生一些事情是程序从一个状态转到另一个状态。驱动状态的是触发器,可以基于事件或者计时器。
在应用程序之外设计高级逻辑,然后以各种不同的方式与状态机交互,这种方式要简单很多。您可以通过发送事件,监听状态机执行的操作或仅仅请求当前状态来简单地与状态机进行交互。
当开发人员意识到现在的项目代码开始像一个装满意大利面条的盘子时候,会引入传统的状态机。复杂的代码看起来永远不会在充满if、else、break子句的层次结构中结束,编译器可能会要求开发人员回家避免事情看起来越来越复杂。
#使用场景
如果出现以下情况,状态机对项目来说是一个好的选择:
- 应用或者部分结构可以用状态来表示
- 想要将复杂的逻辑拆分为更小的可管理的任务
- 程序存在并发问题
为了引入状态机你需要做以下准备:
- 使用布尔标志或者枚举类型来建模场景
- 拥有在应用程序周期某些部分有意义的变量
- 循环遍历if/else结构,检查如果设置了特定的标志或者枚举,那么当标志和枚举固定组合存在或者不存在时候做进一步的例外处理。
#词汇表
-
state machine 由状态集合、regions、转换、事件驱动的主要实体
-
state 是状态机的主要实体,其中状态更改由事件驱动,模拟一些不变条件成立的情况
-
Transition 转换是源状态和目标状态之间的关系。它可能是复合转换的一部分,它将状态机从一个状态配置转移到另一个状态配置,表示状态机对特定类型事件发生的完整响应。
-
Event 发送到状态机的实体,然后驱动各种状态更改。
-
Initial State 状态机启动的特殊状态。初始状态始终绑定到特定的状态机或region。具有多个region的状态机可以具有多个初始状态。
-
End State 也被称为最终状态是一种特殊的状态,表示封闭region已完成。如果封闭region直接包含在状态机中并且状态机中的所有其他region也完成,则意味着整个状态机完成。
-
History State 一种伪状态,允许状态机记住其最后一个活动状态。存在两种类型的History State :shallow 仅记住顶级状态,deep 其住子机器中的活动状态。
-
Choice State 一种伪状态,允许根据事件头或扩展状态变量进行转换选择
-
Fork State 种伪状态,可以控制进入某个region。
-
Join State 一种伪状态,它可以控制region的出口。
-
Region 区域是复合状态或状态机的正交部分。它包含状态和转换。(不是很理解)
-
Guard 是一个boolean表达式,是基于扩展的state变量和事件参数的值动态评估的。当值为TRUE时,通过启用操作或转换来影响状态机的行为,并在值为FALSE时禁用操作和转换。
-
Action 动作是在触发转换期间执行的行为。