Atitit fsm有限状态机概念与最佳实践
目录
1.1. 1、状态机的要素 4个要素,即现态、条件、动作、次态 2
5.5. 2、 因为其状态有限,当所要描述的系统的状态太多时,可能确定的有限状态机无能为力; 3
5.6. 有限状态机的可扩展性差(或者对比计算机而言是无可编程性) 3
1. 概念组成与原理成分
1.1. 1、状态机的要素 4个要素,即现态、条件、动作、次态
状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
①现态:是指当前所处的状态。
②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
1.2. 状态表
我们可以用状态表了表示整个过程,如下图所示。
2. 性状
2.1. 一般一个class即可
2.2. 而言有fsm模式就复杂些了
3. 适用场景 主治 适应症
3.1. 所有场景(较简单)。
复杂场景使用pda和turing机
4. Bp 最佳实践 用法
5、处理事件输入,实现状态跳转逻辑。 双case
这里有两种写法,一种是在状态中判断事件:一种是事件中判断状态:
本人观点:一般业务场景来说,状态的数量是确定的切数目较少,不同状态下需要处理的事件也不一样。而触发的事件数量则比较多,采用上面第二种方式在事件中判断状态也有利于把里面一层的switch/case剥离出来当成单独的函数,做一些代码模块结构的优化,故推荐使用第二种方式,事件中判断状态。
5. 缺点 不良反应
5.1. 有限的应用领域(由 于不可确定性);
5.2. 对于大量的 I/O 服务的应用,不容易实现;
5.3. 大的程序不便于调试
5.4. Fsm是专用自动机,不是通用自动机
有限状态机的弱点
1、 每一种有限状态机均功能唯一,即设计好之后无法完成其他原理不同的工作;
5.5. 2、 因为其状态有限,当所要描述的系统的状态太多时,可能确定的有限状态机无能为力;
5.6. 有限状态机的可扩展性差(或者对比计算机而言是无可编程性)
5.7. 3、 有一些任务是有限状态机无法完成的
,比如它可以判断输入的0、1数列中0或1的个数是否为奇数或偶数,但是无法判断0是否比1多或者相反。
前两个问题表示有限状态机的可扩展性差(或者对比计算机而言是无可编程性),而后者是因为有限状态机状态有限而且不能记下自己需要记录的东西(或者对比图灵机理论是不能写)。
于是我们发现有限状态机不但状态有限,功能也有限(根据计算理论,这是因为它只能接受正则语言,而正则语言是最低级的语言,所以能够解决的问题是有限的)。
事实上,最初的计算“机”(其实更应该说是计算器)都是功能单一的,虽然人们不断地试图在一台机器上集成更多的功能,但是相对于下面要讲到通用计算理论,这些行为还是“盲目”的。
6. 禁忌 不适应场合
7. 注意事项
这里需要注意的两个问题:
1、避免把某个“程序动作”当作是一种“状态”来处理。那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
2、状态划分时漏掉一些状态,导致跳转逻辑不完整。
所以维护上述一张状态表就非常必要,而且有意义了。从表中可以直观看出那些状态直接存在跳转路径,那些状态直接不存在。如果不存在,就把对应的单元格置灰。 每次写代码之前先把表格填写好,并且对置灰的部分重点review,看看是否有“漏态”,然后才是写代码。QA拿到这张表格之后,写测试用例也是手到擒来。
8. 相互作用与其他类库模式
9. 过量与滥用后果
10. 原理
11. 理解曲线
11.1. 学习曲线最简单的,比起pda,turing
12. 储藏
13. 包装与api接口
14. 执行标准
15. 生产组织与个人 attilax
16. Ref
Atiitt fsm有限状态机优缺点