3

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

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

在此处输入图像描述

4

3 回答 3

2

简而言之

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

详细信息:为什么有效

根据定义(部分14.2.3.4.1):

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

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

显式条目:如果传入的转换或其延续终止于复合状态的直接包含的子状态,则该子状态变为活动状态并且...

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

  • 一个区域要么以它自己的本地初始伪事件开始(即在激活封闭状态时自动激活,要么激活它的“正交”区域(即同时处于同一复合状态)。
  • 或者,如果区域由进入转换激活,则区域从显式状态(子状态)开始:

    当通过终止于该区域包含的顶点之一的过渡进入区域时,将发生显式激活。

因此,您的图表完全有效,具有从初始状态到子状态的显式转换State2

细节:为什么不推荐

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

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

然后,如果您稍后需要使用多个“正交”区域扩展您的复合状态:

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

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

于 2018-12-13T21:19:21.413 回答
0

State1 包含 State2,因此 State1 确实存在间接转换。该图等效于转换到 State1 并默认转换到 State2,这将过于混乱。

于 2018-12-13T15:44:09.490 回答
0

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

于 2018-12-14T22:38:03.610 回答