【发布时间】:2018-12-13 14:46:11
【问题描述】:
在 UML 状态图 (SD) 中是否允许没有直接转换的状态,如下图用 StarUML 绘制的?
State1 不直接参与任何转换,所以我怀疑这在 UML 中是否允许/可取。我认为在我的应用程序中,我实际上是在单个 SD 中对多个对象进行建模。
【问题讨论】:
在 UML 状态图 (SD) 中是否允许没有直接转换的状态,如下图用 StarUML 绘制的?
State1 不直接参与任何转换,所以我怀疑这在 UML 中是否允许/可取。我认为在我的应用程序中,我实际上是在单个 SD 中对多个对象进行建模。
【问题讨论】:
根据 UML 2.5 规范,这种图是完全有效的。然而,通过推理,我们可以理解这不是最好的方法。
根据定义(14.2.3.4.1部分):
State1 是一个复合状态,由一个区域组成。 State2 和 State3 是简单状态,在这种情况下,它们也是 @ 的直接子状态 987654326@
进入状态的规则(14.2.3.4.5 部分)建议您的问题的第一个答案:
显式条目:如果传入的转换或其延续 终止于复合状态的直接包含的子状态, 然后该子状态变为活动状态并...
这在与区域相关的规则中也得到了加强(14.2.3.2 部分),更准确地说是它们的激活:
或者,如果区域被进入转换激活,则区域从显式状态(子状态)开始:
当一个 Region 被一个 Transition 输入时,会发生显式激活 终止于区域包含的顶点之一。
因此,您的图表完全有效,具有从初始状态到子状态State2 的显式转换。
首先,建议(第 14.2.4.5.1 节)在某些情况下隐藏复合状态的分解可能会有所帮助:
State1 的转换,而不是直接转换到State2。 然后,如果您以后需要使用多个“正交”区域扩展复合状态:
UML 规范警告说,如果缺少默认激活,应该认为模型定义不明确,或者该区域永远不会启动。所以使用系统的方法更安全,并且始终使用默认激活。
【讨论】:
State1 包含 State2,因此 State1 确实存在间接转换。该图等效于转换到 State1 并默认转换到 State2,这将过于混乱。
【讨论】:
该图是单个对象(不是您所怀疑的两个对象)的有效 UML 状态机图。但是,State1 没有用,因为对象在其整个生命周期中始终处于 State1 中。在 State1 中,它要么在 State2 中,要么在 State3 中。
【讨论】: