状态机设计的一般步骤_状态机方法

最近才注意到,很多程序员原来是不知道怎么做状态机推演的。教科书呢,讲的是个理论,很多人都没有注意我们大部分程序都是需要做状态机推演的。所以,我这里来做个科普。

我们为什么要做状态机推演呢?大部分有状态的组件(就是这个组件里面有变量),在面对外部刺激的时候,在不同状态下要做不同的响应。简单的时候,程序员们都会用一两个变量解决这个问题。比如一个用户管理程序,某个用户是否已经激活,是否已经实名认证,用户级别……这些都是这个用户的“状态”。但如果某个状态的变化过程变得很复杂,我们就要控制每个状态跃迁的过程了。这时我们就需要专门的状态机推演的过程。

还是用这个用户认证的过程来作为例子,我们简单一点,我们认为一个用户可能有5种状态:创建,实名认证,激活,屏蔽,注销。其实注销并非一种状态,因为一旦注销了,用户不存在了,这就不是状态了,但认知这种状态对画图有好处。后面我们很快可以看到。

这样我们可以创建一个初步的状态机:

5068087eb4a7b80ddac974b8dc11b099.png

那个没有前置节点的状态称为初始状态,部分教科书用一个实心点来表达,不过这个无所谓了,你知道就行。那个没有后置节点的状态就称为终止状态,部分教科书不写这个状态,但也无所谓了,表达的东西是一样的。

每个带箭头的线,称为一个跃迁,上面有一个类似分数的注释,这个注释的分子,表示跃迁条件,又称为一个激发事件,或者简称事件(Event)。分母表示在跃迁的时候需要做的动作,称为一个反应(Action)。

这样就构成一个基本的状态机了。建立状态机的目的,是要整体上知道,系统现在的状态是否是可控的。而不会出现想起这里,忘掉那里,搞定这个,搞垮另一个这样的情况。

所以,画出一个状态机不是问题,对它的可靠性进行推演才是问题。对于一个准备实施的状态机,我们需要检查:

  1. 图上表达了系统可能收到的所有事件吗?
  2. 我们推演了每个节点上可能收到的所有事件的处理吗?
  3. 我们有可能陷入某种状态而无法离开吗?
  4. 状态机可以化简吗?

这才是我们维护状态机的目的(而不是为了写一个(貌似)很Cool很专业的文档)。我们一个个来看这怎么做。</

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值