Day05 - 开始、结束与有限状态机

昨天习得 事件转移 的概念後,让我们来思考实作这个 transition,还需要什麽东西?

transition('待付款', '收到帐款')  === '待发货'
transition('站立', '按 B') === '跳跃'

或者说我们这个主体、状态至转移的过程,还欠缺什麽东西?

订单:提交 → 待付款 → 待发货→ 待取件→ 交易完成
角色移动模组:站 → 跳 → 站

1. 开始

以 RPG 游戏的角色移动模组为例,玩家开始操纵角色前,一定要会有个初始状态,可能是来自上次离线的纪录(等级、hp,mp, sp, attack, speed..)或是初心者最开始的状态。

而以电商订单为例,订单最开始一定会有提交阶段吧,由消费者向厂商提出购买的意愿、询问是否有货源等等,当有了这个最开始的条件,我们才能确认、有办法继续往後面处理一系列的交易流程。

所以这个主体也必须要有一个初始值,我们称做初始状态 (Initial State)

2. 结束

以 RPG 游戏的角色移动模组为例,玩家开始操纵角色後,什麽代表着结束?可能是玩家决定登出、角色HP归零死亡,游戏破关等等...或者是玩家移动到一个安全的地方,然後把电脑继续开着挂机,不会结束。

而以电商订单为例,怎麽样可以视一张订单为结束?
可以是产品送达客户後的交易完成、或是客户决定取消下单、或供应商没货的交易取消、或是使用者忘记期限内付费的交易失效等等。

我们称这个主体被结束时,所处的状态称作结束状态 (Final State"s")

3. 有限状态机 ( Finite State Machine )

所以我们大致观察一直以来的这两个范例需求中的一些特徵

  1. 他们都有一个初始状态
  2. 整个实体、物件或是对象,都有一系列不同的状态们
  3. 还有一系列不同的事件,可能会导致状态转移
  4. 还有一张纪录着什麽事件配什麽状态会发生转移的地图、对应表
  5. 有限数量的结束状态( 0 - n 个 )

https://ithelp.ithome.com.tw/upload/images/20210920/20130721SCO6gzH9tL.png
by The Finite State of Reactive Animations

一个主体、物件底下所存在的状态们、事件,以及转换的这个旅程,我们称作一个有限状态机(Finite State Machine)。

至於为什麽状态机前多了前缀字「有限」

我想可以用这句话理解: 因为要有 Transition 这张表的存在,必须记录 什麽事件 + 什麽状态 = 转换後的状态 ,因为要把它们列举出来,前述的状态与事件的数量就会是有限的。

首先简单来帮大家再回顾一下为什麽从 Day01-Day05 有这一系列的探索与讨论

原因便是我们在规划一个物件、系统流程时,底下有太多不同种的状态,还有各自的条件限制,为了满足系统与规格的需求,假如我们只单纯使用 if/else block 并设计几个 flag isSomething/isOtherthing 随着系统扩充、调整,可能会为我们带来麻烦。

假设我的功能新增 也是继续增加 if/else 或是增加 flag isC/hasD 等等,我们会面临到,必须回去其他检查旧有的 if/else block ,思考新增的状态跟旧状态有没有什麽相依性、或是防御 (Guard) 要处理,违反了开放封闭原则 ,专案程序码也变得难以阅读。

虽然上述的写法很简单、很快速,我们的程序码也能非常自由的灵活运用,但代价就是过於自由,变得难以顾及整体。

那我们能不能牺牲一点自由?

限制你总体状态的有哪些、可以有哪些事件存在,什麽事件配什麽状态能进行状态转移 → 有限状态机 ( Finite State Machine )

所以如果当你的需求是一个复杂状态的情境时,在系统规划上,你便可以考虑使用有限状态机

参考文献


<<:  DAY8: process.nextTick( )

>>:  [Day 05] 当我~们同在一起在17在17 (k-means 理论篇)

大共享时代系列_011_共享社区

可曾想过,我所住的社区有什麽? 什麽是社区 在本文章的定义引自 wiki_社区 提到的,因为共享共同...

【从零开始的 C 语言笔记】第十五篇-String 函式库介绍与应用

不怎麽重要的前言 上一篇我们介绍了array的延伸应用,利用字元阵列我们可以当作储存字串的工具。 今...

【Day 23】与 DOM 的互动:Ref

Ref Ref 拥有以下特色: 不须重新渲染就可以更新值 直接抓取 DOM 来控制 DOM 的行为 ...

[13th][Day17] tamplete range

range golang 的 template 支援 range 循环来遍历 map、slice 内...

Vaadin 汉堡选单 - AppLayout - day16

Web 应用程序选单多样化,早期最常见的多半树状选单,直至手机问世後汉堡选单(hamburger m...