【修真院】
小课堂 - 如何使用状态机任务四如何使用状态机?
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
1.背景介绍
1.什么是有限状态机?
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
2.知识剖析:
状态存储关于过去的信息,就是说:它反映从系统开始到现在时刻的输入变化。转移指示状态变更,并且用必须满足确定转移发生的条件来描述它动作在给定时刻要进行的活动的描述。有多种类型的动作:
进入动作(entry action):在进入状态时进行
退出动作:在退出状态时进行
输入动作:依赖于当前状态和输入条件进行搜索
转移动作:在进行特定转移时进行
生成实例以后,就可以随时查询当前状态。
- fsm.current :返回当前状态。
- fsm.is(s) :返回一个布尔值,表示状态s是否为当前状态。
- fsm.can(e) :返回一个布尔值,表示事件e是否能在当前状态触发。
- fsm.cannot(e) :返回一个布尔值,表示事件e是否不能在当前状态触发。
Javascript Finite State Machine允许为每个事件指定两个回调函数,以warn事件为例:
- onbeforewarn:在warn事件发生之前触发。
- onafterwarn(可简写成onwarn) :在warn事件发生之后触发。
同时,它也允许为每个状态指定两个回调函数,以green状态为例:
- onleavegreen :在离开green状态时触发。
- onentergreen(可简写成ongreen) :在进入green状态时触发。
假定warn事件使得状态从green变为yellow,上面四类回调函数的发生顺序如下:onbeforewarn → onleavegreen → onenteryellow → onafterwarn。
除了为每个事件和状态单独指定回调函数,还可以为所有的事件和状态指定通用的回调函数。
- onbeforeevent :任一事件发生之前触发。
- onleavestate :离开任一状态时触发。
- onenterstate :进入任一状态时触发。
- onafterevent :任一事件结束后触发。
如果事件的回调函数里面有异步操作(比如与服务器进行Ajax通信),这时我们可能希望等到异步操作结束,再发生状态改变。这就要用到transition方法。
3.常见问题:
JavaScript的的状态机创建的对象是如何满足状态机模型的要求的:
4.解决方案:
可以用状态来描述事物,并且任一时刻,总是事物处于一种状态
事物拥有的状态总数的英文有限的
通过触发事物的某些行为,导致可以从事物一种状态过渡到另一种状态
事物状态变化是有规则的,A状态可以变换到B,B可以变换到C,A却不一定能变换到ç
同一种行为,可以将事物从多种状态变成同种状态,但是不能从同种状态变成多种状态
5.编码实战
以官方文档为例
var fsm = new StateMachine({
init:'solid',
过渡:[
{name:'melt',from:'solid',to:'liquid'},
{name:'freeze',from:'liquid',to:'solid'},
{name:'vaporize',from:'liquid',to:'gas'},
{name:'condense',from:'gas',to:'liquid'}
]
方法: {
onMelt:function(){console.log('I melted')},
onFreeze:function(){console.log('我冻结')},
onVaporize:function(){console.log('I vaporized')},
onCondense:function(){console.log('I condensed')}
}
});
6.更多思考
怎样决定有限状态机的使用时机或方式
7.参考链接
https://blog.csdn.net/cdnight...
https://github.com/jakesgordo...
8.更多讨论
1.一个JS文件可以同时使用两个有限状态机吗?
不同的变量名即可
2有限状态机通常在什么地方被用到?
大体上编程都是对现实的抽象,有效状态机也不例外,当逻辑里面有大量判断需要转换状态时,有限状态机就有用处了,本质上其是用查表法来把处理逻辑独立到表中,从而可以用通用的代码去处理任意复杂的状态转换。具体场景有状态超多的词法分析(要识别各种关键字,运算符等等),工控软件中,有些机器的控制逻辑也可以用到,扩展开来,任何复杂状态逻辑的处理都可以。
3.有限状态机有哪些优点,与普通的,如果判断语句相比呢?
便于阅读,理解,维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。