UML 状态图中是否允许没有直接转换的状态?

Is a state without a direct transition allowed in UML state diagram?

UML 状态图 (SD) 中是否允许没有直接转换的状态,如下面用 StarUML 绘制的?

State1 不直接参与任何转换,所以我怀疑这在 UML 中是否允许/可取。我认为在我的应用程序中,我实际上是在单个 SD 中对多个对象建模。

State1 包含 State2,因此 State1 确实存在间接转换。该图相当于过渡到 State1,默认过渡到 State2,这会过于混乱。

简而言之

基于UML 2.5规范,这种图是完全有效的。然而,通过演绎,我们可以理解这不是最好的方法。

详情:为什么有效

根据定义(第 14.2.3.4.1 节):

  • State1 是一个 复合状态 恰好由一个 区域
  • State2State3简单状态,在这种情况下它们也是State1
  • 的直接子状态

关于进入状态的规则(第 14.2.3.4.5 部分)建议了您问题的第一个答案:

Explicit entry: If the incoming Transition or its continuations terminate on a directly contained substate of the composite State, then that substate becomes active and ...

这在与区域相关的规则(第 14.2.3.2 部分)中也得到了加强,更准确地说是在它们的激活方面:

  • 一个区域要么以它自己的本地初始伪事件开始(当封闭状态被激活时自动激活),要么它的一个 "orthogonal" 区域(即在同一复合状态中并发)被激活。
  • 或者如果区域被进入转换激活,则区域从显式状态(子状态)开始:

    an explicit activation occurs when a Region is entered by a Transition terminating on one of the Region’s contained Vertices.

所以你的图表是完全有效的,从初始状态到子状态的显式转换 State2

详情:不推荐的原因

首先,建议(第 14.2.4.5.1 节)在某些情况下隐藏复合状态的分解可能会有所帮助:

  • 使用显式激活,这种隐藏需要绘制模型的变体,显示从初始到 State1 的过渡,而不是直接过渡到 State2
  • 使用默认激活,您将只有一个模型:初始为 State1,State1::initial 为 State2。由您决定显示或隐藏详细信息。或者放大该区域而忽略其上下文。

然后,如果您稍后需要使用多个 "orthogonal" 区域扩展复合状态:

  • 使用默认激活,您只需添加具有自己的默认激活的其他区域。
  • 使用显式激活,一个(显式激活)区域和其他区域(需要默认激活)之间存在不对称。
  • 或者,您可以考虑进行多次显式激活。但这并没有得到很好的支持:首先,没有多个目标的转换,其次,从(外部)源状态到不同(内部)目标子状态的多个转换,在转换的语义和执行模型方面是不明确的。

UML 规范警告说,如果缺少默认激活,则应将模型视为定义错误,或者该区域将永远不会启动。所以使用系统的方法更安全,并且始终使用默认激活。

该图是单个对象(不是您怀疑的两个对象)的有效 UML 状态机图。但是,State1 没有用,因为对象在其整个生命周期中始终处于 State1。在 State1 时,它会在 State2 或 State3 中。