state diagram specification状态图/状态机(OMG)

14.2.3 Semantics

14.2.3.1 StateMachine

  behavior StateMachine包含一个或多个Region,每个Region是一个节点的集合,节点之间通过一些弧线连接,这些弧线代表transition。State machine的运行通过事件Event驱动。事件队列处理一个Event,触发状态图中对应的transition,然后整个图从一个状态到另一个状态,一个Region到一个Region。在状态迁移的过程中,状态图实例执行相关状态的Behavior(transition effects,state entry and state exit Behaviors,etc.)
  如果状态机存在一种BehavioredClassifier context,则该Classifier定义了该状态机的Signal Triggers和CallEvent triggers.Signal Triggers and CallEvent Triggers 通过Receptions and Operations of this Classifier来定义。主要用来定义状态机的message event Triggers
  如果状态机没有BehavioredClassifier,也就是说它的Triggers不和Classifier的Receptions,Operations耦合。它的好处是可以将状态图作为模板,而Triggers作为模板参数。这样状态图可以被不同的Classifiers(其中的CallEvent or SignalEvent Triggers)复用。
  由于事件驱动的特点,状态机的执行就是在transit和state之间切换,当一个事件触发后,进入transit。
Note.当处于state状态时,doActivity Behavior也会执行

14.2.3.2 Regions

Region(区域)指示了一个Behavior片段,它可能与它的正交区域并发执行.如果两个或多个区域被相同的状态或状态机(Region位于顶层的时候)所包含,那么它们彼此是正交的。当状态机执行进入Region所属的状态,那么Region变为Active(开始执行),或者当Region直接被状态机所拥有,而所属的状态机可以执行时,Region也变为Active。每个区域拥有一组顶点和转变,它们决定了区域中的behavioral flow。Region可能有自己的initial伪状态和FinalState。

  Region激活分为隐式和显式;

  1. 隐式(从Regsion中得initial Pseudostate开始执行)

(local or external)transition 连接到Region的父状态

  1. top level Region,一个状态机开始执行

  2. 显式
    transition连接到Region内部的状态或伪状态

显式激活导致并行Region的其他Region是隐式激活,该Region显式

隐式激活意味着源自该Region的initial伪状态的Transition开始执行.如果Region内没有inital伪状态,报错!
显式激活:当一个正交状态的一个Region被显式激活时,会导致它所有正交的Region被隐式激活。除非这些Region也是被显式进入(多个正交的区域可以通过来自相同的fork伪状态的Transition而显式地被并行进入)。

14.2.3.3 Vertices

  Vertex是个抽象的概念,代表状态图里的各种类型的node(State,Pseudostates,ConnectionPointReference).它是可以作为Transition的起点或终点的所有类型node的总称。定义的语义取决于它所代表的具体种类的节点。伪状态和连接点引用是过渡的(transitive),(a compound transition execution simply passes through them, arriving on an incoming Transition and leaving on an outgoing Transition without pause),状态和FinalState代表了稳定的顶点,当状态机执行进行到它们时,会停留直到触发一个能够使其进入一个不同状态的事件出现.不同类型的顶点语义在下面描述。

14.2.3.4 States

  
State是对一个执行过程中静态的场景建立的模型。

14.2.3.4.1 Kinds of States

如下种类的状态是被区分的:

  1. 简单状态(isSimple=true)

  2. 组合状态(isComposite=true)

  3. 子状态机状态(isSubmachineState=true)

简单状态没有内部的Vertex和Transition。组合状态至少包含一个Region,而一个子状态机状态引用了整个状态机,你可以理解为将一个状态机嵌入到该状态中。一个组合状态可以是一个简单的组合状态(只有一个Region)或是一个拥有多个Region的正交状态(isOrthogonal=true)。例如,图14.9中的“CourseAttemp”状态是一个只有一个区域的组合状态,而“Studying”是一个包含三个区域的组合状态。

被组合状态的一个区域包含的任意状态都称为该组合状态的子状态。
“直接子状态”: 没有被其它子状态包含的子状态,否则被称为“间接子状态”。

14.2.3.4.2 State configurations

  一个表示当前状态机实例在运行的过程中,所有处于active的state的集合。例如图14.9中所描绘的状态机执行的一个Active状态配置是:

