Day14 - 解决状态大爆炸 - 2: Hierarchical States (阶层式状态)

同样的例子。
假设这次我希望某些状态是依赖於某些状态的!

比如说有输入有效(valid)跟输入无效(invalid),是依赖於 input 是否改动过(changed)
改了才知道,输入有效 or 输入无效

所以我们终於可以移除昨天不合理的假设,输入有效、无效在 unchanged 时,是不合理的,在 changed 之後,这个 changed 才有需要代表监别 valid / invalid,我们可以说 valid / invalid 这两个子状态依赖於 changed 之下。
valid / invalid 无法透过完整透过自己,代表整个状态的全貌。(或者可以说,我们在 unchanged 时,不在意是否 valid )

https://ithelp.ithome.com.tw/upload/images/20210929/20130721UvlbWhoZpj.png

跟平行式状态的状态、事件一样,一样是 3 组子状态 6 种事件。

只不过这次我们带入了严谨的依赖性进来我们的状态机。

也就是说,当处在某个状态时,另一些状态的存在才是有意义的、合理的时。我们可以藉由阶层的概念、手段,来描述我们的状态机,也可以让我们免除 state 大爆炸的情形。

小节

  1. 使我们能提炼、精致状态,将离散的行为拆分成独立的子状态机
  2. 可以将 相似的 transition 分群
  3. 允许状态间的独立性 (反言之,转移禁止跨越子状态机之间)
  4. 鼓励组合、组装(Composability)
  5. 避免状态大爆炸 ^^
  6. 透过拆分、组装状态,我们可以将状态分群,每个区块有属於自己的状态机。当转移到某个 Sate 後,可以进入对应区域的子状态机,使我们的状态机更具描述性。

参考资料

https://statecharts.dev/state-machine-state-explosion.html
https://xstate.js.org/docs/guides/hierarchical.html


<<:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day14

>>:  Day 14:凯撒密码之Shifting Letters

风险承受能力和风险偏好(Risk Capacity and Risk Appetite)

.风险暴露(Risk Exposure)是指风险给个人,项目或组织带来的潜在损失。(ISO 160...

Day21 测试写起乃 - Webmock

在写测试的时後,一定会有第三方服务或是会打向外部api的时候,如果不想让他真的去打外部api怕速度过...

#29 No-code 之旅 — 部署至 Vercel

哇 倒数一天!最近都在准备把专案推上去 production 了,大家可以看看 Next.js 整理...

关闭核电厂的椅子

故事简述 核二厂2号机於2021/7/27清晨6时32分发生反应炉急停事件,初步调查为人为疏失 原能...

[第四天]从0开始的UnityAR手机游戏开发-介绍Unity介面和常用快捷键

Unity介面介绍 Unity最上方的工具列。 File:打开旧场景,开新场景、储存场景、开新旧或...