Transitions

一条转变是源自一个单一顶点、终结于一个单一目标顶点(源和目的可能是相同的顶点)的一条有向弧,它规定了状态机行为的一个有效片段。它可能有相关联的effect行为,它在转变被遍历时执行。

注意. 转变遍历的持续时间是未定义的,允许不同的语义解释,包括“零”和非“零”时间。

转变作为更加复杂的复合转变的一部分来执行,驱动状态机从一个稳定的状态配置执行到另一个。复合转变的语义描述如下。

在执行过程中,一条转变实例被称为:

  • 到达——当状态机执行到转变的源顶点(即转变的源状态处于活跃状态配置中);
  • 已遍历——正在被执行(连同所有相关的effect行为);
  • 结束——到达它的目标顶点。

转变可以拥有一组触发器,每一个规定了一个事件,当它的出现被派发时,触发转变的遍历。如果被派发的事件出现与转变的触发器规定的事件类型匹配,那么该触发器被称为使能的。当为一个转变定义了多个触发器时,它们逻辑上是分类的,也就是说,任一使能都会触发该转变。

相对于源的转变种类

转变的语义依赖于它与它的源顶点的关系。根据转变的kind属性值,定义了三种可能:

  • kind=external意味着该转变离开了它的源顶点。如果该顶点是一个状态,那么执行该转变将导致与状态相关的eixt行为被执行。
  • kind=local与external相反,它意味着转变没有离开它所属的状态(并且因此所属状态的exit行为不执行)。然而,对于local转变,目标顶点必须与源顶点不同。local转变职能出现在组合状态中。
  • kind=internallocal转变的一种特例,它是一个自转变(即源和目标状态相同),从而该状态从来没有被离开(并且因此也没有被再次进入),这意味着此转变执行时没有exit或entry行为被执行。这种转变只能定义在源顶点是一个状态的时候。
高层(组)转变

源顶点是一个组合状态的转变被称为高层或组转变。如果它们是external的,组转变会导致组合状态所有的子状态的离开,从活跃状态配置的最深层状态的exit行为开始。如果是local转变,源状态的exit行为和目标状态的entry__行为会执行,但不是所属状态的。

Completion Transitions and completion events

一种转变特例是完成(completion)转变,它有一个隐含的触发器。能够触发该触发器的事件被称为完成事件(completion event),它指示所有与源状态关联的行为都以执行完毕。对于简单状态,当它的entrydoActivity行为执行完毕后产生一个完成事件【译者注:为什么不是在exit行为后呢?】。如果没有定义这些行为,完成事件在状态进入时产生。对于组合或子状态机状态,完成事件在如下场景下生成:

  • 所有内部活动(例如entrydoActivity行为)都已经执行结束,并且
  • 如果状态是一个组合状态,它的所有正交区域都已经到达一个FinalState,或者
  • 如果状态是一个子状态机状态,被引用的状态机执行到了一个FinalState。

完成事件有派发优先级。也就是说,它们比事件池中待定的事件出现优先派发。如果对应于多个正交区域的两个或更多的完成事件同时出现(例如,作为相同事件出现的结果),那么对于它们出现的处理顺序没有定义。状态机中所有顶层区域的完成对应于该状态机行为的完成并导致它的结束。

Transition guards

转变可能有guard约束。如果guard计算为假,那么该转变被禁止。Guards在包含它们的复合转变使能之前在被计算,除非它们位于源自choice伪状态的转变上(此时,当到达选择点式,guards才计算)。没有guard的转变认为它的guard总为真。

注意. 完成转变可能也有一个guard

Guard约束可能涉及当前状态机的正交状态的检测,或者显式地指明一些可到达对象的状态(例如,“in State1”或者“not in State2”)。状态名称可能是完全限定的,例如“RegionA::State1::Region1::State2::State3”。这可以在不同组合状态区域内出现相同的状态名称时使用。

复合转变

按照之前提到的,当一个事件出现触发一个使能转变或者状态机的执行被创建时,这可能启动一组互联和内嵌转变和顶点的遍历,直到达到一个稳定的装配配置。通常情况下,这个遍历的一个轨迹,称为复合转变,可以被表示为一个有向无环图。该图的根可以是如下之一:

  • 定义了一个或多个触发器的转变。
  • 一个完成转变。
  • 源自不同正交区域合并到一个公共的join伪状态的一组转变(可能包括完成转变)。
  • 源自最顶层区域(即由状态机所拥有的一个区域)的一个初始伪状态的转变;这个变体只应用于状态机实例被创建的情况下。

当一个执行中的转变在一个具有多个正交区域的状态上执行缺省进入时,或者遇到一个fork伪状态时,复合转变为每一个区域创建一条分支。由一个复合转变的执行所造成的总体行为是一个与所遍历的元素相关联的行为执行的部分有序集合,取决于所遇到元素(顶点和转变)的顺序。举个例子,如果一个转变进入一个复合状态终结在其中的一个子状态上,那么该转变的effect行为会在该复合状态的entry行为之前执行,之后是子状态的entry行为。如果遍历中遇到了fork伪状态,那么每条流出分支上的effect行为并发执行(至少概念上是)。

如果到达一个具有多个流出转变(带有guards)的choicejoinguard为真的转变会执行。如果多于一个guard计算为真,选择其中之一继续遍历。选择算法未定义。对于源自choice伪状态的状态,如果到达该伪状态时没有guards计算为真,那么模型是错误的。

Transition ownership

转变的宿主没有显式地被约束,尽管包含它的区域必须直接或间接地被所属的状态机所拥有。建议转变的宿主是包含它的源和目标顶点的最内层区域。

results matching ""

    No results matching ""