一个执行的状态机实例每次只能正好处于一个状态配置,该状态配置称为它的活跃状态配置。在对与状态机的触发器匹配的事件出现的响应下,状态机执行被表现为从一个活跃状态配置到另一个活跃状态配置。一个State如果是configuration得一部分,那它就是active.
当满足如下条件是,一个状态配置被称为是稳定的:

  1. 在当前configration下没有Transition激活

  2. 配置中的所有entry行为都执行完毕(doActivity行为除外,它们可能能在执行)

在被创建和执行完它的initial Transition后,状态机总是处于某个状态配置。然而,因为状态可能是层级(hierarchical)状态并且伴随Transition和State执行,某些关联它们的Behavior(如:entry,exit,etc),因此,“进入”一个层级化的状态配置涉及一个动态的过程,该过程只会在达到一个稳定的状态配置后才停止。这为精确的指明状态机何时位于一个状态配置的某个特定状态制造了一些潜在的模糊性。状态机何时被认为“处于”一个状态和“离开”一个状态的规则分别在“进入一个状态”和“离开一个状态”部分进行描述。

14.2.3.4.3 State entry, exit, and doActivity Behaviors

状态可以关联一个entry(入口)行为。它会在状态通过一个external Transition被进入时执行。此外,状态还可以关联一个exit(离开)行为,如果定义了这个行为,它会在状态被离开时执行。
状态还可以关联一个doActivity行为。该Behavior在状态被进入(但要在状态的Entry Behavior执行结束后)时开始执行,并且与该状态关联的其它Behavior并发执行,直到:

  1. 它结束(此时产生一个完成事件)

  2. 状态被离开,此时,doActivity行为的执行被放弃

一个状态的doActivity行为的执行不受该状态的内部迁移发生的影响。

14.2.3.4.4 State history

状态历史(history)的概念是由David Harel在最初的状态图形式模型中引入的。它被用来保存一个Region在上次退出时的state configuration。Region可以恢复它上一次退出时的状态配置。例如:当该Region重新Active(从处理一个中断返回),或者有一个返回到它的历史的内部转变。(This is achieved simply by terminating a Transition on the desired type of history Pseudostate inside the Region)。该功能的好处是它消除了用户显式地跟踪历史的需要,这可以显著的简化状态机模型。
提供了两种历史伪状态:

  1. 深度历史(deepHistory)
    代表了对区域最近一次访问的完整状态配置。一个Transition如果连接到deepHistory的话,代表着一个Transition连接在所保存的state configuration的最深层的State上,包括执行沿途遇到的所有Entry Behavior

  2. 浅历史(shallowHistory)
    代表只返回到最近一次的状态配置的最顶层子状态,使用缺省入口规则进入

特殊情况
当一个Transition终结在一个历史伪状态上,并且该状态之前没有被进入过(即没有历史)或已经到达了它的FinalState,那么可以使用缺省历史机制来强制一个Transition终结在某个特定的子状态上。具体来说,就是画一个Transition,它源自历史伪状态,终结于包含该历史伪状态的Region的一个特定顶点(即缺省历史状态)。如果没有定义缺省历史Transition,那么该区域的标准缺省入口按照如下的解释执行:

  1. 延迟事件
    状态可以规定在本状态内被延迟的事件类型集合,只要该状态一直活跃,那么这些类型的事件出现就不会被派发,而是一直停留在事件池,直到下面的情况发生:

  2. 到达一个这些事件类型不再被延迟的state configuration

  3. 某个延迟的事件类型是一个Transition的触发器,并且该Transition的源是该延迟状态

事件可能被一个composite state或subStateMachine所延迟,此时,只要该组合状态仍处于active state configuration,那么该事件就一直被延迟。

14.2.3.4.5 Entering a State

  进入一个状态所代表的语义是不同的,它依赖所进入状态的类型(composite state/simple state/..)和它进入的方式。但是它们有一点是相同的,即当incoming Transition的effect Behavior完成后,Target State的entry Behavior才能执行。entry Behavior完成后,doActivity Behavior才能执行。然后如果Target State是composite的的话,它的substate的entry Behavior会和它的doActivity并行执行。
  上面描述了进入simple state的语义。对于composite state with a single Region的情况:

  1. Default entry:an incoming Transition连接到一个composite state的轮廓上(没有进入state内部)。如果composite state内部存在一个init Pseudostate,则在执行entry Behavior和fork一个线程来执行doActivity Behavior后,执行init Pseudostate的default Transition。如果没有init Psedostate,报错no init Pseudostate definded!

  2. Explicit entry:an incoming Transition连接到composite state的substate,代表substate处于active,composite state的entry Behavior执行后,直接执行substate的entry Behavior。该规则支持递归。

  3. Shallow history entry:an incoming Transition连接到一个composite state的浅历史伪状态上,那么活跃的子状态称为该次访问之前最近一次活跃的子状态,除非:

