前提是我现在在 StateB。SIG2 来了。因此不会执行任何进入或退出,而只会执行 Act5。到目前为止,一切都很好。
现在我们在 StateC 中,但这次 Sig1 来了。定义了一个内部转换,但处于父复合状态。我是否必须从 StateC 退出,执行 Act2 并转到初始连接器并进入 StateB?
我没有在 UML 标准中找到这个问题的答案。
前提是我现在在 StateB。SIG2 来了。因此不会执行任何进入或退出,而只会执行 Act5。到目前为止,一切都很好。
现在我们在 StateC 中,但这次 Sig1 来了。定义了一个内部转换,但处于父复合状态。我是否必须从 StateC 退出,执行 Act2 并转到初始连接器并进入 StateB?
我没有在 UML 标准中找到这个问题的答案。
您不需要 exit StateC
,只要您处于它的某些子状态,就可以始终发生拥有状态的内部转换。
14.5.12.3 文字
- 内部的
- 意味着转换,如果被触发,在不退出或进入源状态的情况下发生(即,它不会导致状态改变)。这意味着不会调用源状态的进入或退出条件。即使 SateMachine 位于嵌套在关联状态中的一个或多个区域中,也可以进行内部转换。
这是有道理的——你总是处于复合状态的某个子状态。(一旦您进入复合状态,它立即(在entry
行为之后)进入第一个状态)。
当然,内部转换不会改变状态配置,所以它会保持不变(<StateA::StateC>
)。
这一切当然是假设你传送到StateC
,因为那个状态是无法到达的。
关于 UML 状态图的 Wikipedia 文章目前提出了一个明确的断言来解决这个问题:
与自转换相比,内部转换不会执行任何进入或退出操作,即使内部转换是从比当前活动状态更高的层次结构继承而来的。从任何嵌套级别的超状态继承的内部转换就像它们是直接在当前活动状态中定义的一样。
不幸的是,它没有来源。我同意@user2281723 的规范是模棱两可的。从UML 2.5的第 14.2.3.8.1 节:
internal是本地转换的一种特殊情况,它是一种自转换(即具有相同的源和目标状态),因此该状态永远不会退出(因此,不会重新进入),..
如果这意味着未退出整个活动状态配置(嵌套层次结构中的所有活动状态),则没有状态更改。如果这意味着只有拥有内部转换的特定状态没有退出,那是否意味着所有子状态都将退出并且具有转换的状态将变为活动状态?那是模型中转换的目标状态。
我怀疑第一个含义是规范作者的意图,并且是在实践中使用的含义。希望最终将在规范中添加说明。