2012-07-08 68 views
2

基于Wikipedia,我可以有一个分层状态分解,其中我有多个正交区域,它们可以独立地改变状态。UML状态机:如何退出正交子区域?

该图显示了如何输入正交区域。我假设条目在所有地区平行发生。我想知道的是,你如何表达出口?如果每个地区都有退出,那么当第一个孩子地区退出或全部退出时,全球父母国家会退出吗?我想表达退出发生在他们有全部已退出。你如何表达全球父母国家转移到下一个全球性国家,因为所有的儿童地区已经退出?这是否总是隐含的?

我的具体问题是我的FSM从初始化全局状态开始。它将多个查询并行地异步发送到多个外部系统。只有收到每个查询的答案后,才能继续。因此,我将每个异步并行查询建模为全局初始化状态内的正交区域。每个小孩地区都可以独立改变状态。当所有的孩子地区都达到最终状态时,我可以继续前进。

FSM将在Actor框架中实现,其中异步消息(事件)是唯一沟通的方式。

理想情况下,我希望答案指向一个示例图像,因为这些东西很难用文字表达。

回答

6

从正交状态完成转换将做的伎俩,因为它会在所有的正交区完成时采取。

当输入组合状态(具有内部状态和/或正交区域的状态)时,每个区域从其初始状态开始,在每个区域中使用分叉假数据开始,或者到每个区域的最后状态状态通过历史假状态输入。退出复合状态可以通过从其中一个内部状态开始的转换来完成,该状态存在于其当前状态的所有正交区域。如果要在机器已到达不同地区的一组状态时退出,则还可以使用连接假状态。

正如你所看到的,可能性几乎是无止境的。我目前还不能添加图像,但稍后当我手头有一个很好的UML编辑器时,我会做。

一个现在的例子。假设你有以下状态机: example state machine

  1. 如果两个并行区域结束(最终节点时),然后完成过渡将采取机器从S1S5。如果
  2. 如果机器当前位于S3并且收到e1,则它将退出S1并转至S6
  3. 如果机器在S7S8并且它们都完成,它将进入加入,然后到S6

这是我知道状态机工作的方式。

+0

谢谢。这听起来是正确的,但我还不知道如何绘制“连接假状态”(因为如果我理解正确的话,它们必须是跨区域的)。等待这个例子... – 2012-07-08 16:50:50

+1

@SebastienDiot添加了一个示例。 – vainolo 2012-07-09 10:26:10

+0

@vainolo请原谅我复活这篇文章,但你用来创建这个图的“良好的UML编辑器”是什么?这很美 – daltonb 2016-06-24 02:08:55