UML状态机深入解析
1. 入口和出口动作的优势
在状态机设计中,如果让每个过渡都保持“门打开”状态,会导致许多过渡中动作的重复执行。而且,这种方法在状态机发生变化时容易出错,例如后续开发新功能(如顶部烤焦功能)的程序员可能会忘记在过渡到“门打开”状态时关闭加热器。
入口和出口动作则能以更安全、简单和直观的方式实现所需行为。例如,从“加热”状态的出口动作可以关闭加热器,进入“门打开”状态的入口动作可以点亮烤箱灯,而从“门打开”状态的出口动作可以熄灭灯。使用入口和出口动作优于在过渡上放置动作,因为它避免了过渡上动作的重复,并消除了门打开时加热器仍开启的基本安全隐患。出口动作的语义保证了,无论过渡路径如何,当烤面包机不在“加热”状态时,加热器都会被关闭。
入口动作在进入关联状态时会自动执行,它们通常决定操作条件或状态的标识,就像类构造函数决定被构造对象的标识一样。例如,“加热”状态的标识由加热器开启这一事实决定。在进入“加热”的任何子状态之前,必须建立这个条件,因为进入“加热”子状态(如“烘烤”)的入口动作依赖于“加热”父状态的正确初始化,并仅执行与该初始化不同的操作。因此,入口动作的执行顺序必须始终从最外层状态到最内层状态。这与类构造函数的调用顺序类似,类的构造总是从类层次结构的根开始,经过所有继承级别,直到实例化的类。而出口动作的执行顺序则与析构函数调用顺序相反,从最内层状态(对应于最派生的类)开始。
2. 内部过渡
常见情况下,一个事件可能只导致一些内部动作执行,但不会导致状态改变(状态过渡)。这种情况下,所有执行的动作构成内部过渡。例如,在键盘上打字时,键盘会生成不同的字符代码,但除非按下大写锁定键,否则键盘的状态不会改变(没有状态
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



