Skip to content

什么是状态机和状态图?

状态机帮助我们建模一个过程在事件发生时如何从一个状态转变到另一个状态。

状态机在软件开发中非常有用,因为它们帮助我们捕捉所有的状态、事件和它们之间的转换。使用状态机使得发现不可能的状态和不希望的转换变得更容易。

状态机对应用程序逻辑进行建模。下面是一个视频播放器的逻辑。当视频播放时,它会进入全屏模式。当视频停止时,它会退出全屏模式。当视频播放器处于全屏模式时,它可以是_播放中_或_暂停中_。

状态机的好处

  • 易于理解。 状态机是可视化的,易于理解。它们是与团队和利益相关者沟通的好方法。
  • 易于测试。 状态机是确定性的,这意味着它们易于测试。您可以测试所有可能的状态及其之间的转换。
  • 易于实现。 状态机在任何编程语言中都易于实现。您可以使用库或自己编写。
  • 易于维护。 状态机易于维护,因为它们易于理解、测试和实现。
  • 它们提供了一种清晰简洁的方式来建模复杂的用户界面和管理应用程序状态。
  • 状态机通过提供一种结构化的方式来管理状态转换和处理事件,可以帮助减少复杂性并提高可维护性。
  • 它们还可以通过强制不同部分的应用程序之间的明确关注点分离来帮助防止错误并提高代码质量。
  • 此外,状态机可以高度可维护,并提供一种使非常复杂的前端过程更易于管理的方法。

在后端

什么是状态图?

状态图扩展了传统的有限状态机,以建模更复杂的逻辑。

状态图是状态机的可视化扩展,使用方框和箭头,就像流程图和序列图一样。状态图添加了普通状态机中不可用的额外功能,包括层次结构并发通信

当您在Stately Studio中创建状态机时,它也是一个状态图!

状态

状态描述了机器的状态或模式,可以像睡着醒着一样简单。状态机一次只能处于一种状态。

狗的状态机,包含睡着和醒着的状态。醒着状态有一个警告,因为没有转换,这意味着无法到达醒着状态。狗的状态机,包含睡着和醒着的状态。醒着状态有一个警告,因为没有转换,这意味着无法到达醒着状态。

在 Stately Studio 中查看狗的状态机

狗总是睡着醒着。狗不能同时睡着和醒着,也不可能既不睡着也不醒着。只有这两种状态,一个精确有限的状态数量。

当状态机启动时,它首先进入初始状态。一个机器只能有一个顶级初始状态;如果有多个初始状态,机器将不知道从哪里开始!

在这个描述遛狗过程的状态图中,初始状态是等待遛狗。

XState 中的状态

在 XState 状态机中,状态在 states 属性中定义。

import { createMachine } from 'xstate';

const dogMachine = createMachine({
id: 'dog',
initial: 'asleep',
states: {
asleep: {
// ...
},
awake: {
// ...
},
//...
}
});

转换和事件

狗在睡着醒着之间的转换是通过转换实现的。事件引起转换;当事件发生时,机器转换到下一个状态。狗通过醒来入睡事件在睡着醒着之间转换。

转换是“确定性的”;每种状态和事件的组合总是指向相同的下一个状态。狗永远不会醒来变成睡着入睡变成醒着

在 Stately Studio 中查看狗的状态机及其事件和转换

通过其两个有限状态和转换,这个小狗过程是一个_有限状态机_。状态机用于描述某物的行为。机器描述了事物的状态及其之间的转换。它是一个有限状态机,因为它有有限数量的状态。(有时缩写为 FSM,喜欢行话的人会这样称呼)。

阅读更多关于转换和事件的信息

XState 中的事件和转换

在 XState 状态机中,事件和转换在状态的 on 属性中定义。

import { createMachine } from 'xstate';

const dogMachine = createMachine({
id: 'dog',
initial: 'asleep',
states: {
asleep: {
on: {
'wakes up': 'awake',
}
},
awake: {
on: {
'falls asleep': 'asleep',
}
},
//...
}
});

终态

大多数具有状态的过程将有一个_终态_,即过程完成时的最后一个状态。终态由状态的圆角矩形框上的双重边框表示。

在遛狗状态图中,终态是遛狗完成

狗的遛狗状态图,显示等待状态通过离开家的事件转换到遛狗状态,然后通过到达家的事件转换到遛狗完成的终态。狗的遛狗状态图,显示等待状态通过离开家的事件转换到�遛狗状态,然后通过到达家的事件转换到遛狗完成的终态。

在 Stately Studio 中查看遛狗状态机

阅读更多关于终态的信息

父状态

父状态是可以包含更多状态的状态,也称为子状态。这些子状态只能在父状态发生时发生。在遛狗状态中,可能有步行跑步的子状态。

父状态由一个带标签的矩形框表示,该矩形框充当其子状态的容器。父状态有时也称为_复合状态_。

在 Stately Studio 中查看遛狗状态机

父状态还应指定哪个子状态是初始状态。在遛狗父状态中,初始状态是步行

父状态和子状态是使状态图能够处理比普通状态机更复杂的功能之一。

阅读更多关于父状态的信息

原子状态

原子状态是没有任何子状态的状态。等待遛狗完成步行跑步都是原子状态。

并行状态

并行状态是其所有子状态(也称为区域)同时处于活动状态的状态。并行状态容器内部的区域由虚线分隔。

遛狗并行状态中,可能有两个区域。一个区域包含狗的活动子状态步行跑步,另一个区域包含狗的尾巴状态摇尾巴不摇尾巴。狗可以在步行时摇尾巴或跑步时摇尾巴,也可以在不摇尾巴的情况下进行这些活动。

在 Stately Studio 中查看遛狗状态机

两个区域还应指定哪个子状态是初始状态。在我们的尾巴区域中,初始状态是不摇尾巴

阅读更多关于并行状态的信息

自转换

自转换是指当事件发生时,转换返回到相同的状态。转换箭头退出并重新进入相同的状态。

描述自转换的一种有用方法是“做某事,而不是去某个地方”。

狗乞讨过程中,会有一个乞讨状态和一个得到零食事件。对于那些爱吃的狗来说,无论你经历多少次得到零食事件,狗都会回到它的乞讨状态。

在 Stately Studio 中查看狗乞讨状态机

阅读更多关于自转换的信息

接下来是什么?

现在您已经了解了足够的知识,可以在 Stately Studio 中开始使用。获取 Stately Studio 及其功能的概述,或继续学习 XState