我有一个 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
,并且出口点看起来像一个"门"在两个图之间,系统的状态通过这两个图移动"从(A, A2)
到B
。我认为仅在出口点的一侧显示E2
会很困惑。A1
到状态D
(未显示),则可以使用第二个退出点以相同的方式处理它。但是在这种情况下,两个出口点的标记应不同(例如:"退出A1和#34;"退出A2")。这是有效的UML吗?如果没有,我该如何解决这个问题?
答案 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
)。
您实际上已经在评论中回答了您自己的问题,但我希望我的解释能够证明完整的答案。