UML 状态机图:从复合状态触发退出
UML state machine diagram: triggered exit from a composite state
我有一个 UML 状态机图,它看起来像这样:
+-----------------------------------+
| A |
| +------+ E1 +------+ | E2 +-----+
o-->| o-->| A1 |------>| A2 |------------->| B |
| +------+ +------+ | +-----+
| |
+-----------------+-----------------+
| E3
V
+-----+
| C |
+-----+
实际上,复合状态 A 有太多的子状态,我想将它提取到一个 单独的图 中。这意味着从 A2
到 B
的过渡箭头必须 被出口点 切成两半。
但是事件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
,并且两个图之间的出口点看起来像一个"gate",通过它系统的状态"moves"来自(A, A2)
到 B
。我认为仅在出口点的一侧显示 E2
会令人困惑。
- 如果有另一个类似的转换,例如从
A1
到状态 D
(未显示),则可以用相同的方式处理,使用第二个出口点。然而,在那种情况下,两个出口点应该被不同地标记(例如:"Exit from A1" 和 "Exit from A2")。
这是有效的 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
)。
你实际上已经在评论中回答了你自己的问题,但我希望我的解释能够证明完整的答案。
我有一个 UML 状态机图,它看起来像这样:
+-----------------------------------+
| A |
| +------+ E1 +------+ | E2 +-----+
o-->| o-->| A1 |------>| A2 |------------->| B |
| +------+ +------+ | +-----+
| |
+-----------------+-----------------+
| E3
V
+-----+
| C |
+-----+
实际上,复合状态 A 有太多的子状态,我想将它提取到一个 单独的图 中。这意味着从 A2
到 B
的过渡箭头必须 被出口点 切成两半。
但是事件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
,并且两个图之间的出口点看起来像一个"gate",通过它系统的状态"moves"来自(A, A2)
到B
。我认为仅在出口点的一侧显示E2
会令人困惑。 - 如果有另一个类似的转换,例如从
A1
到状态D
(未显示),则可以用相同的方式处理,使用第二个出口点。然而,在那种情况下,两个出口点应该被不同地标记(例如:"Exit from A1" 和 "Exit from A2")。
这是有效的 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
)。
你实际上已经在评论中回答了你自己的问题,但我希望我的解释能够证明完整的答案。