产品经理不得不知的——有限状态机
一、地址的分析和识别
以前每次搬家,要重新写收货地址时,我都会特别小心,要去百度地图上搜一下地址的完整写法,生怕一不小心写错或写漏了就收不到包裹了(捂脸)。直到某天我看到有限状态机的原理,才知道我太天真了。
比如腾讯公司在深圳的地址,有如下的各种写法:
- 广东省深圳市腾讯大厦
- 广东省518075深圳市南山区科技园腾讯大厦
- 深圳市510875科技园腾讯大厦
- 深圳市南山区科技园腾讯大厦
- 广东省深圳市科技园中一路腾讯公司…
这些地址写得都有点不清楚,那么程序是如何准确地识别这些信息呢?下图所示的是一个识别中国地址有限状态机的例子。
- 每一个有限状态机都有一个开始状态和一个终止状态,以及若干中间状态。
- 每一条弧上带有从一个状态进入下一个状态的条件。
- 如果一个地址能从状态机的开始状态进过状态机的若干中间状态,走到终止状态,那么这条地址有效,否则无效。
比如“北京市双清路83号”对于上面的状态机有效,而“上海市辽宁省马家庄”则无效。
二、什么是有限状态机
有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。
它有三个特征:
- 状态总数(state)是有限的。
- 任一时刻,只处在一种状态之中。
- 某种条件下,会从一种状态转变(transition)到另一种状态。
现实世界中存在大量具有有限个状态的系统:钟表系统、电梯系统、交通信号灯系统、通信协议系统、正则表达式、硬件电路系统设计、软件工程,编译器等,有限状态机的概念就是来自于现实世界中的这些有限系统。
下面是一个可乐机的状态图。
从图中就可以清楚地看到可乐机的运行过程,图中直观地表现了可乐机投入不同金额硬币时的情况以及几个处理步骤的各个状态和它们之间的转换关系,根据投入硬币的不同面值,对总金额进行计算,并对各种操作进行响应以完成一次购买。 状态机的动态结构使得其在通讯系统,数字协议处理系统,控制系统,用户界面等领域得到了广泛地应用。
上图是非常有名的TCP协议状态机。这个状态机我没看懂,放在这里抛砖引玉吧。
三、有限状态机的应用
有限状态机有多种实现方式
1. switch-case或if-else
举例来说,网页上有一个菜单元素。鼠标悬停的时候,菜单显示;鼠标移开的时候,菜单隐藏。如果使用有限状态机描述,就是这个菜单只有两种状态(显示和隐藏),鼠标会引发状态转变。
当状态量少并且各个状态之间变化的逻辑比较简单时,使用switch语句实现的有限状态机的确能够很好地工作,但代码的可读性并不十分理想。在很长一段时期内,使用switch语句一直是实现有限状态机的唯一方法,甚至像编译器这样复杂的软件系统,大部分也都直接采用这种实现方式。
但之后随着状态机应用的逐渐深入,构造出来的状态机越来越复杂,这种方法也开始面临各种严峻的考验,其中最令人头痛的是如果状态机中的状态非常多,或者状态之间的转换关系异常复杂,那么简单地使用switch语句构造出来的状态机将难以扩展和维护。
2. 状态表
我们还可以用状态表来表示状态的转化过程,以一个游戏中的简单设定为例:
这段需求相信大家一眼就可以看明白,现在我们用状态机来表示,大概是这样:
看完这个图,是不是有种似曾相识的感觉。产品经理在做复杂的业务需求时,往往会遇到状态的变更,一般我们会画流程图来表示(比如一个审核流程),偶尔也会用表格的形式来表示(比如内容平台的发布流程)。
但是我们在做的时候往往没有考虑过有限状态机的这种表述方式,或者说考虑得不够全面,如果用有限状态机的这种方式,那就是可以直接供测试人员使用的一个测试用例了,想想测试同学雀跃的心情吧。
四、总结
状态机表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
通俗的描述状态机就是定义了一套状态変更的流程:状态机包含一个状态集合,定义当状态机处于某一个状态的时候它所能接收的事件以及可执行的行为,执行完成后,状态机所处的状态。
状态机主要的应用场景就是流程控制。一个状态机定义以后,在某个状态下就只接收固定的Event,也就是执行指定的操作,这样流程就能按照预期定义的那样流转,不会出现乱入的情况,执行了一些在某状态下不允许执行的操作。
一个很典型的应用就是工作流引擎:以工作流中典型的审批流程为例,审批流程按照预先定义的流程流转的固定的某些人手里,只有这一批固定的人才能审批,当审批后(可能是一个人审批,也可能是多个人审批)才会流转到下个节点,由下个节点的审批人继续审批,一直流转到最后一个节点。
状态机的流转可以人工干预,也可以自动流转。定义为自动流转后,把业务流程定义完成后,只要添加一个定时任务,整个流程的运转就都由状态机来完成了。
写到这,只想说一句话,无处不状态机!
#作者#
CARRIE。关注新技术新服务。
本文
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!