概述
状态机入门知识整理。
有限状态机是什么?
一个有限状态机(后文以状态机缩写指代)是一种特殊的组织代码的方式,用这种方式你能确保你的对象随时都知道自己所处的状态以及所能做的操作。其中每一个状态都是独立的代码块,与其他不同的状态分开独立运行。
状态机的要素
状态机可归纳为4个要素,即现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
- 现态:是指当前所处的状态
- 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
- 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
- 次态:条件满足后,要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
状态机3个特征
- 状态总数是有限的;
- 任意时刻,只会在一种状态之中;
- 某种条件下,会从一种状态转变到另一种状态。
使用条件
- 所需状态确定;
- 有事件触发转变状态;
- 总状态有限且转变有规律。
具体实现
**处理事件输入,实现状态跳转逻辑。**这里有两种写法,一种 写法是在状态中判断事件:
一种是在事件中判断状态:
注意事项
- 避免把某个“程序动作”当做是一种“状态”来处理。 那么如何区分“动作”和“状态”?“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
- 状态划分时漏掉一些状态,导致跳转逻辑不完整。 所以维护上述一张状态表就非常必要,而且有意义了。从表中可以直观看出那些状态直接存在跳转路径,那些状态直接不存在。如果不存在,就把对应的单元格置灰。 每次写代码之前先把表格填写好,并且对置灰的部分重点review,看看是否有“漏态”,然后才是写代码。QA拿到这张表格之后,写测试用例也是手到擒来。