当离开转换的两个保护条件都为假时,状态机会去哪里?

问题描述 投票:0回答:1

我正在练习下周一的 UML 考试,其中一个问题是下图的结果是什么,我认为该图无效,因为 x 的值第一次正好是 9。守卫是: 大于 9 和 10 或更大。所以两个守卫都不是真的,因为守卫(+1)之后的效果是在守卫被求值之后运行的。我是否遗漏了什么,或者这确实不对:

我认为该图无效,因为两个守卫都是假的。

state uml state-machine effects
1个回答
0
投票

这是一个非常有趣的边缘案例。当跟踪状态机时,我们看到它进入由红色箭头包围的状态,值为 8,假设 x 是与该状态机同时运行的任何其他状态机都无法访问的属性。

问题是守卫是在退出行为之前还是之后进行评估。不幸的是,规格在这方面并不是非常明确。来看看详情吧。

首先,守卫是执行转换的条件。根据 UML 2.5.1 规范(第 314 页),过渡:

可能有一个关联的效果行为,当Transition被遍历(执行)时执行。

这意味着只有在离开状态并且转换触发后才会完成转换的效果。因此,无论如何,守卫之前必须为真,并且传出的转换不会影响守卫评估。

可以考虑两个假设:

  • 在退出状态之前对守卫进行评估。在这种情况下,x 是 8,
    [x<9]
    将会触发。
  • 退出状态后评估守卫,在这种情况下 x 为 9 并且两个守卫都为 false,这意味着不会退出状态,因此 x 将保持在 8。

我们读到的规格的 Pager 315:

转换可能有关联的保护约束。具有评估为 false 的防护的转换将被禁用。

但是启用的转换是什么? UML 规范需要几个条件,特别是:

(...)从源状态配置到目标状态配置至少存在一条完整路径,或者(...)其中所有保护条件都为真

从源到目标的完整路径需要离开状态。 UML 2.5.1 规范的 P 311/312 对此进行了解释:

无论状态如何退出,只有在该状态的退出行为(如果定义)完成执行后,状态机才被视为“离开”该状态。

因此,除非我错过了规范中的某些内容,否则这意味着没有启用任何路径,因为退出意味着 x 为 9,并且两个防护都会评估为 false。

P.S.:请注意,如果转换进入选择伪状态,情况会有所不同,因为在达到伪状态时会评估走出伪状态的防护

© www.soinside.com 2019 - 2024. All rights reserved.