一个UML复合转移是否能够在趋向稳定配置的过程中同时进入并退出同一个复合状态?
在下方的状态机中,一条转换离开wait,进入状态S1(执行其Entry行为),然后再退出S1(执行其Exit行为),最终停在最终状态。

这在UML 2.5.1 / PSSM下合法吗?一个复合转换被定义为一个无环路径,其源集合和目标集合都是状态——但这两条规则仅约束端点并禁止重复顶点,在这里都没有被违反。我找不到任何条款限制复合转换在通往下一个稳定配置的路径上可以跨越(并再次跨越)哪些边界。
那么:规范真的允许一个(复合)转换在一次运行完成(RTC)步骤中进入然后退出同一个(复合)状态吗?
如果不允许,是哪条条款禁止?以及是否有实现(Papyrus/Moka、itemis CREATE等)支持或拒绝它?
解决方案
不可能。单条转换从来不会进入并退出同一个状态——规范以构造的方式定义退出/进入,而不是依据绘制线条接触的对象来决定。
根据UML 2.5.1 §14.2.3.9.6,转换的效果是基于其主源、主目标,以及它们的最近公共祖先(LCA)区域来计算的:
- 将源链退出至LCA,
- 运行其效果,
- 将目标链进入至主目标。
一个状态只有在位于源侧且低于LCA时才会被退出,只有在位于目标侧时才会被进入。LCA是这两组之间的边界,因此同一个状态不可能同时位于两侧——“在一个转换中先进入再退出”在算法中没有对应表示。这也是你找不到禁止条款的原因:它是通过构造排除的,而不是通过某条规则。
PSSM在其执行模型中正是对这一点进行了编码:TransitionActivation 计算 getLeastCommonAncestor(),并驱动 exit(...) / enter(...) / canPropagateExecution(...),每一个都采用最近公共祖先区域——因此进入/退出集来自于LCA,在一次转换中从不重叠。
在你的图中,wait和 final是同级节点,S1也是同级——并非它们的祖先。因此wait到 final的路径的顶层区域就是其LCA,且既不触及S1的 Entry也不触及S1的 Exit。触及S1框的那条线只是路由;S1并未被进入。
要在一次RTC步骤中真正让S1的 Entry再加Exit发生,需要一个复合转换——wait → S1(entry)加上一个完成转换S1 → final(exit)——也就是两段,其中一段进入S1,另一段退出S1。仍然不是一个单独的转换。
备选方案
不行。你画出的转换是从Wait直接到最终状态,并未进入或退出S1。无论源点到目标点的连线在视觉上是否穿过了其他状态,这对语义来说都是完全无关紧要的。