zoukankan      html  css  js  c++  java
  • 状态机入门:从定义到使用

     

     

    状态机是什么?状态机应该如何去应用呢?状态机可以对业务状态进行梳理,一目了然,之后可以根据业务场景不断增加。

    在工作过程中,意外接触了一个词——“状态机”,这是个什么意思,可以为我们做产品提供怎样的用处?

    作为产品,为什么需要学习状态机呢?

    在刚进入公司的时候,根据公司产品做流程图的时候,发现自己经常会漏了这样或那样的状态,导致整体流程会有问题。后来知道了状态机这样的东西,发现用这幅图就可以很清晰的表达整个状态的流转。当然这个不是做好一款产品的必备品,但是却可以让你更加轻松的同技术等人员交流。

    一、什么是状态机?

    就是就是状态转移图。

    如果流程围绕某个事物的状态变化进行,显而易见,该轮到状态机图上场了。一个状态机图中只描述一个事物,该事物有多个状态,不同的动作作用到状态上导致状态的转换。

    举个最简单的例子:

    人有三个状态:健康、感冒、康复中。

    触发的条件有淋雨(t1)、吃药(t2)、打针(t3)、休息(t4)。

    所以状态机就是健康->(t4)->健康;健康->(t1)->感冒;感冒->(t3)->健康;感冒->(t2)->康复中;康复中->(t4)->健康等等。就是这样状态在不同的条件下,跳转到自己或不同状态的图。

    状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。

    详解如下:

    1. 现态:是指当前所处的状态。
    2. 条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
    3. 动作:条件满足后执行的动作,动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
    4. 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

    在了解关于状态机的文章后,结合自己的平时的学习总结,我发现:在平时的业务过程中,判断即对应状态机理论中的条件,我们做什么操作改变状态即理论中的动作,同时状态必须要有始有终,否则会出现状态卡住,无法继续正常推进。

    状态机的开始一般用空心圆表示,代表状态图的起始位置。

    结尾一般用实心圆点表示,是一个状态的终止点。

    二、那么状态机怎样去应用呢?

    以物理课学的灯泡图为例:就是一个最基本的小型状态机,这个例子人人里的很多大神都已经举过了,这里就简单说下。

    这里就是两个状态:①打开开关,灯泡亮;②关闭开关,灯泡灭。

    可以画出以下的状态机图:

    如果进度卡住,该怎么办?

    这里有个比较形象的案例就是淘宝的自动确认收货,卖家发货后状态变为待收货,若买家迟迟不点确认收货的话,那么流程就停止在这里,卖家也迟迟收不到货款。

    因此,在这里,淘宝做了一个条件,判断时间是否达到15天,如果达到15天,做出确认收货的动作,使得状态得到流转。

    以小灯泡为例:假设为了节约,小灯泡开了超过8个小时就自动关闭,除非再次做打开开关的操作,画出此时的状态机图如下:

    同样的状态判断应用了很多场景,例如:患者购买服务或商品时,订单由待支付-已支付的状态中的通过时间条件来实现状态得到继续流转。

    但是,判断不是状态机必要的,如:正常小灯泡的两种状态,可以不需要经过判断。起始和终止状态可能是相同的,也可能是不同的,即同一种状态可能是起始状态,也可能为终止状态。

    在这里以外卖app为例:制作了一个订单的简单的状态机图,以订单的状态变更推动。

    三、总结

    新入门时,对状态机和业务流程图总是傻傻分不清楚,因此对于状态机和流程图进行了了解和归纳。

    总的来说,状态机图和业务流程图有些类似,但是又有不同:

    • 两者是两种不同的思维方式;
    • 两者思考的出发点不一样,因而两者所表达的目的也是不同的;
    • 两者的各个节点都是不同的,流程图为动作,状态机为状态。

    一般情况下,我们使用的均为有限状态机。状态机可以对业务状态进行梳理,一目了然,之后可以根据业务场景不断增加。

    同时,使用状态机和相关人员,尤其是开发,进行表达时,也可以更加清晰,提升沟通效率。

  • 相关阅读:
    PHP保留小数的相关方法
    ASP.NET Core MVC 之过滤器(Filter)
    ASP.NET Core MVC 之控制器(Controller)
    ASP.NET Core MVC 之视图组件(View Component)
    ASP.NET Core MVC 之局部视图(Partial Views)
    标签助手(TagHelper)
    ASP.NET Core MVC 之布局(Layout)
    ASP.NET Core MVC 之视图(Views)
    ASP.NET Core MVC 之模型(Model)
    九卷读书:淘宝从小到大的发展 -重读《淘宝技术这十年》
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/14103279.html
Copyright © 2011-2022 走看看