【问题标题】:In a UML state machine, can an initial pseudostate have incoming transitions?在 UML 状态机中,初始伪状态可以有传入的转换吗?
【发布时间】:2019-03-09 20:28:53
【问题描述】:

在 UML 2.5.1 中,状态机的 initial 伪状态定义如下:

一个初始的 Pseudostate 代表一个 Region 的起点;那 是,它是执行其包含的行为的点 当通过默认激活进入区域时开始。它是 最多一个转换的来源,这可能会产生相关的影响 行为,但不是相关的触发器或防护。可以在 一个区域中最多一个初始顶点。

换句话说,UML 状态机应该几乎总是包含一个初始伪状态,它应该有一个输出转换。

但是,初始伪状态是否也可以有传入转换?例如:

我在 UML 规范中找不到任何禁止它的东西,但是我在网上找不到任何发生这种情况的示例,因此我想知道我是否忽略了任何东西。


编辑: 更详细地说,如果我们查看规范中所述的 OCL 约束,我们只能找到以下影响传出转换的约束(第 14.5.6.7 节):

inv: (kind = PseudostateKind::initial) implies (outgoing->size() <= 1)

但我找不到关于传入转换的任何限制


EDIT2: 我刚刚意识到我的模型是错误的!考虑到规范中的这句话(上面引用):“它是至多一个转换的来源,它可能具有关联的效果行为,但不是关联的触发器或守卫。”

因此 inits1 之间的转换实际上应该有零个触发器,而不是将 e1 作为触发器。

请注意,虽然这不会使最初的问题无效。

【问题讨论】:

    标签: uml


    【解决方案1】:

    不,这是不允许的。为什么要这样做?正如您在引用的文本中已经说过的那样,它只能有一个传出边缘而没有任何防护。那么附加价值是什么,因为您不能重复使用任何东西。

    【讨论】:

    • 澄清一下,我不是在问这是否是一个好主意或实践,我只是想知道它是否是有效的 UML。关于引用的文本,它仅说明了关于传出转换的约束,而不是关于传入转换的约束,因此我提出了问题。事实上,使用 OCL(规范的第 14.5.6.7 节)仅限制初始状态的传出转换量,并且令人惊讶的是,没有关于传入转换量的 OCL 限制。
    • UML 规范在哪里说它是不允许的?
    【解决方案2】:

    我认为文本按原样非常清楚:“[初始伪状态] 是通过默认激活进入区域时开始执行其包含行为的点。”如果将转换连接回初始伪状态,则初始伪状态不再是“开始执行其包含的行为的点”,而是其他东西,因此是未定义的。

    【讨论】:

    • 以上声明不排除任何内容。如果我说“汽车可以运送人”,那并不意味着它不能运送其他任何东西。
    【解决方案3】:

    我在UML 2.5.1 Specification 中没有看到任何内容禁止目标是初始伪状态的转换。

    这样的过渡充其量是毫无意义的,最坏的情况是令人困惑,这可能是找不到示例的原因。

    【讨论】:

      【解决方案4】:

      编辑:查看 cmets!

      在第页。 423 UML 2.5:

      15.7.18 InitialNode [类]

      15.7.18.4 约束

      • no_incoming_edges

      InitialNode 没有传入的 ActivityEdges。

        inv: incoming->isEmpty()
      

      注意如果您打算对e1 进行自我转换,那么为什么不直接使用它呢? Initial 无论如何只能有一个单一的传出边缘,即到第一个状态(这里是s1)。

      【讨论】:

      • 规范的第 15 章涉及活动,而问题是关于状态机(第 14 章)。
      • @jaco0646 你说得有道理。它们都来自 Petri 网,如果 SM 缺少它,那么这可能是规范中的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多