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
是一个 复合状态 恰好由一个 区域。
State2
和State3
是简单状态,在这种情况下它们也是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 中。
UML 状态图 (SD) 中是否允许没有直接转换的状态,如下面用 StarUML 绘制的?
State1 不直接参与任何转换,所以我怀疑这在 UML 中是否允许/可取。我认为在我的应用程序中,我实际上是在单个 SD 中对多个对象建模。
State1 包含 State2,因此 State1 确实存在间接转换。该图相当于过渡到 State1,默认过渡到 State2,这会过于混乱。
简而言之
基于UML 2.5规范,这种图是完全有效的。然而,通过演绎,我们可以理解这不是最好的方法。
详情:为什么有效
根据定义(第 14.2.3.4.1
节):
State1
是一个 复合状态 恰好由一个 区域。State2
和State3
是简单状态,在这种情况下它们也是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 中。