【问题标题】:Composite state and internal transitions复合状态和内部转换
【发布时间】:2017-02-05 13:37:52
【问题描述】:

如果我现在在 StateB。 SIG2 来了。因此不会执行任何进入或退出,而只会执行 Act5。到目前为止一切顺利。

现在我们在 StateC 中,但这次 Sig1 来了。定义了一个内部转换,但处于父复合状态。我是否必须从 StateC 退出,执行 Act2 并转到初始连接器并进入 StateB?

我没有在 UML 标准中找到这个问题的答案。

【问题讨论】:

  • StateC 无法访问,您如何到达那里?
  • 你是对的,但它与问题的本质并不真正相关。这就是为什么我没有详细说明这个状态机,只是做了一些“又快又脏”的东西。

标签: uml statechart


【解决方案1】:

您无需退出StateC,只要您处于某个拥有状态的某些子状态,就会始终发生内部转换。

14.5.12.3 文字

  • 内部
    • 暗示转换,如果被触发,在不退出或进入源状态的情况下发生(即,它不 导致状态变化)。这意味着不会调用源状态的进入或退出条件。 安 即使 SateMachine 位于嵌套在关联状态中的一个或多个区域中,也可以进行内部转换。

这是有道理的——你总是处于复合状态的某个子状态。 (一旦您进入复合状态,它会立即(在entry 行为之后)进入第一个状态。

当然,内部转换不会改变状态配置,所以它会保持不变 (<StateA::StateC>)。

这一切当然是假设你传送到StateC,因为那个状态是不可达的。

【讨论】:

  • 我倾向于像你一样解释最后一句话。但是,该标准在这方面可能更具体一些。谢谢彼得!
  • 通常会存在某种程度的歧义(尤其是在状态机中),因此最终用户可以根据自己的需要决定确切的语义。
【解决方案2】:

The Wikipedia article on UML statecharts 目前提出了一个明确的断言来解决这个问题:

与自转换相比,内部转换不会执行任何进入或退出操作,即使内部转换是从比当前活动状态更高的层次结构继承而来的。 从任何嵌套级别的超状态继承的内部转换就像在当前活动状态中直接定义一样。

不幸的是,它没有来源。我同意@user2281723 的规范是模棱两可的。来自UML 2.5 的第 14.2.3.8.1 节:

internallocal 转换的特例,它是自转换(即,具有相同的源和 目标国家),这样国家就永远不会退出(因此,不会重新进入),..

如果这意味着未退出整个活动状态配置(嵌套层次结构中的所有活动状态),则没有状态更改。如果这意味着只有拥有内部转换的特定状态没有退出,那是否意味着所有子状态都将退出并且具有转换的状态将变为活动状态?这就是模型中转换的目标状态。

我怀疑第一个含义是规范编写者的意图,并且是在实践中使用的含义。希望最终会在规范中添加说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-02-22
    相关资源
    最近更新 更多