UML中具有并发子状态的“声明性”复合状态

时间:2011-10-19 09:15:34

标签: concurrency uml state-diagram

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

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

A and B state machine from yuml.me

我想模仿那个

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

System state machine from yuml.me

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

但是这些模型元素是否具有上述组合状态的声明性语义?还有其他方法可以对此进行建模吗?

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

1 个答案:

答案 0 :(得分:3)

你为什么不把它们拆开?以下是关于如何对其进行建模的另一个想法(假设我理解正确):

  • 一个状态“Starting”,它包含你所指的状态A.Starting和B.Starting in parallel areas(你可以在这里使用fork / join,或者只依赖于所有区域的默认行为)输入“正在启动”状态时激活

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

    < / LI>

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

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

也许你需要的只是改变术语。那怎么样:

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

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

  

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