根据OMG上文件 9.3.3.6转换011-C 的文件 UML状态机的精确语义中所示的状态机,它很好定义从子状态到包含状态的本地转换。
但是当T1T执行时,本地转换T1.3会做什么?我假设状态S1.2被保留,之后应用状态S1的默认条目,因此执行转换T1.1并最终进入状态S1.1。
然而,该章的运行到完成步骤表显示在执行转换1.3之后,生成完成事件CE,因此状态S1由转换T3保留:
这让我感到困惑,因为 UML规范2.5.1 在章节 14.2.3.8.3完成转换和完成事件中指出复合状态的完成事件像S1一样,只有当它的所有正交区域都达到最终状态时才会产生。在上面显示的状态机中肯定不是这种情况。
现在,哪种行为是正确的?可能是运行到完成步骤表是错误的吗?
答案 0 :(得分:2)
显示的子状态机使用所谓的本地转换(参见@ Roman评论中的链接)。 UML 2.5.1描述了p的本地转换。 314
kind = local 与外部相反,这意味着Transition不会退出其包含状态(因此,不会执行包含状态的退出行为)。但是,对于局部过渡,目标顶点必须与其源Vertex不同。 本地转换只能存在于复合状态中。
局部转换的例子可以在UML 2.5.1规范的第334页找到。
因此子状态机永远不会退出,因此表格和图表不匹配。可能是作者犯了一个错误并且意味着我在下面的原始答案中所说的内容。
原始回答: 我从来没有看过上面的符号,但是假设它应该描绘一个子状态退出(因此 T3 将是符合该表的下一个转换)。
我想这个符号应该使用这样的Final
如图1所示。第14.38页。 UML 2.5.1规范中的339个。
答案 1 :(得分:1)
我认为状态S1.2是剩下的,之后是默认条目 应用状态S1,因此最后执行转换T1.1 输入状态S1.1。
“T1.3”应该导致“S1.2”被留下,“S1”仍然有效。由于“T1.3”是局部过渡,因此不会留下“S1”并且不会重新出现。
“S1”的唯一区域未完成,因为未输入最终状态。因此没有完成过渡。
可能是运行完成步骤表错了吗?
是的,我认为这是错误的。
答案 2 :(得分:0)
尽管你的答案很受欢迎,但这个主题仍然让我感到困扰,因此我做了一些进一步的研究。在文档的第31页 UML状态机的精确语义我发现了这个:
完成区域激活
RegionActivations永远不会通过退出完成 隐式或明确地。有两种方法可以完成执行 一个地区。
- 一般规则是RegionActivation只能在a时完成 FinalStateActivation(见8.5.5)对于拥有的FinalState 区域被执行。这导致RegionActivation被标记为 正在完成(其isCompleted属性设置为true)。
- 仅在a的情况下违反上述一般规则 RegionActivation拥有的VertexActivation退出并且 TransitionActivation退出VertexActivation所具有的 以拥有RegionActivation的StateActivation为目标。在这 case,只有在这种情况下,拥有的RegionActivation才是 退出VertexActivation完成。
醇>
如果我正确理解了这一点,那么规则2就准确描述了状态机 9.3.3.6 Transition 011-C 的行为,在这种情况下,运行到完成表是实际上是正确的。