资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2019/2/2,#,上海理工大学,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2019/2/2,#,上海理工大学计算机与电气工程学院,2024/11/17,1,1,什么是状态图,?,状态图描述了一个对象或交互过程在它的生命周期中对,一系列外界激励,所呈现出的,不同状态,以及它相应的,响应和活动,状态机用,状态,和,瞬时过程的变化,图形来表示一个对象对外界激励下的响应,状态机一般附着在,一个对象,或,具体的方法,上,状态图描述了一个状态机,在我们考虑的范围内,它们是同一件事,UML,中关于状态图的定义和描述主要是采用,David Hare,提出的状态图方法并加上了面向对象的含义,2024/11/17,2,2,状态图的构成,状态图由一组表示,状态,和,迁移,组成。,一个简单的编辑器可以被看作为一个有限状态机,它具有状态,Empty,Waiting for a command,和,Waiting for text.,事件,Load file,Insert text,Insert character,Save and quit,引发状态机中的状态的迁移,2024/11/17,3,3,什么是状态?,状态表示的是一个对象或交互过程中的一个特定阶段:,满足了某一个条件,进行某项活动或等待某个事件的发生,,状态对应一段有限的时间。状态对应于一组对象属性的值,状态由一个带圆角的矩形表示,两个特殊状态:,初始状态:一个小实心黑圆,终止状态:一个套有小实心黑圆得圆,2024/11/17,4,4,什么是迁移?,一个迁移表示由事件、条件或事件触发后状态的改变,状态间的迁移用一根带箭头的直线来表示。,2024/11/17,5,5.,动作,可以在状态内使用动作表示其行为,动作是选取一段输入且产生一组输出并最终可改变系统的状态,动作的执行只需要一小段时间且执行不可中断,动作可发生在以下,3,个位置:,当一条迁移被选中时,当进入一个状态时(,entry,),当退出一个状态时(,exit,),2024/11/17,6,2024/11/17,7,6.,活动,一个状态可关联到一个活动,该活动的执行与驻留在这一状态上的对象的生命周期一样长,动作与活动的区别:动作的执行时间短且不可中断,而一个活动的执行需要一段时间且其执行是可以中断的,其中断的时机就是该状态的一个迁移被时,活动使用“,do,标识”,2024/11/17,8,2024/11/17,9,2024/11/17,10,2024/11/17,11,2024/11/17,12,7.,内部迁移,内部迁移指一个未离开该状态的迁移。,通过事件触发内部迁移,并可出现与这些事件相关联的动作,2024/11/17,13,8.,嵌套状态图,嵌套简化了复杂性,可用于取代内部迁移,2024/11/17,14,2024/11/17,15,打电话的状态图,2024/11/17,16,9.,建模技巧,/1,状态机最经常被用以对一个对象的生命周期中的行为进行建模,特别是在对象具有依赖于状态的行为的时候,可以具有状态机的包括,类,,,子系统,,,用例,和,接口,(,确定实现接口的对象必须满足的状态,),2024/11/17,17,9.,建模技巧,/2,在实时系统中,状态机可以用于进程(,capsules,)和协议,(,确定实现协议的对象需要满足的状态,),并不是所有的对象都需要状态机,.,如果对象的行为是简单的,比如说它只是简单的存储和获取数据,对象的行为是状态不变的(,state-invariant,),那么其状态机就没有多少意义,对对象的生命周期的建模涉及到三件事情,:,描述对象需要响应的事件,对这些事件的响应,过去对当前行为的影响,对对象的生命周期的建模也涉及到决定对象响应事件的次序,这种响应始于对象的创建时刻,继续直到其销毁,2024/11/17,18,9,.,建模技巧,/3,为了对对象的生命周期进行建模,:,确定状态机的,背景,,是类,用例,还是整个系统,如果背景是类或者是一个用例,收集邻近的类,包括父类或者通过关联或依赖关系能够到达的类,这些邻居是动作的可能的目标,或者是保安条件中包含的内容,如果背景是整个系统,将焦点放在系统的,某一个行为,上,然后考虑对象在该方面的生命周期。整个系统的生命周期太大了。,建立对象的初始和最终状态,如果对于初始和最终状态有前置条件或后置条件,也要定义它们,2024/11/17,19,确定对象能够响应的事件,它们可以从对象的接口中找到,在实时系统中,它们可以从对象的协议中找到,从初始状态到最终状态,画出对象的最高层的状态,将这些状态用转移连接起来,这些连接由特定的事件触发,确定进入和退出动作,通过使用子状态能够扩展和简化状态机,2024/11/17,20,9.,建模技巧,/4,检查,是否状态机中所有的,事件触发转换,与,由对象实现的接口所期望的事件,匹配,所有的,对象接口期望的事件,都包含在状态机中,在实时系统中,对进程的协议进行同样的检查。,确定那些明确希望忽略事件的地方(例如延迟事件),2024/11/17,21,是否状态机中的,所有的动作,得到了包含的对象的关系、方法和操作支持,在状态图中进行跟踪检查,将它与期待的事件和响应的顺序进行比较,搜索那些到达不了的状态和,“,死锁,”,状态,在调整状态机图时,确保语义不变,2024/11/17,22,9.,建模技巧,/5,在有选择的情形下,尽量使用状态机的,可视化语义,而不是写详细的转移说明。例如,不要在一个转移上列出多个信号,然后用文字说明依据不同的信号来管理不同的控制流;代之以,单独的转移,,由单独的信号触发。,2024/11/17,23,9.,建模技巧,/6,状态命名,根据在一个状态中,等待或发生的情况,来确定。记住,状态不是一个,“,时间点,”,,它是状态机等待什么事发生的一段时间。例如,waitingForEnd,就比,end,好,;,timingSomeActivity,就比,timeout,好,.,不要把状态命名成动作,2024/11/17,24,9.,建模技巧,/7,一致性命名。给状态机中的每一个状态和转换一个唯一的名字;这将使源代码级的调试更容易,小心使用状态变量,(,控制行为的属性,),2024/11/17,25,9.,建模技巧,/8,如果一个图上,5 2,状态,考虑使用子状态。一般而言,在通常的情况下十个状态可能没有问题,但是两个状态之间却有四十个转换肯定需要重新考虑。我们需要保证状态图是容易理解的,根据触发事件和,/,或在转换上发生的情况来命名,转换,。在选择名字时,也需要从可理解性的角度出发,2024/11/17,26,9.,建模技巧,/9,当你看到一个选择点,你需要问一下是否能够将,选择条件的责任,分配给另外一个组件。在这种情况下,发送者或者其它活动者进行决策,并将带有决策信息的信号发送给另外一个对象,该信号的名字要带有决策信息,例如信号的名字为,isFull,和,isEmpty,,而不应该是,value,和,checking message data),2024/11/17,27,9.,建模技巧,/10,选择点,的命名:在选择点处的回答问题的命名要采用描述性的方法例如,,isThereStillLife,或者,isItTimeToComplain,选择点名字是唯一的:对任何对象,尽力保证选择点的名字是唯一的,(,同样,保持转换的名字是唯一的,),转换的表达不能过长:如果过长,需要考虑用函数,或者将公共的代码片断用函数表示,转换必须读起来象高层的伪代码,例如,如果转换上的代码长于,25,行,可能就太长了,2024/11/17,28,9.,建模技巧,/11,动作,根据它们的任务命名,注意,entry,和,exit,动作,很容易发生修改后,忘了修改它们,退出动作可以提供安全特性,例如从,heaterOn,到,heater off,状态之间的退出动作,该动作就用以确保状态转换,2024/11/17,29,9.,建模技巧,/12,子状态必须包含两个或以上状态,除非状态机是抽象的并将被包含的元素的子类所修饰,选择点必须被用于在,动作或转换的条件逻辑,的场合。选择点容易被看到,而在代码中表达的条件逻辑是隐藏的,容易被忽略,2024/11/17,30,9.,建模技巧,/13,避免下列保安条件:,如果一个事件能触发多个转换,没有一个控制确定对哪一个保安条件首先进行判断,这样的情况下,结果是不可预测的,多个保安条件都可能是真的,但是只有一个转换可以遵循,路径的选择可能是无法预测的,保安条件不是可视化的,很难看到它们的存在,2024/11/17,31,9.,建模技巧,/14,不要使状态机象流程图,这种状态可能意味着你对一个可能实际上不存在的抽象情形进行了建模,:,使用了一个主动类对最好采用被动(或数据)类的行为进行建模,采用紧密耦合的数据类和主动类对一个数据类进行建模,(,例如,数据类被用于传递类型信息,但是主动类包含了绝大部分的数据,这些数据本来应该是与数据类相联系的,).,2024/11/17,32,这种对状态机错误的应用可以通过以下症状来判断,:,消息发送给自己只是为了重用代码,非常少的状态,很多的选择点,在状态机中没有一个循环,这种状态机在过程控制应用或者控制事件序列是有效的;在分析阶段中,它们的出现代表了状态机被弱化成流程图,当问题找到后,:,使主动类变小从而将职责分得更清楚,将更多的行为移到与问题主动类相关的数据类中,将更多的行为移到主动类功能中,构造更富有意义的信号而不是依赖于数据,2024/11/17,33,小组作业,航班从,Tentative(,暂定,),开始。有人制定时刻表,确定是否包含这个航班。,如果计划批准,则航班转入,Scheduled,状态。航班时刻表发布到,Internet,上,离起飞时间小于,60,天,该航班开始开始售票,进入,Open,状态,可以从航班中 增加和删除旅客,但售出最后一张票,航班就满了。如果有人退票,则再次开始售票,飞机起飞,10,分钟前,航班停止售票,如果飞机还没有到达,则航班延迟。,若延迟超过,4,小时,则航班取消。若乘客不足,50,人,则也把航班取消。,如果航班取消,则航空公司要为乘客寻找另一航班。,如果飞机到达,则其起飞和着陆,完成这个航班,航班从,Tentative(,暂定,),开始。有人制定时刻表,确定是否包含这个航班。,如果计划批准,则航班转入,Scheduled,状态。航班时刻表发布到,Internet,上,离起飞时间小于,60,天,该航班开始开始售票,进入,Open,状态,可以从航班中 增加和删除旅客,但售出最后一张票,航班就满了。如果有人退票,则再次开始售票,飞机起飞,10,分钟点,航班停止售票,如果飞机还没有到达,则航班延迟。,若延迟超过,4,小时,则航班取消。若乘客不足,50,人,则也把航班取消。,如果航班取消,则航空公司要为乘客寻找另一航班。,如果飞机到达,则其起飞和着陆,完成这个航班,状态,迁移,状态:进入动作,状态:活动,迁移:保证条件,
展开阅读全文