状态机

本文源自《谈谈状态机》

我经常在工作中听到状态机的概念,尤其是我们公司的支付系统,订单状态在接收到某个事件后需要从一个状态迁移到另一个状态。目前公司内的通用写法是定义一系列DAO,在需要状态迁移的时候调用这些DAO来改变状态。说实话,这种方式把状态的迁移分散在代码的各个角落里,很难搜索出来;为此开发常常会画一些状态转移的图来辅助编码,但缺点是文档不会经常更新,常常与代码不符,而且大多数文档的状态图也不规范。

我深感状态机是业务的重要组成部分,如果能在代码里把状态的转移聚集在一起,会对开发人员和维护人员带来极大的方便,我也因此听说过“状态模式”以及DSL(陆滔滔公司发明的语言),来把状态相关代码放在一起的方法。但是在谈这个状态机的时候,如果没有相关概念,那谈不上用这些方法来解决问题。

本文是我读《谈谈状态机》的学习笔记,如果理解了状态机,那么即使不在编码时上用,就算在文档里面画个状态图也会顺手很多,理解也会深刻些,姑且不论文字的严谨性,我就是摘录些重要的文字,并加入我的一点看法。

在谈论一般意义的状态机时,我们先看看有限状态机,Finite State Machine,简称 FSM。

FSM 是一切的基础,也是能力最为有限的机器。在其能力之上是 CFL(Context Free Language),然后是 Turing Machine。

FSM 解决一个输入序列,经过 FSM,最终停留在什么状态这样一个问题。对于一个字符串是否以 \0 结尾(C 语言的字符串结构),FSM 可以给出答案。

CFL 是一切编程语言的基础。你写的一段 python 代码是否语法正确,CFL 能够给出答案。

Turing Machine 就是我们日常用各种算法写代码解决各种问题的基础。不较真地说,JVM 就是一个 Turing Machine。

再往上,就是未知的世界 —— Turing Machine 也解决不了的问题。

一个 FSM 首先有一系列的状态(state)。根据输入的不同,FSM 从一个状态切换到另一个状态。在这些状态中,有一些状态是特殊的状态 —— 接受状态(accept state)。如果输入处理完毕,FSM 停留在接受状态,那么 FSM 处理成功,否则失败。

我们看个例子。请听题:写一个状态机,验证一串二进制bit,包含偶数个 0 和奇数个 1。

合法的输入有:1,100,10101

不合法的输入有:10,00,1100

我们知道,写一段程序,搞定数据结构,就搞定了 80%。开发一个 FSM 也是一样,选取合适的状态是最最关键的。确定了状态之后,剩下的只是辛苦活。

对于这个简单的问题,大家一眼都能看出,可能存在四种状态。二进制串包含:

偶数个 0 和偶数个 1(记作 EE)
偶数个 0 和奇数个 1(记作 EO)
奇数个 0 和偶数个 1(记作 OE)
奇数个 0 和奇数个 1(记作 OO)

FSM 初始化的状态是 EE,一个 bit 都没处理,0 和 1 都是偶数个。FSM 的接受状态是 EO。如果最终到达这个状态,那么处理成功。

我们很容易能画出这样的状态机:

在构建 FSM 的过程中,不管你做了多少运算,为这个过程付出了多少脑力,最终,你得到的是一个:在 x 状态下,输入 a,得到 y 状态这样一个字典。这是 FSM 很多时候是最高效算法的原因:你已经把最艰难的部分编译进了 FSM,剩下的就是查表的操作。

以上描述的 FSM 是 DFA(Deterministic Finite Automaton),确定有限自动机。就是 给定一个状态,和一个输入,你总能确定地转换到下一个状态。

FSM 的应用主要是在 event based processing。一般如果系统在某个状态下,接收某些信息,处理后产生一个新的状态,都可以用 FSM 的思路来实现。最典型的使用场景是 network protocol,比如 OSPF(rfc2328 的主要篇幅就是在描述各种场景下状态的变化),再比如 TCP 3 way handshake,FTP 的建连和各种 command 的处理。

还有些场景涉及到具体的业务,比如用户的养成体系(用户从 注册用户 -> 已验证用户 -> 资料完整用户 -> 核心用户 的迁移),支付系统,预订系统也有 FSM 的影子。

完全是复制的,就这样吧O(∩_∩)O~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容