最近一次的活跃子状态是FinalState

  1. 这是该状态的第一次被访问

  2. 在上述两者情况下,如果从该浅历史伪状态定义了一个缺省历史转变,那么就使用 它。否则,应用缺省的状态进入

  3. Deep history entry:除了目标伪状态的类型是深历史并且需要递归地将规则应用到上次active state configuration的所有层次上外,它与浅历史的规则是相同的.

  4. Entry point entry:an incoming Transition连接到一个composite state的entry point,那么在执行完composite state的entry Behavior后,执行从entry point连线到其他state的Transition.

如果组合状态是一个具有多个区域的正交状态,它的每个区域都会被缺省或显式地进入。如
果转变终结在组合状态的边上(即没有进入该状态),那么所有的区域使用上面所说的缺省
进入规则来进入。如果转变显式地进入一个或多个区域,那么这些区域被显式进入,其它的
被缺省进入。
不管状态是如何被进入的,状态机已经认为处于这个状态,即使这个状态的任何entry Behavior 或effect Behavior(如果定义的话)还没开始执行

14.2.3.4.6 Exiting a State

当离开一个状态的时候,不管它是simple还是composite,离开所涉及的最后一步是执行该状态的exit Behavior,如果它的doActivity还没执行完的话,在exit Behavior执行之前,doActivity会被中断。

当从一个组合状态离开时,离开是从当前活跃状态配置的最深层状态开始的。如果离开是通 过一个exit Point伪状态开始的,那么当终结于exit Point的Transition的effect Behavior执行后,执行复合状态的exit Behavior;
当从一个正交状态离开时,它的所有区域都被离开。此后,该复合状态的exit Behavior被执行。
不管状态是如何被离开的,只有在该状态的exitBehavior(如果定义的话)执行完毕后,状态机才被认为是离开的这个状态。
被封装的组合状态
在一些建模场景中,对一个组合状态进行封装很有用,通过不允许转变直接穿过该状态到达
它的内部节点来实现.在封装中,通常需要将组合状态的内部元素绑定到incoming/outgoing Transitions,这通过entry Point和exit Point伪状态来实现。
entry point是incoming Transition的终点,以及composite state内部Transition的起点。该composite state的entry state在incoming Transition的effect Behavior和outgoing Transition的effect Behavior之间。
exit point和entry point相反,

14.2.3.4.7 Submachine States and submachines

子状态机是状态机规约可以被多次复用的一个手段。它与被封装的组合状态类似,也需要把
incoming/outgoing Transitions与其内部的顶点进行绑定。然而,被封装的组合状态和它的内部元素是定
义在所属的状态机内的,而子状态机就像编程语言中的宏,是不同的行为规约,可能定义在不是所使用的上下文中。因此,它需要更加复杂的绑定。这通过子状态机状态 (即,isSubmachineSate=true的状态)的概念来完成,它代表了对相应的状态机的引用。连接点引用的概念用于支持子状态机状态与所引用的状态机之间的绑定。连接点引用代表了子状态机状态上的一个点,转变可以在此incoming/outgoing。每个连接点引用与所引用的状态机的相应Entry/Exit Point 相匹配。这为子状态机调用和它的规约之间提供了一个必需的绑定机制。
子状态机状态暗示了把相应的状态机规约像宏一样插入.因此,语义上等同一个组合状态。被引用的状态机的区域是该组合状态的区域。入口、离开和effect行为以及内部的转变都包含 在此子状态机状态中。
注意
每个子状态机状态都代表了一个子状态机的不同的实例化,即使是两个或更多子状态机 状态引用相同的状态机。
被引用的状态机通过通过它的(initial) Pseudostate 或它的entry point来进入。通过初始伪状态进入与一般的组合状态相同。入口点与junction伪状态(在组合状态是正交时是fork)等价:通过入口点进入意味着组合状态的入口行为被执行,跟着的是从入口点到组合状态中目标顶点 的转变。为使规约是良构的,与入口点转变关联的guards必须为真。

类似的,被引用的状态机可以作为如下的结果而被离开:

  1. 到达了它的FinalState,

  2. 源自子状态机状态的Transition的触发,

  3. 通过它的任离开点。

14.2.3.5 ConnectionPointReference

