【问题标题】:UML state machine diagram: triggered exit from a composite stateUML 状态机图:从复合状态触发退出
【发布时间】:2018-05-06 15:42:47
【问题描述】:

我有一个 UML 状态机图,如下所示:

    +-----------------------------------+
    | A                                 |
    |      +------+  E1   +------+      |  E2   +-----+
o-->|  o-->|  A1  |------>|  A2  |------------->|  B  |
    |      +------+       +------+      |       +-----+
    |                                   |
    +-----------------+-----------------+
                      | E3
                      V
                   +-----+
                   |  C  |
                   +-----+

实际上,复合状态 A 有很多子状态,我想将其提取成一个单独的图表。这意味着从A2B 的过渡箭头必须被一个出口点切成两半

但是我应该把事件E2放在哪里呢?我想,我应该把它放在出口点的两边,也就是在两个图中:

高级图(o-o 是分解图标,(X) 是出口点):

    +-----------+
    |           |
    |           |   E2   +-----+
o-->|     A    (X)------>|  B  |
    |           |        +-----+
    |       o-o |
    +-----+-----+
          | E3
          V
       +-----+
       |  C  |
       +-----+

低级图:

+------------------------------------+
| A                                  |
|      +------+  E1   +------+  E2   |
|  o-->|  A1  |------>|  A2  |----->(X)
|      +------+       +------+       |
|                                    |
+------------------------------------+

请注意,E2 显示在两个图表中。不幸的是,我在UML spec 中找不到任何支持这个想法的东西。相反,这种方法显然会导致冲突(参见第 14.2.3.9.3 节)。但我认为这里没有冲突:

  • 两个转换都使系统离开状态A 并进入状态B。所以它们实际上形成了一个过渡。
  • 两个图都很容易理解,因为都显示E2,出口点看起来就像两个图之间的“门”,系统的状态通过它从(A, A2)“移动”到B。我认为仅在出口点的一侧显示E2 会造成混淆。
  • 如果有另一个类似的转换,例如从A1 到状态D(未显示),那么它可以以相同的方式处理,具有第二个退出点。但是,在这种情况下,两个出口点的标签应不同(例如:“从 A1 出口”和“从 A2 出口”)。

这是有效的 UML 吗?如果不是,我应该如何解决这个问题?

【问题讨论】:

  • 我最近被指向omg.org/spec/PSSM/1.0/Beta1盖茨,然而,仍然没有被提及(它们只适用于交互)。
  • @ThomasKilian 谢谢,我不知道这个文件。浏览了一下,我发现了一些示例,这些示例仅将事件放入 low level 图表中,即在出口点的“内侧”。事件到达时触发to退出点的过渡,第二次from退出点的过渡是自动,所以没有需要把事件放在上面。 UML 规范中有一个类似的论点,在第 14.2.3.4.6 节的最后一段。
  • @ThomasKilian 引用这段话(强调我的):“出口点是入口点的倒数。也就是说,源自复合状态中的顶点的转换可以在出口点终止。在格式良好的模型,这样的 Transition 应该有一个从同一个出口点传出的对应的外部 Transition,表示终止 Transition 的延续。”
  • 我也只浏览了那个文件。 SM 不是我的强项,本文档是 1.0 beta。不知道 OMG 将来如何处理 UML 和这个文档。也许他们会将 SM(部分)从 UML 中分离出来,因为它是一个如此复杂的领域。

标签: uml diagram transitions state-machine


【解决方案1】:

该事件应仅放置在转换的内部方。

退出点是一个伪状态,本质上意味着它没有内部逻辑,一旦状态机到达它,它“完成”意味着它准备好进行下一次转换。在您的情况下,您希望在发生E2 时触发从A2 的转换。这就是为什么必须将此事件放置在转换的内部部分的原因。另一方面,一旦过渡到达退出点(并且它“完成”),您希望不间断地进一步过渡到B,因此不应对传出(外部)过渡设置任何条件。

E2 放在过渡的两个“部分”上会改变图表的含义。它会在退出伪状态时停止转换并等待另一个E2 事件发生。只有到那时(E2事件之后)状态机才会达到B状态。

E2 放在外部也会有不同的含义。只有在A2 完成后才会转换到退出点(即使E2 发生得更早),并且只有转换from 退出点将等待E2 事件。另一方面,一旦A2完成,就会发生到退出点的转换,因此如果发生这种情况,来自A2的任何其他可能转换(例如一些E4)将不再可用,因为状态机已经离开 A2 并等待退出点(对于E2)。

您实际上已经在 cmets 中回答了您自己的问题,但我希望我的解释能够证明完整的答案是正确的。

【讨论】:

  • 感谢您的详细解释!这也是我阅读 UML 规范后的理解,或多或少。我不喜欢它的是E2 不会显示在高级图表上,所以看它不会告诉你是什么让系统离开状态A。显示这一点的唯一方法是给出口点一个有意义的标签,比如“E2 上的 A2 出口”。
  • 是的,一个描述性的出口点名称是个好主意。另一种选择是在退出点添加注释。
【解决方案2】:

在这种情况下,我会做的是显示 A,里面只有 A2,其余的都没有。注释会告诉“这是A 的摘录”。

    +----------------+
    | A (excerpt)    |
    |  +------+      |  E2   +-----+
o-->|  |  A2  |------------->|  B  |
    |  +------+      |       +-----+
    |                |
    +----------------+

同样,您可以通过添加注释省略B 部分。此外(如果工具允许)您可以在适当的地方添加详细图表的超链接。

【讨论】:

  • 那是有风险的。正式地,当达到一个状态时,所有没有传入转换的顶点(状态和伪状态)都会被激活。如此正式,尽管您的注释一旦执行到 A 的转换,A2 就会变为活动状态。如果您想遵循这种方法,显示导致 A2 的部分会更安全,但它会导致状态内部逻辑的复杂性增加,因此(有多个类似的转换)可能不再服务于目的.
  • @Ister 这取决于。如果你有一个复杂的 SM 并且需要一些方法来整理它,你必须做出妥协。将所有内容放在一个不可读的 SM 图中也是有风险的。图表旨在传输模型的信息。再说一次,我不是 SM 的专家……
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多