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

时间:2018-05-06 15:42:48

标签: uml diagram transitions state-machine

我有一个 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和#34;"退出A2")。

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

2 个答案:

答案 0 :(得分:1)

在这种情况下,我要做的是显示A内部只有A2,其余部分则停止。一张纸条会说明这是A"的摘录。

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

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

答案 1 :(得分:1)

该活动应仅限于转型的内部参与方。

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

E2放在"部分"转换将改变图表的含义。它将停止退出伪状态的转换,并等待另一个E2事件发生。只有这样(在第二次 E2事件之后)状态机才会达到B状态。

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

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