上面指出,连接点引用代表了对被该子状态机状态所引用的状态机中定义的入口/离开点的使用。子状态机状态的连接点引用可以用作转变的源/目的。它们代表了进入或离开由该子状态机状态所引用的状态机。
entry point ConnectionPointReference 作为Transition的target代表通过相应的entry point伪状态进入被引用状态机的Region

14.2.3.6 FinalState

  FinalState是Psuedostate的一种,代表所在Region的完成。

  1. 代表one of orthogonal Regions完成了

  2. 代表top level Region完成,也就是整个状态机结束

14.2.3.7 Pseudostate and PseudostateKind

  1. initial:
    代表Region的起点,是Regsion隐式激活后执行的起点。

  2. 一个Region只能有一个initial

  3. 一个initial只能连接一个Transition

  4. Transition不能有guard和trigger,可以有effect Behavior

  5. deepHistory
    History代表一个变量,它代表了所属Region中最近active state configuration,终结在此类伪状态上的Transition意味着恢复Region到之前的相同state configuration,但是 进入状态的所有语义都要执行.在所复原的state configuration中 所有状态的Entry Behavior都要按顺序执行,最外层的先执行。深历史伪状态只能被定义在composite state上,并且一个Region中最多只能有一个这样的伪状态。

  6. shallowHistory
    该类伪状态是一种变量,它代表了所属Region最近的活跃子状态,而不是那个子状态的子状态。终结在这个伪状态上的Transition意味着将Region复原到那个子状态并执行所有进入一个状态的语义。可以从此伪状态定义一个outgoing的Transition使其终结在组合状态的一个子状态上。这个子状态就是该组合状态的缺省浅历史状态。浅历史伪状态只能定义在composite state上,并且每个Region最多只能有一个这样的伪状态。

  7. join
    将从多个orthogonal region合并来的Transition合并为一个Vertex.

  8. 连接到join的Transition没有guard和trigger

  9. 和junction类似,这里有一个同步的功能
    其中所有的到来Transition都必须完成才能继续执行一个outgoing的Transition

  10. fork
    将一条incoming的Transition划分为两条或更多终结到正交区域中顶点的Transition。从fork伪状 态outgoing的转变不能有guard或trigger。

  11. junction
    此类伪状态用于把多条转变连接到状态之间的复合路径上。举个例子,一个junction伪状态可以用于把多个到来的转变合并到一个单一的流出转变来代表一个共享 的通信路径。或者,它可以用于将一条到来的转变划分为具有不同guard约束的流出转 变。

注意. 这些guard约束的计算在包含该伪状态的复合转变执行之前执行,这也是为什么它 们被称为静态条件分支的原因。 对于特定的复合转变,可能出现转变路径的配置和guard值导致复合转变不能达到一个有效的状态配置。这种情况下,整个复合转变被禁止即使它的触发器是使能的(作为避免 出现此类情况的一种手段,可以在至多一条流出转变上附加一个指示为“else”的预定 义guard。如果其它转变的所有guards为假,那么这条转变变为使能)。如果有多余一个的guard为真,只选择一个,选择算法没有定义。

  1. choice
    此类伪状态与junction类似,不同在于它的所有流出转变上的guard约束是动态计算的,在复合转变到达这个伪状态时才计算.因此,choice用于实现动态的条件分 支。它允许把复合转变划分为多条可选的路径,对路径的选择决策依赖于到达该选择点之前相同复合转变上执行的行为的结果。如果多于一个guard计算为真,其中一个转变被选择,选择算法没有被定义。如果没有guards计算为真,那么模型被认为是错误的。为了避免错误,推荐为每一个choice伪状态定义一个带有“else”预定义guard的流出转变。

  2. entryPoint
    一个状态机或composite state的entryPoint提供了封装状态和状态机内部细节的机制.

  3. exitPoint
    一个状态机或composite state的exitPoint提供了封装状态和状态机内部细节的机制。终结在任意Region内的一个exitPoint的Transition意味着离开这个组合状态或子状态机状态(执行与之关联的exit行为).如果来自正交区域的多条转变终结在这个伪状态上, 那么它充当一个join伪状态

  4. terminate
    进入一个terminate伪状态意味着状态机的执行立即终止。状态机不需要离开任何状态也不需要执行任何exit行为。正在执行的所有doAcitivity行为都被终止。进入一 个terminate伪状态等同于调用一个DestroyObjectAction。

关键字:UML, 状态图, 状态, region


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部