【问题标题】:UML state machine diagram two arrows out of the same stateUML 状态机图 两个箭头出同一个状态
【发布时间】:2016-02-14 09:27:30
【问题描述】:

在给定的示例中:

从 S0 移动到 S2 的条件是什么? e1 and [x==6] 是否需要为真,或者只有其中一个为真才能进入 s2 状态?

【问题讨论】:

    标签: uml


    【解决方案1】:

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

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

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

    【讨论】:

    • [x==6] 转换没有事件。 [x==6] 是守卫。
    • 转换由完成事件触发,并且仅在该保护条件评估为 true 时适用。
    • 要拥有 AND 条件,e1 需要在同一个转换箭头处进行防护。也许这也可以在答案中注明。
    【解决方案2】:

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

    【讨论】:

    • OP 图中没有内部转换。转换 s1::e1 是自转换,而不是内部转换。但确实当状态机在 s0::s1 中时,事件 e1 将触发 s1::e1,因为子状态总是优先于超状态(这是与状态嵌套相关的语义,而不是与内部转换相关的语义)。顺便说一句,当 s1::e1 被触发时,事件被消耗,超级状态 s0 将永远不会执行 s0::e1,或者完成转换 s0::[x==6]。因此似乎没有从 s0 到 s2 的路径。状态机是错误的。
    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多