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