什么是有限状态机?

什么是有限状态机?这里是修真院前端小课堂 每篇分享文从 背景介绍 知识剖析 常见问题 解决方案 编码实战 扩展思考 更多讨论 参考文献 八个方面深度解析前端知识 技能 本篇分享的是 什么是有限状态机 大家好 我是 IT 修真院北京总院第 24 期的学员 一枚正直纯洁善良的 web 程序员今天给大家分享一下 修真院官网 js 任务 3 深度思考中的知识点 什么是有限状态机 1

这里是修真院前端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析前端知识/技能,本篇分享的是:

【什么是有限状态机? 】

什么是有限状态机?

大家好,我是IT修真院北京总院第24期的学员,一枚正直纯洁善良的web程序员

今天给大家分享一下,修真院官网js任务3,深度思考中的知识点——什么是有限状态机??

 

1.背景介绍

什么是有限状态机?

有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

 

 

有限状态机一般都有以下特点:

(1)可以用状态来描述事物,并且任一时刻,事物总是处于一种状态;

(2)事物拥有的状态总数是有限的;

(3)通过触发事物的某些行为,可以导致事物从一种状态过渡到另一种状态;

(4)事物状态变化是有规则的,A状态可以变换到B,B可以变换到C,A却不一定能变换到C;

(5)同一种行为,可以将事物从多种状态变成同种状态,但是不能从同种状态变成多种状态。

2.知识剖析

在js中,新建一个对象,用这个对象的属性来模拟元素的状态,用这个对象的方法模拟元素在不同状态的转变,那么这个对象就是一个有限状态机。

是否可用有限状态机来描述,却决于:

当前状态确定,有限个状态,响应事件,在不同状态间有规律的转变。

var menu = {

// 当前状态

currentState: ‘hide’,

// 绑定事件

initialize: function() {

var self = this;

self.on(“hover”, self.transition);

},

// 状态转换

transition: function(event){

switch(this.currentState) {

case “hide”:

this.currentState = ‘show’;

doSomething();

break;

case “show”:

this.currentState = ‘hide’;

doSomething();

break;

default:

console.log(‘Invalid State!’);

break;

}

}

};

可以看到,有限状态机的写法,逻辑清晰,表达力强,有利于封装事件。一个对象的状态越多、发生的事件越多,就越适合采用有限状态机的写法。

另外,JavaScript语言是一种异步操作特别多的语言,常用的解决方法是指定回调函数,但这样会造成代码结构混乱、难以测试和除错等问题。有限状态机提供了更好的办法:把异步操作与对象的状态改变挂钩,当异步操作结束的时候,发生相应的状态改变,由此再触发其他操作。这要比回调函数、事件监听、发布/订阅等解决方案,在逻辑上更合理,更易于降低代码的复杂度。

3.常见问题

有限状态机有哪些应用场景?

4.解决方案

满足3点即可用:所需状态确定,有事件触发转变状态,总状态有限且转变有规律。

页面可用有限状态机的元素较多且有规律时可用:例如:开关按钮,下拉菜单,

 

Javascript Finite State Machine 函数库

javascript-state-machine插件

 

//交通信号灯的模型描述:

var fsm = StateMachine.create({

initial: ‘green’,

events: [

{ name: ‘warn’,  from: ‘green’,  to: ‘yellow’ },

{ name: ‘stop’, from: ‘yellow’, to: ‘red’ },

{ name: ‘ready’,  from: ‘red’,    to: ‘yellow’ },

{ name: ‘go’, from: ‘yellow’, to: ‘green’ }

],

callbacks:{

callback1:function(){…},

callback2:function(){…},

},

error: function(){…}

});

initial选项用来表示fsm对象的初始状态,events选项用来描述fsm对象所有状态的变化规则,每一种变化规则对应一种行为。create方法为实例的每一种行为都添加了一个方法,调用这个方法就相当于触发对象的某种行为,当对象行为发生时,对象的状态就可以发生变化。如以上例子创建的实例将拥有如下行为方法: fsm.warn() : 调用该方法,实例状态将从’green’变为’yellow’ fsm.stop() : 调用该方法,实例状态将从’yellow’变为’red’ fsm.ready() : 调用该方法,实例状态将从’red’变为’yellow’ fsm.go() : 调用该方法,实例状态将从’yellow’变为’green’

