UML状态机:冲突后选择

时间:2015-06-17 10:15:28

标签: uml state-machine

如果转换选择算法(TSA)发现两个应同时触发并且后续成立的转换,则在UML状态机中会发生什么:

  • 转换#1直接以状态结束
  • 转换#2在选择伪状态
  • 中结束(中间)

由于两个转换都会发生冲突,因此它们不会发生冲突。否则,TSA首先不会选择它们。

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

显示此类情况的UML图

(根据Thomas Kilian对他(现已删除)答案的评论进行了改进)

...如果Event_1发生且x< 0

Example UML diagram

问题

  • 状态机是不正确的还是现在应该发生什么?
  • 选择退出州后转换是否违法?至少它与“转换执行序列”(退出,转换行为,输入(s))不能很好地协同工作。因为它将是退出,行为,退出,行为,在这种情况下输入。我在UML超结构规范(第15章)中找不到任何相关内容。但是,关于正交区域的一切都在该文件中非常模糊地描述......

动机

我从图书馆实施者的角度提问。所以我的重点不是如何以更好的方式设计这种情况。我需要弄清楚如何正确处理这种情况(或者我需要知道这是非法的情况)。

1 个答案:

答案 0 :(得分:1)

这就是为什么在OMG上有“UML状态机的精确语义”的一个原因......

首先,大多数过渡退出一个州都是合法的。 UML规范中有一些限制,但没有一个与您的设计有关。

您应始终拥有在任何状态机区域内可能处于活动状态的单个状态。就目前而言,“StateMachine1”中有一个包含“X”和“Y”状态的隐式区域。这意味着您的状态机可能同时处于“StateMachine1 :: X”和“StateMachine1 :: Y”状态!正如你已经知道的那样,正交状态就是处理这种情况。也许你需要在状态StateMachine1 :: S'区域内带上“X”和“Y”?

同样是一个警告,默认情况下,UML中的状态具有浅层历史记录。这意味着,就目前而言,StateMachine1 :: S'区域内的初始过渡只会被采用一次。如果你试图回到“S”(我知道,你没有那个过渡 - 只是推测),它将返回到最后一个状态(每个区域一个),如果离开状态,之后, event1,将是“A”和“E”。

如果不知道你想要建模什么,就很难评论,但我希望这会有所帮助。