在UML 2.5.1中,状态机的 initial 伪状态定义如下:
初始伪状态表示区域的起点;那 是,从这一点开始执行其包含的行为 通过默认激活输入地区时开始。它是 最多一个过渡的来源,这可能有关联的影响 行为,但没有关联的触发器或防护。可以在 区域中最多一个初始顶点。
换句话说,UML状态机几乎应始终只包含一个初始伪状态,而初始伪状态应具有仅一个传出转换。
但是,初始伪状态也可以具有传入转换吗?例如:
在UML规范中我找不到任何禁止它的东西,但是在这种情况下我找不到在线示例,因此我想知道我是否忽略了任何东西。
EDIT:要更详细地讲,如果我们仔细研究规范中规定的OCL约束,我们只会发现以下影响传出转换的约束(第14.5.6.7节):>
inv: (kind = PseudostateKind::initial) implies (outgoing->size() <= 1)
但是我找不到关于传入过渡的任何约束
EDIT2:我刚刚意识到我的模型是错误的!考虑到规范的这一句话(以上引用):“它最多是一个Transition的来源,它可能具有行为相关的行为,但没有相关的触发器或保护。”
因此, init 和 s1 之间的过渡实际上应该有零个触发器,而不是用 e1 作为触发器。
请注意,尽管这不会使最初的问题无效。
答案 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)
我认为文字非常清楚:“ [初始伪状态是通过默认激活输入区域时开始执行其包含的行为的点”。如果您将过渡重新连接到初始伪状态,则初始伪状态不再是“从其包含的行为开始执行的点”,而是其他事物,因此未定义。