UML状态机:深度历史伪状态和终态

3
在UML状态机中,如果进入子状态的最终状态,复合状态的历史记录会发生什么?考虑下面展示的状态机。在触发序列T1-T2-T3-T4之后,它将进入最终状态。通过进入最终状态,State21区域的历史记录被清除,并且由于该区域也已经完成,因此将执行到State1的完成转换。现在,当触发器T5启用时,状态机进入深度历史状态。我认为,在这种情况下,深度历史状态代表State21,这意味着状态机进入State21,然后执行从State21的初始伪状态到State211的转换。这样理解正确吗?我更喜欢上述所描述的行为,但我可以看到另一种选择,即当进入State21中的最终状态时,也会清除State2的历史记录。在这种情况下,状态机将执行从State2的初始伪状态到State22的转换。那么你认为呢?

State Machine


你的第一个解释对于你的图是正确的。为了澄清,State2 需要在其中有 FinalState,并且从 State21 到该 FinalState 有一条完成状态转换,从 State2 到 State1 也有一条完成状态转换。在这种情况下,第二个解释才是正确的。 - zer0hedge
2个回答

2

根据我对deepHistory描述的理解,这种伪状态是一种变量,代表其所属区域的最近活动状态配置。如上所述,终止于此伪状态的转换意味着将该区域恢复到相同的状态配置,但具有进入状态的所有语义(请参见描述状态输入的子条款)。

您的第一个行为描述似乎是正确的。通过触发T1、T2、T3、T4和T5转换,您将回到State21入口,即State211。


1
我这样阅读这个图表:
当在State1时,您可以通过调用T1(一个新的序列)或通过T2(先前序列的重试)进入State2。
当应用程序/系统处于State1中时,它似乎具有允许在某些情况下重试先前的State2序列的逻辑。因此,深度历史将这些过程变量保留在父状态中,直到State1可以决定它想要继续哪种方式。
然而,在示例状态机模型中存在歧义:
1.回到State1的转换未命名/编号; 2.未定义需要深度历史的中间部分完成状态。该模型需要在State21内定义作为未命名转换回State1源的子状态的退出状态/标准。
在State21内的当前流仅具有一个结束状态,因此每次都运行到完成。只有当您需要在给定的子状态位置重新输入状态时,深度历史才有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接