【问题标题】:UML state machine: Conflict AFTER choiceUML 状态机:选择后的冲突
【发布时间】:2015-09-02 12:20:16
【问题描述】:

如果转换选择算法 (TSA) 发现两个转换都应该触发并且以下情况成立,那么 UML 状态机会发生什么:

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

由于两个转换都会触发,因此它们不会发生冲突。否则他们一开始就不会被 TSA 选中。

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

UML 图显示了这种情况

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

...如果 Event_1 发生并且 x

问题

  • 状态机是否不正确或现在应该发生什么?
  • 选择退出状态后的转换是否违法?至少它不能很好地与“转换执行序列”(退出、转换行为、进入)配合使用。在这种情况下,它将是退出,行为,退出,行为,进入。我在 UML 上层结构规范(第 15 章)中找不到任何相关内容。但是,关于正交区域的所有内容都在该文档中进行了非常模糊的描述......

动机

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

【问题讨论】:

    标签: uml state-machine


    【解决方案1】:

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

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

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

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

    如果不知道您要建模的内容,很难发表更多评论,但我希望这会有所帮助。

    【讨论】:

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