html5引擎开发 -- 引擎消息中心和有限状态机 - 初步整理 一
一 什么是有限状态机
FSM (finite-state machine),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。他对于逻辑以及时序的控制能起到非常重要的作用。
代码主要看的是什么?逻辑!所有的设计模式无非是让程序逻辑变得更加利与维护,利于优化,利于升级而已。
那么能不能把业务逻辑整理出来统一操作呢?
你可以理解状态机就是干这个的(当然不仅仅是这样)。这样一来只要将一个业务看成一个状态机,有N中状态,然后统一来控制这些状态时的操作。
大家都用过dom事件绑定,是不是某种状态时候就会触发某种事件?这明显也是状态机的概念能解释的。还有观察者模式或者说是订阅发布模式,抑或是jquery的deffered和pomise,甚至是各种同步编程模块(windjs)等等等等。仔细想想也基本上都是同样的原理:即根据不同的消息,诱发注册的相应回调。区别仅仅是怎么注册或者说生成支持各自机制的对象而已。
将各种业务状态写在一起集中管理的好处是什么?就是你整个流程会变得无比的清晰,一目了然!而不再需要将业务逻辑写的到处都是。方便了整体业务逻辑的管理。(后期会抽象出消息机制概念,彻底解放模块之间的耦合,敬请期待)
二 状态机的一些概念
1 状态转换
从一个状态切换到另外一个状态被称为状态转换
2 触发事件
状态改变而引起它的事件称为触发事件.,而触发时间完全可以集中在一起定义,方便管理.业务流程一目了然。
三 会用在哪些场景
状态机可以用在任何能抽象出业务流程的地方,大到页面加载,引擎加载,购物流程,小到tab标签,显示隐藏控件,等等地方。
会不会经常被一大堆的回调函数,异步函数回调之间的逻辑高的头昏眼花?抽象出一个状态机来,外部的各种操作(异步,同步,回调)只需要改变这个状态机的状态就可以执行相应的操作了。
四 举个例子
试想一下,比如我们加载引擎的业务流程:
--初始化引擎(initcore)
--初始化模板(inittpl)
--获取数据(initdata)
--初始化页面(initpage)
--初始化页面成功(pageok)
我们可以将这个业务流程生成一个状态机,比如叫“app”,那么我们需要做的是什么呢?
我们只需要将这些状态赋予这个叫做“app”的状态机对象,同时生成一个状态改变时的触发事件管理器。就可以方便并集中地来管理整个业务流程了。逻辑代码展现大概如下:
var fsm = FSM.create([’initcore’,’inittpl’,’initdata’,’initpage’,’pageok’],
function(from,to,data){
switch(to){
case ‘initcore‘:
break;
case ‘coreok’:
break;
….
case ‘pageok’:
break;
}
});
这样一来整个app加载流程就会一目了然,而不管是在异步中还是页面回调中需要业务变更时,只需要改变对应状态机的状态就会执行相应的逻辑。比如:
fsm.change(‘pageok’);
我们可以称之为面向业务的状态模型,也可以称之为状态模式。
下面,我们再来看看消息中心的想法。
五 关于状态机为核心的消息中心抽离
5.1让我们看看以前的模块式开发
以前引擎和模块,模块和模块之间,一般都是互相直接调用接口,也就是api模式。这就是面向对象基本模式了,每一个模块都是一个对象,对外开放了很多接口,其他对象只需要调用目标对象的相应接口就可以执行相应的逻辑。目前来说,基本上都是这样的设计模式,这种方式为我们带来了很大的便利(图)。
5.2提出问题
但是这样没法避免的一个问题就是,在一个模块内部需要直接调用另外一个模块的api,你中有我,我中有你。试想一下,如果另外一个模块不存在,接口不存在呢,或者接口返回错误的情况下该怎么办呢?不至于每个调用其它模块的地方全部都写上容错吧,那么代码基本没法看了。
那么我们就该想想了,是不是应该有这样一套机制呢,暂时叫做调度中心,我们简单设想一下它应该有一下功能:
1 调度中心能统一的管理引擎以及各个模块之间的相互调用,以方便记录当前应用运行的的各种实时操作。
2 所有的模块不会直接调用其他模块的接口,而是告诉调度中心,我要调哪个模块的哪个方法,并提供必要的参数,调度中心会解析消息并调用相应的模块,当然必要的错误处理机制是必须的。
3 每个模块必须有相应的消息处理机制,有调度中心统一方法“吃入”模块,当然必要的配置文件是必须的。
这就是我们说的消息机制。O(∩_∩)O~
5.3什么是消息机制
每个引擎都会有很多很多的模块,好的引擎模块间的耦合会比较松,但是大多数引擎模块之间都是结合的很紧密的。
消息,很多情况下都跟通信相关。那么消息机制应用到引擎中是什么样子呢?(图)
5.4要注意的问题
1 流程上增加了复杂度,开发一个高效的消息中心很重要
2 每个模块需要注册进消息中心
3 消息错误时 要有统一处理机制
总结:
想一下,状态机作为消息中心的核心引擎来实现消息中心思想,是不是很给力呢?消息中心可以实现消息队列,也可以切入aop设计模式来实现消息中心的各种功能扩展。
html5引擎开发 -- 引擎消息中心和有限状态机 - 初步整理 一的更多相关文章
- HTML5游戏开发引擎Pixi.js新手入门讲解
在线演示 本地下载 这篇文章中,介绍HTML5游戏引擎pixi.js的基本使用. 相关代码如下: Javascript 导入类库:(使用极客的cdn服务:http://cdn.gbtags.com) ...
- HTML5游戏开发引擎,初识CreateJS
CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...
- HTML5游戏开发引擎Pixi.js完全入门手册(一)框架简介及框架结构分析,作者思路剖析
前言: 最近无聊在淘宝弄了个小店,打算做一个兼职.遇到一个客户,要我帮忙拷贝一个html5游戏.. 我这人有一个习惯,拿到自己没见过的东西.都会去研究一番.去网上查了下发现,资料都是英文版.感觉极度不 ...
- HTML5游戏开发引擎Pixi.js完全入门手册(二)元素对象属性解析
下面,我们来解释下PIXI里面对象的各个属性.. 首先我们来看看这个各个元素对象里面到底长啥样.. alpha Number 整个舞台对象的透明度. buttonMode Boolean 渲染是否作为 ...
- html5前端开发笔记-个人中心
简单的css自适应 PC端 *** 移动端 *** ) *** 一开始的想法就是模仿手机APP 的页面进行布局,首先得有个头部,然后是主题部分,然后加上2个按钮,分别是编辑和退出登录.先布出基本结构. ...
- 25 个超棒的 HTML5 & JavaScript 游戏引擎开发库
就像在汽车中,引擎完成主要的工作,使汽车看起来不可思议.游戏引擎同理,游戏开发者完成细节的工作,使游戏看起来真实.吸引人眼球.游戏引擎负责其余的事情.早期,游戏开发者通常从草图做起,花费高昂,且不容易 ...
- LayaAir引擎开发HTML5最简单教程(面向JS开发者)
LayaAir引擎开发HTML5最简单教程(面向JS开发者) 一.总结 一句话总结:开发游戏还是得用游戏引擎来开发,其实很简单啦 切记:开发游戏还是得用游戏引擎来开发,其实很简单,引擎很多东西都帮你做 ...
- 推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库
推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库 0. 引言 如果你是一个游戏开发者,并且正在寻找一个可以与 JavaScript 和 HTML5 无缝工作的游戏引擎.那么 ...
- CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎
CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5 2D 渲染引擎,可以用于游戏开发.它是开源的,跨平台的,与现代的浏览器和移动设备兼容.CutJS 提供了一个类似 DOM 树的 ...
随机推荐
- linux perf and tracer ,java Flame Graph
http://www.brendangregg.com/flamegraphs.html http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/rev/e826 ...
- NSIS安装程序制作工具判断系统是否安装.NET
前段时间忙了很久的系统总算上线了,由于是WinForm程序不能整个文件夹的发给客户使用.所以必须要打包,记得以前在VS2005中是自带部署功能的.现在换了VS2013那个部署功能完全弄不清方向.最后在 ...
- 【转】java中&和&&的区别和联系
[转]http://www.cnblogs.com/hongten/p/hongten_java_yu.html 电路问题总结: 对于:& -- > 不管怎样,都会执行" ...
- 使用matplot做图--sin图像
# _*_ coding:utf-8 _*_ import numpy as np import matplotlib.pyplot as plt x = np.arange(-5, 5, 0.1) ...
- JAVA-JSP注释
相关资料: <21天学通Java Web开发> 结果总结: 1.一类可以在客户端显示的注释,即HTML注释.2.<!-- -->,中间为注释部分.3.如果使用MyEclipse ...
- VBA学习笔记(2)--新建word文档并插入文字
说明(2017.3.20): 1. Dim As声明变量类型,Set赋值/初始化 2. With使后面的省略对象,直接点就行,后面要End With 3. Application.StatusBar ...
- 一款简洁的纯css3代码实现的动画导航
之前为大家介绍了好多导航菜单,今天给大家分享一款简洁的纯css3代码实现的动画导航.鼠标经过的时候以背景色以菱形渐变为长方形.效果图如下: 在线预览 源码下载 实现的代码. html代码: < ...
- 网络虚拟化(SDN,NFV..)和企业骨干网的演化
本来昨天就规划了今天的这篇文章,无奈昨天中午自己喝了将近一瓶的52度二锅头...晚上想着今天怎么着也完了,要颓废难受一天了...没想到早上居然一点都不难受了.于是就写下了本文.正文之前,还是做个广告, ...
- Elasticsearch的javaAPI之get,delete,bulk
Elsasticsearch的javaAPI之get get API同意依据其id获得指定index中的基于json document.以下的样例得到一个JSON document(index为twi ...
- WIFEXITED/WEXITSTATUS/WIFSIGNALED
WIFEXITED/WEXITSTATUS/WIFSIGNALED If the exit status value (*note Program Termination::) of the chil ...