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

UML状态机图:从复合状态触发退出,uml,diagram,transitions,state-machine,Uml,Diagram,Transitions,State Machine,我有一个UML状态机图,它看起来像这样: +-----------------------------------+ | A | | +------+ E1 +------+ | E2 +-----+ o-->| o-->| A1 |------>| A2 |------------->| B | | +------+

我有一个UML状态机图,它看起来像这样:

    +-----------------------------------+
    | A                                 |
    |      +------+  E1   +------+      |  E2   +-----+
o-->|  o-->|  A1  |------>|  A2  |------------->|  B  |
    |      +------+       +------+      |       +-----+
    |                                   |
    +-----------------+-----------------+
                      | E3
                      V
                   +-----+
                   |  C  |
                   +-----+
实际上,复合状态A有太多子状态,我想将其提取到一个单独的图表中。这意味着从
A2
B
的转换箭头必须被一个退出点切成两半

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

高级图(分解图标为
o-o
,退出点为
(X)
):

低层图:

+------------------------------------+
| A                                  |
|      +------+  E1   +------+  E2   |
|  o-->|  A1  |------>|  A2  |----->(X)
|      +------+       +------+       |
|                                    |
+------------------------------------+
请注意,
E2
显示在两个图中。不幸的是,我在报告中找不到任何东西支持这一想法。相反,这种方法显然会导致冲突(见第14.2.3.9.3节)。但我认为这里没有冲突:

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

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

在这种情况下,我要做的是显示
A
,其中只有
A2
,其余的都不显示。一个注释会告诉你“这是
A
的摘录”


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

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

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

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

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


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

最近有人指我,但我仍然没有提到盖茨(他们只适用于互动)@ThomasKilian谢谢,我不知道这个文档。浏览它,我发现了一些示例,这些示例只将事件放在低级图表中,即“内部”当事件到达时,它触发到退出点的转换,并且从退出点的第二次转换是自动的,因此不需要将事件放在它上面。UML规范中有一个类似的参数,在第14.2.3.4.6节的最后一段中。@ThomasKilian引用了这一段(强调我):“出口点与入口点相反。也就是说,源自复合状态内顶点的过渡可以终止于出口点。在格式良好的模型中,此类过渡应有一个对应的外部过渡,从同一出口点传出,表示终止过渡的延续。“我也只是浏览了一下那个文档。SMs不是我的强项,这个文档是1.0测试版。不知道OMG将来会如何处理UML和这个文档。也许他们会将SMs(部分)解耦。”因为它是一个如此复杂的领域。谢谢你的详细解释!这也是我在或多或少地阅读了UML规范后的理解。我不喜欢它的地方是,
E2
不会显示在高级图表上,所以查看它不会告诉你是什么使系统离开状态
a
。唯一的方法是这是如何给出口点添加有意义的标签的,如“E2上的出口A2”。是的,一个描述性的出口点名称是一个非常好的主意。另一个选项是添加一个附加到出口点的注释。这是有风险的。正式地说,当达到一个状态时,所有顶点(状态和伪状态)没有传入转换的将被激活。因此,在正式情况下,尽管您注意到,一旦执行到A的转换,A2将变为活动状态。如果您希望遵循此方法,则显示导致A2的部分会更安全,但这将导致
+------------------------------------+
| A                                  |
|      +------+  E1   +------+  E2   |
|  o-->|  A1  |------>|  A2  |----->(X)
|      +------+       +------+       |
|                                    |
+------------------------------------+
    +----------------+
    | A (excerpt)    |
    |  +------+      |  E2   +-----+
o-->|  |  A2  |------------->|  B  |
    |  +------+      |       +-----+
    |                |
    +----------------+