1

给定一个包含两个组件 A 和 B 的系统,并且

系统同时启动 A 和 B。现在 A 可以通过状态 {A.Starting, A.Ready},B 可以处于状态 {B.Starting, B.DoingX, B.DoingY}。(相应地命名 A 和 B 状态之间转换的事件:B.doingx => B 转到 B.DoingX 等...)

来自 yuml.me 的 A 和 B 状态机

我想建模

  • 当 A 在 A.Starting 中,或 B 在 B.Starting 中时,系统正在“启动”
  • 当 A 处于 A.Ready 且 B 处于 B.DoingX 时,系统处于“DoingX”状态
  • 当 A 处于 A.Ready 且 B 处于 B.DoingY 时,系统处于“DoingY”状态

来自 yuml.me 的系统状态机

如果我没记错的话,这里可以使用 fork/join 伪状态。

但是这些模型元素是否具有上述组合状态的声明性语义?有没有另一种方法来模拟这个?

(注:图表来自http://yuml.me

4

1 回答 1

3

你为什么不把这些拆开?这是关于如何建模的另一个想法(假设我理解正确):

  • 一个状态“Starting”,其中包含您在并行区域中称为 A.Starting 和 B.Starting 的状态(您可以在此处使用 fork/joins,或者仅依赖于在“Starting”状态时激活的所有区域的默认行为已输入)

  • 另一个状态“Doing”,其中包含一个具有“A.Ready”状态的区域和另一个并行区域,其中包含两个状态“B.DoingX”和“B.DoingY”。

如果你真的需要一个整体的“DoingX”状态,那么你可能需要创建两个对应于 A.Ready 的状态。

无论如何,从更广泛的角度来看:当你说“系统处于状态......”时,我相信你的观点有点偏离。相反,由这种状态机建模的系统处于一组状态。所以通常情况下,我会非常高兴地说“系统当前处于 A.Ready 和 B.DoingX 中”。

也许您所需要的只是改变术语。那这个呢:

当 A.Ready 和 B.DoingX 状态处于活动状态时,系统是否处于配置“DoingX”?

回应评论:是的,这是标准的,这是上层建筑规范(版本 2.4 beta)中的相应部分:

在分层状态机中,可以同时激活多个状态。[...] 当前活动的“状态”实际上由一组状态树表示,从根区域的最顶层状态到最里面的活动子状态。我们将这样的状态树称为状态配置

于 2011-10-19T12:07:49.713 回答