这些方法是StateMachine根据create时配置的events规则自动创建的,方法名跟events规则里面的name属性对应,events规则里面有几个不重复的name,就会添加几个行为方法。同时为了方便使用,它还添加了如下成员来判断和控制实例的状态和行为: fsm.current – 返回实例当前的状态 fsm.is(state) – 如果传入的state是实例当前状态就返回true fsm.can(eventName) – 如果传入的eventName在实例当前状态能够被触发就返回true fsm.cannot(eventName) – 如果传入的eventName在实例当前状态不能被触发就返回true fsm.transitions() – 以数组的形式返回实例当前状态下能够被触发的行为列表

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 :任一事件结束后触发

以{ name: ‘warn’, from: ‘green’, to: ‘yellow’ }为例,这八个回调函数顺序为: onbeforewarn onbeforeevent onleavegreen onleavestate onenteryellow onenterstate onafterwarn onafterevent

5.编码实战

demo1

demo2

6.扩展思考

有限状态机通常在什么地方被用到?

大体上编程都是对现实的抽象,有效状态机也不例外,当逻辑里面有大量判断需要转换状态时,有限状态机就有用处了,本质上其是用查表法来把处理逻辑独立到表中,从而可以用通用的代码去处理任意复杂的状态转换。 具体场景有状态超多的词法分析(要识别各种关键字,运算符等等),工控软件中,有些机器的控制逻辑也可以用到,扩展开来,任何复杂状态逻辑的处理都可以

7.参考文献

百度百科

博客

《javascript高级程序设计》

博客园

github

 

 

 

视频链接     密码: 85w1

ppt链接

感谢大家观看

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

 

 

 

【更多内容,欢迎加入交流群与大家一起讨论交流】

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232832.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea快速删除一行_idea查找文件内容快捷键

    idea快速删除一行_idea查找文件内容快捷键使用eclipse,有时候出现多个空行时,习惯使用快捷键:Ctrl+D,删除当前一行。最近使用idea开发,发现手动删除空行,很麻烦,特意查了一下,发现是快捷键:Ctrl+Y。如下图所示:使用Ctrl+Y后删除当前行另外:可以使用设置,讲idea的快捷键设置为eclipse模式…

    2025年9月25日
    6
  • 高等数学导数公式、微分公式和积分公式大全[通俗易懂]

    高等数学导数公式、微分公式和积分公式大全感谢观看期待关注知乎:叄贰壹简书:带只拖鞋去流浪关注我,带你一起写bugwarning:未经授权,不得转载有问题的小伙伴请在下方留言,喜欢就点个赞吧…

    2022年4月14日
    87
  • mysql redis配置文件详解_Redis配置文件redis.conf 详解

    mysql redis配置文件详解_Redis配置文件redis.conf 详解Redis配置文件redis.conf详解1.基本配置内存单位的表示#1k=>1000bytes#1kb=>1024bytes#1m=>1000000bytes#1mb=>1024*1024bytes#1g=>1000000000bytes#1gb=>1024*1024*1024bytes单位中不区分大小写1GB…

    2022年6月9日
    25
  • springcloud用feign调用非eruka注册接口报错「建议收藏」

    springcloud用feign调用非eruka注册接口报错「建议收藏」1.查了一大圈,后来发现把get请求改为post就好了,原来报4042.之所以这么耗时没有定位到问题,是因为确定不了报什么错,其实feign执行日志里面有报404.但是我以为那不是报错,而且他的报错跟正常报错不一样,没有第几行第几行throw异常那种,导致我以为那不是实际的异常,后来是直接debug源码,断点打到底层实际发送http请求的地方,发现返回信息也是404,才知道原来404了!!3….

    2022年8月21日
    9
  • matlab如何使用循环语句_matlab中循环语句怎么写

    matlab如何使用循环语句_matlab中循环语句怎么写对于fo循环和while循环均适用:1)for语句中赋值问题%理解for循环clccleara=1;m=3;fori=1:m%理解此处的m不是向量,是循环时的某一个固定值b(i)=a*i%得到的b值保留前一个循环中计算的值。是一个随着i变化的向量,loop1时向量中有1个元素;loop2时有2个元素,分别是loop1中值和loop2中

    2022年9月1日
    10
  • 图析:String,StringBuffer与StringBuilder的区别

    图析:String,StringBuffer与StringBuilder的区别一、JavaString类——String字符串常量字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串。需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:我们可…

    2022年6月28日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号