UML状态机图两个箭头处于相同状态

UML状态机图两个箭头处于相同状态,uml,Uml,在给定的示例中: 从S0移动到S2的条件是什么? e1和[x==6]是否需要为真,或者仅仅其中一个为真就足以移动到s2状态?这是两个独立的转换,因此只需要触发一个事件 您没有询问,但请注意,当处于状态s1时,事件e1是不确定的。原因是有两种相互竞争的转换可用 我将指出,正如@thomas所建议的,您可以通过将该防护添加到该事件中,使该防护也应用于事件e1。它看起来像e1[x==6] 在UML中,内部转换优先于外部转换(参见UML2.4.1规范第15.3.12节中的“转换选择算法”),因此,在s

在给定的示例中:

从S0移动到S2的条件是什么?
e1和[x==6]是否需要为真,或者仅仅其中一个为真就足以移动到s2状态?

这是两个独立的转换,因此只需要触发一个事件

您没有询问,但请注意,当处于状态s1时,事件e1是不确定的。原因是有两种相互竞争的转换可用


我将指出,正如@thomas所建议的,您可以通过将该防护添加到该事件中,使该防护也应用于事件e1。它看起来像
e1[x==6]

在UML中,内部转换优先于外部转换(参见UML2.4.1规范第15.3.12节中的“转换选择算法”),因此,在s0中,获得e1时,将始终触发内部转换。
因此,移动到s2的唯一方法是发送e1三次,这将使防护条件变为真,因此运行到完成步骤将过渡到s2。顺便说一句,即使防护将被启用,并且将发生到S2的转换,但由于s1的退出动作,当到达S2时,x的值实际上将为7。

转换没有事件<代码>[x==6]是一个保护。该转换由完成事件触发,仅当该保护条件的计算结果为true时才适用。要使该条件和
e1
处于相同的转换箭头处,则需要该保护。也许答案中也会提到这一点。OP图中没有内部转换。转换s1::e1是自转换,而不是内部转换。但是,当状态机位于s0::s1中时,事件e1确实会触发s1::e1,因为子状态始终优先于超状态(这是与状态嵌套相关的语义,而不是与内部转换相关的语义)。顺便说一句,当s1::e1被触发时,事件被消耗,支持状态s0将永远不会执行s0::e1或完成转换s0::[x==6]。因此,似乎没有从s0到s2的路径。状态机是错误的。