在UML状态机中,初始伪状态是否可以具有传入的转换?

时间:2018-10-04 12:34:11

标签: uml

在UML 2.5.1中,状态机的 initial 伪状态定义如下:

  

初始伪状态表示区域的起点;那   是,从这一点开始执行其包含的行为   通过默认激活输入地区时开始。它是   最多一个过渡的来源,这可能有关联的影响   行为,但没有关联的触发器或防护。可以在   区域中最多一个初始顶点。

换句话说,UML状态机几乎应始终只包含一个初始伪状态,而初始伪状态应具有仅一个传出转换。

但是,初始伪状态也可以具有传入转换吗?例如:

enter image description here

在UML规范中我找不到任何禁止它的东西,但是在这种情况下我找不到在线示例,因此我想知道我是否忽略了任何东西。


EDIT:要更详细地讲,如果我们仔细研究规范中规定的OCL约束,我们只会发现以下影响传出转换的约束(第14.5.6.7节):

inv: (kind = PseudostateKind::initial) implies (outgoing->size() <= 1)

但是我找不到关于传入过渡的任何约束


EDIT2:我刚刚意识到我的模型是错误的!考虑到规范的这一句话(以上引用):“它最多是一个Transition的来源,它可能具有行为相关的行为,但没有相关的触发器或保护。”

因此, init s1 之间的过渡实际上应该有零个触发器,而不是用 e1 作为触发器。

请注意,尽管这不会使最初的问题无效。

4 个答案:

答案 0 :(得分:1)

UML 2.5.1 Specification中,我什么都没看到,禁止以目标为初始伪状态的过渡。

这样的过渡充其量是没有意义的,最坏的情况是令人困惑的,这很可能就是为什么找不到示例的原因。

答案 1 :(得分:1)

编辑:查看评论!

在第423 UML 2.5:

  

15.7.18 InitialNode [类]

     

15.7.18.4约束

     

•no_incoming_edges

     

InitialNode没有传入的ActivityEdges。

  inv: incoming->isEmpty()

如果您打算对e1进行自我转换,那为什么不仅仅使用它呢?无论如何,Initial只能在单个输出边缘上,即到第一个状态(此处为s1)。

答案 2 :(得分:0)

否,这是不允许的。为什么要这样做?正如您在引用的文本中已经指出的那样,它只有一个向外的边缘,没有任何保护。那么,增加的价值是什么,因为您无法重用任何东西。

答案 3 :(得分:0)

我认为文字非常清楚:“ [初始伪状态是通过默认激活输入区域时开始执行其包含的行为的点”。如果您将过渡重新连接到初始伪状态,则初始伪状态不再是“从其包含的行为开始执行的点”,而是其他事物,因此未定义。