在BetterState 中,初始/开始状态用一个缺省的符号( )来表示。图6 是一个和图5 相似的状态图,它指定了一个开始状态。
图 6 一个有开始状态的简单状态图
注意:一个简单的FSM可以仅有一个初始状态。但对于扩展状态图,由于要表现层次和并行关系,可能有多个开始状态,并且在任何时候都可能有多个状态机在运行。
条件和动作
要使我们的状态图完整,你可能想增加两个额外的选项:
选项条件 (conditions) 导致状态的改变
选项动作 (actions) 表示系统在改变状态时将做什么。
注意:事件驱动的编程语言,例如在Delphi, Visual Basic, 和 MFC中,事件会引发状态的改变。有关该问题的详细信息,请参见用户指南中的事件驱动编程部分。
转换条件是系统能够检测到的外部环境中的一些条件。它可能是一个信号,一个中断,或者一个到达的数据包。它可能是任何导致系统状态改变的东西,使系统从一个等待状态 x 改变到一个新的等待状态 y,或者从执行活动 x 改变为执行活动 y。
在改变状态过程中,系统可能执行一个或多个动作。它们可能是产生一个输出,或在用户终端上显示一个消息,执行某些计算等等。在状态图中,动作是为了响应外部环境,或执行计算,系统将记录结果以便响应将来发生的某些事件。
图7:有特定条件和动作的简单状态图
注意:在BetterState中,当你在两个状态之间添加一个转换后,会显示一个对话框,在对话框中可以定义转换的条件以及所需的动作。这部分将在BetterState Pro用户指南的第四章详细讨论。
设计第一个状态图
现在,你已经掌握了足够的状态图设计方法的基础知识,可以对系统行为建模了。我们的第一个设计是个小小的挑战,设计冰激凌销售机的逻辑,它应该能够检测到卖了三个蛋卷冰激凌。你可以先用笔和纸来设计,这样可以加深对前面所学东西的理解,当然,你也可以跳过这一步,直接使用BetterState。
注意:请记住教程第二章的目的是告诉你如何设计扩展状态图。我们只用了很少的篇幅介绍BetterState 的用法。这部分将在第三章详细讲述。如果你想使用BetterState 来完成这个设计,建议你先学习第三章,它将引导你逐步完成一个类似的设计。
在这个简单例子中,先添加一个初始状态,命名为Start,然后添加第二个状态,名为One Sold。One Sold状态指你的系统在卖出一个冰激凌后的状态。现在你可以从状态Start 转换到状态One Sold。然而除非真的卖出了一个蛋卷冰激凌,否则你不希望系统发生状态转换(从状态Start 转换到状态One Sold)。因此从状态Start 到状态One Sold 的转换条件为Cone Sold (卖出了一个蛋卷)。该过程将继续,直到三个蛋卷都卖出去了。在这个例子中我们没有使用动作,不过我们可以使用。可以为该设计加上一个动作,如每次卖出冰激凌后在收银机上记录销售额。