UML状态机:选择后的冲突

UML状态机:选择后的冲突,uml,state-machine,Uml,State Machine,如果transition selection algorithm(TSA)发现两个应该触发的转换,并且以下情况成立,UML状态机中会发生什么情况: 转换#1直接以状态结束 过渡#2以选择伪态(中间)结束 当这两种转换都启动时,它们不会发生冲突。否则,TSA一开始就不会选择他们 现在发生了以下情况: 在对选择进行评估时(在转换#2之后),它将采用一条路径(转换),该路径将导致转换#2的源状态的祖先状态退出。由于祖先状态的退出,与转换#1发生冲突 显示这种情况的UML图 (根据与Thomas K

如果transition selection algorithm(TSA)发现两个应该触发的转换,并且以下情况成立,UML状态机中会发生什么情况:

  • 转换#1直接以状态结束
  • 过渡#2以选择伪态(中间)结束
当这两种转换都启动时,它们不会发生冲突。否则,TSA一开始就不会选择他们

现在发生了以下情况: 在对选择进行评估时(在转换#2之后),它将采用一条路径(转换),该路径将导致转换#2的源状态的祖先状态退出。由于祖先状态的退出,与转换#1发生冲突

显示这种情况的UML图

(根据与Thomas Kilian在对其(现已删除)答案的评论中进行的讨论改进)

。。。如果事件_1发生且x<0

问题

  • 是国家机器的形式不正确,还是现在应该发生什么
  • 在选择离开一个州后,进行转换是否违法?至少它不能很好地与“转换执行序列”(退出、转换行为、进入)配合使用。在这种情况下,它将是exit,behavior,exit,behavior,enter(s)。我在UML上层建筑规范(第15章)中找不到任何关于这方面的内容。但是关于正交区域的所有内容在那个文档中都描述得非常模糊
动机


我是从库实现者的角度提出这个问题的。因此,我的重点不是如何更好地设计这种情况。我需要弄清楚如何正确处理这种情况(或者我需要知道这是一种非法情况)。

这就是OMG中存在“UML状态机精确语义”的原因之一

首先,大多数转换退出一个状态是合法的。UML规范中有一些限制,但是没有一个与您的设计有关

在任何状态机区域内,都应该始终有一个可能处于活动状态的状态。目前,在“StateMachine1”中有一个隐式区域,其中包含“X”和“Y”状态。这意味着您的状态机可以同时处于“StateMachine1::X”和“StateMachine1::Y”状态!正如你可能已经知道的,正交状态确实可以处理这种情况。也许您需要在StateMachine1::S的区域中引入“X”和“Y”

还有一个警告,在UML中默认情况下,状态具有浅历史。这意味着,就目前而言,StateMachine1::S区域内的初始传输将只进行一次。如果你试图回到“S”(我知道,你没有一个过渡——只是猜测),它将回到If离开该州之前的最后几个州(每个地区一个),在事件1之后,将是“a”和“E”


在不知道您试图建模什么的情况下,很难进行更多的评论,但我希望这会有所帮助。

什么是“UML状态机的精确语义”?这是我应该能够在OMG网站上找到的文档吗。“这意味着您的状态机可能同时处于两种[…]状态!”您是说在示例中这是可能的,还是说根据UML规范这是可能的?在我对UML上层建筑规范的解释中,这是非法的。2.“还有一个警告,在UML中,默认情况下,状态的历史很浅。”我不认为这是真的。UML规范声明“到封闭状态的转换表示每个区域到初始伪状态的转换。”。。。3.“知道你想做什么”问题是:我现在不想自己做任何模型。我正在写一个状态机库。我想知道如何正确处理别人的设计。所以我的问题基本上是:如果有人在我的框架中抛出这样的模型,我该怎么办?UML状态机的精确语义是OMG的提案请求。这意味着它最终可能成为OMG标准。目标是将状态机的语义形式化,以便每个人都能清楚地了解它们的执行规则。你(1):我在规范中找不到一个实际的约束来指定这一点。然而,这个构造在正交状态之外是没有意义的。有些工具可以让你画它,尽管,正如你所说,它应该是非法的,有些则不会。如果您有这些状态的转换,它们将对相同的触发器做出反应,那么将执行的触发器将是未定义的,并且根据UML规则,只能执行一个触发器。这种不确定的行为是不好的。