参考链接
https://cloud.tencent.com/developer/article/1669378
怎么理解状态?如何才算一个状态
【第一种情况】:假设我们尝试去做一件事情,但这件事情不是每次去做就一定会成功,而且每次去尝试都有可能产生至少2种以上的结果,那么针对这件事情的尝试就应该单独划分一个状态。
【第二种情况】:假设我们只是单纯的在等待某一个事情发生;或者等待某个一结果——这个结果由2个以上的返回值组成等等,那么这个等待行为就需要分配一个独立的状态。
重点在于状态跃迁上
“跃迁”,表示从当前状态跳转到箭头所指向的目标状态(自返的跃迁就是自己跳回自己)。跃迁不是无条件的,也不允许无条件——换句话说,每个跃迁都必须有一个条件:例如第一个例子中的true和false就是对应跃迁的条件;后面例子中与门限值的比较也是对应的条件。
需要特别强调的是:1)一个状态所有的跃迁条件必须是彼此“互斥”的、唯一的;2)所有的跃迁必须能覆盖一个状态机所有可能的情况——绝不允许出现漏网之鱼,否则一旦没有被覆盖的情况出现就有可能导致整个状态机的行为存在“不确定性”——如果状态机描述的是一个机器人的行为的话,这就是导致机器人逻辑故障的严重Bug;3)跃迁是个瞬间的行为,你只能认为当条件满足时跃迁的行为就像白驹过隙一样一下就做完了——这点很重要,我们马上就要细说。
前面说过,当某个跃迁的条件得到了满足,我们就要沿着箭头的方向从当前状态调转到箭头所指向的目标状态。实际上,在跃迁的过程中我们还可以执行一些动作。需要注意的是,正如前面3)说的那样,“跃迁是个瞬间行为”,所以这里的动作也只会被执行一次。习惯上,如果某个跃迁存在动作,我们就在跃迁的条件下面加一个横线,并在横线的下方按顺序列举所有要执行的动作。