UML 状态机图:从复合状态触发退出

UML state machine diagram: triggered exit from a composite state

我有一个 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 节)。但是我觉得这里没有冲突:

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

在这种情况下,我会做的是显示 A,其中只有 A2,其余的不显示。注释会告诉 "this is an excerpt of A"。

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

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

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

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

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

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

你实际上已经在评论中回答了你自己的问题,但我希望我的解释能够证明完整的答案。