FSM 大法好 —— 从过程到定义(转载)

来源:互联网 发布:免费的会计软件 编辑:程序博客网 时间:2024/06/05 07:19

FSM 大法好 —— 从过程到定义

bramblesbrambles
4 个月前
其实这篇文章很多话都已经放在草稿箱半年了,但是怎么都感觉自己还是没水平驾驭这个话题。毕竟 FSM 的相当于编程界的微积分,是一项虽不是很难,但是运用极其广泛,地位极其重要,同是也是我们所谓的 “初等” 到 “高等” 的一个重要门槛。今天乘着小伙伴刚刚发了文章,我也来跟风说两句,FSM 的作用是啥。当然也可以看看小伙伴写的 FSM 在web开发中的实用文章web 开发中无处不在的状态机 - 知乎专栏

FSM 是个啥

FSM 是一个抽象数学模型,它用于描述一个系统中受到环境影响所产生的状态变迁。所以啊, FSM 中有那么几个关键词,“系统” 、 “环境” 、“影响”、“状态”以及“变迁”。当然啦,为了表现 FSM 中这个 “F” 字母,我们再给这个一限定词,“有限的状态”。

好了,这就是 FSM 的全部,相信小伙伴肯定很多都听的云里雾里了,你这说了个啥,好像啥都没说啊?但是相信我,只要小伙伴们能理解好这几个关键词就是学好用好 FSM 的关键之一。小伙伴们在实际使用 FSM 写代码,就是要找出这几个关键词在实际应用环境中对应的哪些具体的东西。

模型是个啥

上面我们说到,FSM 是一个抽象数学模型的时候可能大家想都没想就开始看下一句了吧?所以我现在我就想问问,这个 “模型” 是个什么东西?我相信很多小伙伴已经开始一脸蒙蔽了。我为啥要在这篇讲 FSM 的文章了里面要提一下 “模型” 呢?因为很多实际应用场景下,系统和环境难以区分,互相影响,还可能有一亿个状态,小伙伴你要怎么给他建一个 FSM ?所以这个模型是个啥,小伙伴们记住两点就够了:① 抓住你要研究的主要矛盾 ② 屏蔽与你研究无关的一切信息。

为啥要用 FSM

好了,之前的铺垫已经讲完了,现在开始进入正题。我们为啥要用 FSM?答案其实已经写在我的副标题里了,就是 “从过程到定义”。

我们的编程教育已经让我们的小伙伴们都习惯了直接告诉计算机先干嘛,后干嘛,也就是我们所说的 “面向过程编程”,虽然后来有了那么一个更为高级的抽象方式叫做 “面向对象编程”,但是说白了面向对象编程不改变其面向过程的实质,还是在告诉计算机先干嘛后干嘛,区别就是换了 context。当然这里不是贬低面向对象编程,面向对象当然是一个伟大编程思想,我们这里只是讨论我们现在这篇文章所研究的主要矛盾

然后我们的先哲们就开始思考了,告诉计算机先干嘛后干嘛的编程方式不智能啊,能不能告诉计算机我有啥问题,然后他就啪啪啪自动给我处理完了。嗯,答案当然是不能啊。然而我们的先哲们并没有放弃,说:“不然这样子吧,我们干脆定好一套规范,你只要根据这个规范把问题说清楚了,那就让计算机自动把这个问题处理完。”。于是就有了我们现在面向定义编程这个概念了。

哇!能让计算机自动把事情做完啊,是不是很神奇啊?但是我一给你举例子你就肯定不觉得神奇了。正则表达式用过没?你用正则做匹配替换的时候不就是你在用一套规范把一个问题数清楚,然后计算机就给你啪啪啪处理好了?哦,当然了,正则的核心 DFA 和我们今天讲的 FSM 一定程度上是等效的。

所以嘛,FSM 在我们编程的领域就是这么一个神奇的工具,我们根据 FSM 的规范建立好一个模型(说清楚一个问题),然后我们用一些 FSM 框架(自己写也没问题,毕竟简单),让计算机啪啪啪就自己给我们处理完了。

用 FSM 能使逻辑和代码更清晰

我们往往说头疼医头脚疼医脚的往往都不是什么好医生,因为这样的医生没有抓住病因而只看到表面的症状(这只是举例,现实情况请谨遵医嘱)。在编程领域也是如此,一切我们这个模型,那个模型或者自己造一个模型都是为了抓住这个问题的主要矛盾,从而清晰地定义好我们所面对的问题。而只有自己所面对的问题有清晰地认识,才能让解决问题的逻辑和代码更清晰明了。

所以回到我们的副标题,为什么我们要从面向过程编程到面向定义编程?这是学好用好 FSM 的关键之二。

原文:https://zhuanlan.zhihu.com/p/26544762
相关资料:
https://en.wikipedia.org/wiki/Finite-state_machine
http://www.jianshu.com/p/37281543f506
http://blog.csdn.net/silangquan/article/details/51155805
阅读全文
1 0
原创粉丝点击