2019独角兽企业重金招聘Python工程师标准>>>
一、状态图引言与基本概念
1. 引入
² 对事物所处的状态及其变迁的考虑
² 大多数事物在其生命周期中经历了不同的阶段;
² 事物在其生存阶段,按次序递进;
² 在现实世界中,存在着引起事物状态间的递进(或者表明它已经递进)的事变;
² 对象在一段有限的时间内,位于某个状态中;
² 事物从一个阶段到另一个阶段的递进是即时的;
² 当事变/事件发生时,事物可能需要采取一些动作。
事物的一般生命周期形式
事物的一般生命周期形式
-
Sally Shlaer & Stephen Mellor(1988)
周期性生命周期
如:飞机、微波炉
-
出生-死亡生命周期
人,糖
状态机与对象——对象与线程
•被动对象: 依赖外力 (线程的执行)(下图左)
•主动对象: 自动 (自身的线程的执行)(下图右)
基本状态图
2.1基本概念
状态
《对象技术词典》1995:对象状态(object state)
对象或者类的所有属性的当前值。
对象的每一个属性值的任何一点的变化都被理解为对象处于不同的状态。对象的状态数量将是巨大的,甚至是无穷的。在系统开发 中认识和辨别对象这么多状态既无可能亦无必要。
Webster的New World Dictionary(新世界字典):
在给定时间、方法和行为的情况下,与某人或某件事相关的一组环境变量或属性集。
尽管对象的状态可以表现为其属性值的变化,并不是对象的每个属性都是决定对象状态的属性,并且对象的一个属性的各种可能的取
值并不一定都成为该对象的状态。
《UML参考手册》
状态是一个对象的生命期的一个阶段,在该阶段中,该对象满足一些特定的条件、从事特定的活动或等待某个(些)事件。
识别一个对象具有多少状态不能机械地根据其属性和属性值,而取决于完整描述对象行为的需要。
《对象技术词典》:
对象或者类的整体行为(例如响应消息)的某些规则所能适应的(对象或类的)状况、情况、条件、形式或生存周期阶段。
认识和区别对象的状态将着眼于它对对象行为规则的不同影响
仅当对象的行为规则有所不同时,才称对象处于不同状态
事件(触发器)
事件 = 对可观察的发生事情的类型,包括:
-
-
-
交互:
-
-
同步的对象操作调用 (调用事件)
异步的信号接收(信号事件)
-
-
-
即时时刻的发生 (时间事件)
-
-
时间间隔
日历/时钟时间
-
-
-
某些实体的数值上的变化 (变化事件)
尽管不同类型的事件的实现方式都不相同,但在状态机图上却具有相同的表示,体现了状态机图很强的概括和抽象机制。
-
-
事件实例 = 事件 (类型)的一个实例
在特定的即时时刻发生,没有持续时间.
《UML参考手册》:事件是系统执行中发生的值得注意的事情,可以触发状态的转换。同时强调事件是一种发生事情的类型,其实例——即事件的发生——称为触发器。
因此在UML2.0中,事件并不显式的出现在模型中,但是事件这个术语实际上还继续保留着,并且还定义了好几种具体的事件,对于在实践中识别事件具有启发意义。
动作(活动)
转换
二、状态的表示、内部转换、延迟事件、伪状态与最终状态
状态的表示
内部转换
除了预定义的三个标号外,在所有的其它情况中,动作标号标识触发相应动作表达式的事件。这些事件触发内部转换,在语义上它们等价于自转换,只是不退出状态和再进入状态,不会导致状态的改变。
事件名(用逗号分隔的参数表)[监护条件]/ 动作表达式
延迟事件
延迟事件是指在当前状态下暂不处理,但将推迟到该对象的另一个状态下排队处理的事件。也就是说,在某些建模情况下,可能想要识别某些事件,但延迟对它们的响应,直到以后才执行。
伪状态
初始状态和终止状态都是伪状态。
伪状态(pseudo state) 正如其字面意义所表明的,伪状态实际上并不是一种状态,只是为了加强状态机图的可视化表示而引入的一些图形符号,都是结点(顶点)型的图形成分。
《UML参考手册》中认为这些伪状态与一般状态的区别是没有内部转换分栏,不会在该伪状态上停留一定的时间,也不能处理事件,所以不是一般意义上的状态,但在表示法上与一般的状态很相似,故称之为伪状态。
UML中的伪状态
最终状态不是伪状态
UML还定义了另外一个与终止很相似的概念——最终状态(final state),用一个被圆圈套起来的实心圆点表示。
最终状态表明复合状态中的一个区域的活动已经完成,如果复合状态有多个区域,那么所有这些区域必须都执行完毕。
最终状态不是伪状态的原因是,最终状态可以在一段时间内保持在该状态下(需要等待其他正交区域的完成),不像伪状态那样进入后直接转换到其后续状态,所以它不是伪状态。
但它也不是一般的状态,因为不允许有从它出发的事件触发转换。
三、状态图中的动作。活动与转换
动作
动作是在状态内或在转化时所做的操作,是原子的和即时的,就是说,它在相关状态的抽象层次上是不可间断的。
一个动作可能:
设置或修改本对象的一个属性
产生发送给分析范围之外的事件(例如,操作员、硬件设备或在另一个系统/子系统中的对象)
执行对象的一个操作
向一个对象发送信号
调用另一个对象(包括自身)的一个公共操作(调用拥有状态机的对象或其他可见的对象)
以及创建或撤消另一个对象(包括自身)
返回一个值或值集
……
动作发生的时机:
在转化中、在状态的入口、在一个对象处于一个状态的整个期间、在状态的出口、在引起状态转化的事件到来时,或在没有引起状态转化的事件到来时。
三种保留的动作标号
entry/进入动作
这个标号标识由相应的动作表达式规定的动作,在进入状态时执行该动作。不能有参数或监护条件。
exit/退出动作
这个标号标识由相应的动作表达式规定的动作,在退出状态时执行该动作。不能有参数或监护条件。
do/活动
这个标号标识正在进行的活动(“do 活动”),只要被建模的对象是在当前状态中,或没有完成由动作表达式指定的计算,就执行这个活动(后者的完成可能导致一个完成事件)
活动是在对象处于一个状态中的整个阶段执行的一个动作或动作的集合。活动不是原子的,在执行中可以被事件打断。
引发并行执行的线程直到:
动作完成
通过一个向外的转换离开了该状态
如do/op1(a);op2(b);op3(c)
状态转换
转换是两个状态之间的一种关系,表示当一个特定事件出现时,如果满足一定的条件,对象就从第一个状态(源状态)进入第二个状态(目标状态),并执行一定的动作。转换本身也是原子的。
举例
四、结合点与选择点
守卫条件
转换的条件执行
交汇点( junction)——静态条件分支
用于将多种转换连接在一起,用于构造状态之间复杂的转换路径。
选择(Choice)——动态条件分支
守卫条件在到达决策点的瞬时被求值
选择和接合比较
-
尽管选择和接合作用相似,但也有些细微的区别。
当一条转换路径中包含选择伪状态结点时,在进入选择结点前会激发响应动作会进行计算,在退出选择结点后根据守卫条件确定转换到的具体的状态,但建模者必须确保在任何情况下进入选择结点后必须有一条退出该选择结点的路径。
而接合结点就不存在这样的风险,因为所有的条件在转换激发前都被事先计算。
状态图
-
一个状态图 描述一个对象在其生命期内响应事件所经历的状态序列,以及对这些事件所做出的反应。
通常用状态图描述类的行为,也可以用它描述其它模型实体(如用况、参与者、子系统、操作或方法)的行为。
在大多数情况下,仅对这样的对象的建立状态图:它具有清晰的生命期,对其语境外部的事件能作出反应,且它的当前行为受它的过去行为的影响。
用适当的状态和伪状态符号表示状态机图中的状态和各种其它类型的
顶点,而一般用连接顶点的有向弧表示转换。
状态图的组成
五、复杂的状态图、历史状态
组合状态
-
组合状态是含有子状态的状态,是由两个或多个子状态构成的状态。
状态的嵌套结构包括不相交(或,顺序活动)或并发(与,并发活动)子状态。任何组合状态的子状态也可以是这两种类型的组合状态。
新创建的对象,从最外层的初始伪状态开始,执行其最外层的缺省转换。若对象转换到了最外层的终结状态,则对象的生命期终止。
一个状态内的各区域可以有初始伪状态和终止状态。到封闭状态的转换表示到其初始伪状态的转换。到最终状态的转换表示封闭区域中的活动的完成。在所有并发区域中的活动的完成,表示经由封闭状态的活动的完成,并触发封闭状态上的完成事件。
完成转换
-
由完成事件激发
当组合状态机终止时自动产生
激发规则
-
两个或更多的转换可以具有相同的事件激发
最内面的转换优先
不管事件激发转换与否,都将被丢弃
动作的次序:复杂的例子
历史状态
-
返回到以前访问的等级状态
浅历史状态:保存并重新激货活与历史状态处于同一个嵌套层次上的状态.
深历史状态:保存复合状态中更深的嵌套层次的状态.
并发状态
对相同实体的多种同时的视角
正交区:多种并发描述的合成
转换的分支与结合点
用来表示进入或离开正交区
建立状态图的策略(UML 用户指南 第二版)
-
设置状态机的语境
找出相临的类(关联与依赖)
-
建立初始状态和终止状态。
决定这个对象可能响应的事件。
对象的接口(属性与操作)
可能的交互对象与事件
-
从初态开始到终态,列出这个对象可能处于的顶层状态.用适当的事件触发的转换将其连接起来.并在转换中添加动作.对于内部转换也是如此。
识别各状态的进入或退出的动作
如果需要,从这个对象的高层状态开始,然后考虑各自的可能子状态,用子状态进行扩充
检查状态图中的事件与对象接口中的事件相匹配
检查动作是否由对象的关系\方法和操作所支持
跟踪状态图,看是否达到期望的动作顺序
检查状态图
-
检查在状态机中提到的所有事件是否和该对象接口所期望的事件相匹配。类似地,检查该对象的接口所期望的所有事件,是否都被状态机所处理。最后,找出明显地想忽略的事件的地方。
检查在状态机中提到的所有动作是否被闭合对象的关系和操作所支持。
通过状态机,跟踪检查事件的顺序和它们的响应,尤其要努力地寻找那些未达到的状态和导致状态机停止的状态。
在重新安排状态机后,按所期望的顺序再一次检查,以确保你没有改变该对象的语义。