顺序图和协作图

lhwyflyl01

贡献于2014-06-23

字数:8798 关键词: UML建模

第4章 顺序图和协作图 4.1 交互图概述 在一个待开发的系统中,任何对象都不是孤立存在的,系统中的这些对象都是通过传递消息进行交互的。因此在设计系统时,就免不了对交互进行缄默,并用交互图展现出来。 4.1.1 交互的定义 当需要对类操作、类、构件、用例乃至整个系统的控制流进行建模时,一定离不开“交互”。 交互:一次交互就是指在特定语境中,为了实现某一个目标,而在一组对象之间进行交换的一组消息所表示的行为。 交互图:是用来描述对象之间以及对象与参与者之间的动态协作关系以及协作过程中行为次序的图形文档。通常用来描述一个用例的行为,显示该用例中所涉及的对性和这些对象之间的消息传递情况 在大多数情况下,消息通常是指启动一个操作或发送一个信号,以及创建或销毁一个对象。 4.1.2 UML交互图的类型 顺序图:是一种强调消息时间顺序的交互图,着重描述对象按照时间顺序的消息交换,为读者提供了控制流随着时间推移的清晰的可视化轨迹。 协作图(UML 2.0中的通信图):强调的是参加交互的对象的组织,着重描述系统成分如何协同工作,为读者提供了在协作对象结构组织的语境中观察控制流的一个清晰的可视化轨迹 。 顺序图和协作图从不同的角度表达了系统中的交互和系统的行为,它们可以相互转化,并且转换过程不会丢失信息。 定时图(UML 2.0中新增):采用了一种带数字刻度的时间轴来精确地描述消息的顺序,而不是像顺序图那样只是指定消息的相对顺序,而且它还允许可视化的表示每条生命线的状态变化,当需要对实时时间进行定义时,采用定时图可以很好的满足。 交互概述图(UML 2.0中新增):是交互图和活动图的混合物。 定时图和交互概述图是两种特殊的变体。 4.1.3交互图和类(图) 4.2 顺序图 顺序图:显示的是参与交互的对象及对象之间消息交换的顺序,用来表示用例中的行为顺序。 图显示的是汽车租赁系统中客户取车的顺序图,涉及5个对象:客户、预定请求、工作人员、工作记录和汽车。取车的动作从客户向工作人员提出取车要求并出示清单开始,工作人员检查客户的预订请求,确认后客户可以付款。然后工作人员填写工作记录,同时登记汽车状态,最后客户取车。可以看出在UML中,顺序图将交互关系表示为二维图。其中,纵轴是时间轴,时间沿竖线向下延伸,按时间递增顺序列出各个对象所发出和接收的消息。水平方向是对象维,水平方向排列的是参与交互的对象。一般主要参与者(或人型参与者)放在最左边,次要参与者(系统参与者)放在最右边。 4.2.1顺序图的建模元素 对象、生命线、消息、控制焦点 图4.2 从订单生成送货单 对一个电子商务网站进行建模,Order类中有一个dipatch()成员方法,其作用是根据供应商户的不同将一个订单分拆到多个送货单中。 1、 对象(角色) 上图中最顶上一排将对象名称包含起来的矩形框。对象名下有下划线。 将对象置于顺序图的顶部以为着在交互开始的时候对象就已经存在了,如果对象的位置不在顶部,那么表示对象是在交互的过程中被创建的。 在顺序图中,参与交互的对象既可以是具体的事物,又可以是原型化的事物。作为具体的事物,一个对象代表现实世界中的某个东西。例如,aOrder作为类Order的一个实例,可以代表一个特定的订单;而如果作为一个原型化的事件,则 aOrder可以代表类Order的任何一个实例。 顺序图中对象有3种命名方式,如下图 objectName:ClassName :ClassName objectName 显示对象名和类名 只显示类名(匿名对象) 只显示对象名 (不关心对象属于什么类) 图:顺序图中对象的命名方式 通常,顺序图中更常用的对象是表示扮演特殊角色的原型化的事物,甚至可以采用匿名对象表示。图4.2中的前两个的是命名对象,分别是名为DispatchForm的Form实例和名为aOrder的Order实例,后面三个是匿名对象,分别表示OrderItem、Product和DeliverOrder类的实例。 2、 生命线与控制焦点 (1)生命线:每个对象都有自己的生命线,对象生命线是一条垂直的虚线,用来表示一个对象在一段时间内存在。 一般顺序图中出现的大多数对象是存在于整个交互过程中的,即对象置于顺序图的顶部,其生命线从图的顶部画到图的底部。但有一些例外情况: ①对象可以在交互过程中创建,它们的生命线会从接到新建对象(构造函数)的消息时开始。 ②对象也可以在交互过程中销毁,它们的生命线在接到析构函数(或标记为destroy)的消息时结束。 (2)控制焦点:生命线上的长条形矩形称为“控制焦点”,它表示一个对象执行一个动作所经历的时间段,顶部表示动作的开始,矩形底部表示动作的结束。 控制焦点可以嵌套,嵌套的控制焦点可以更精确的说明消息的开始和结束位置,如图  激活期:表示对象执行一个动作的期间,即对象激活的时间段,与控制焦点同义。 3、 消息 消息:用来描述对象之间所进行的通信的,该信息带有对将要发生的活动的期望。当传送一个消息时,它所引起的动用是一个通过对计算过程的抽象而得到的可执行语句 消息分为五种:调用、返回、异步(发送) ⑴ 调用消息(call):表示调用某个对象的一个操作(通常格式为对象名.成员方法)。可以是对象间的调用,也可以是对对象本身的调用(局部调用)。UML符号如图所示,并在符号上标明顺序编号、消息名称、参数。 例:在图4.2 从订单生成送货单中,从dispatchForm到aOrder对象间的1:dispatch( )就说明了在dispatchForm中将调用Order类(aOrder对象所属于的类)的dispatch( )方法,参数为空。 调用消息必有一个配对的返回消息,为了图的清晰简洁,一般不画出来。 ⑵ 返回消息(return) ①表示从过程调用返回,返回消息是隐含的,不画出 ②对非过程调用,返回表示被调用的对象向调用者返回一个值。 例:在图4.2 从订单生成送货单中显示了3个返回消息。从Product类的实例返回给OrderItem类实例的PeddeleryId (供应商户ID)就是对3.getPeddeleryId()消息调用的回应。而当aOrder完成了dispatch( )之后,将向dispatchForm返回summary信息。 ⑶ 异步消息(发送消息send):发送者通过消息把信号传递给接受者,然后继续自己的活动,不等待接收者返回消息或控制。 比较:调用是同步机制,就是说对象A调用对象B时,A发送完消息后会等待B执行完所调用的方法之后在继续执行;而异步消息是对象A给对象B发送了一个信号,那么A在发送完信号后,就会继续执行,不会等待。 例子:Windows中“点击鼠标左键”就是一个典型的信号。当Windows进入资源不足状态时,你通过点击鼠标左键来关闭一个窗口,也许不会马上响应,而你仍然可以继续操作鼠标,等过一会,可能这个窗口就关闭了。 在UML中,消息用箭头表示,箭头的类型表示了消息的类型。常用符号: 表4-1 Rose2003中消息的类型符号 符号 含义 (过程)调用消息 两个对象之间绘制消息 UML1.4及以后版本中的异步消息 对象内调用(向自身发送消息) 返回消息 UML1.3及以前版本中的异步消息 Rose2003中的异步消息 ⑷ 消息的语法格式:(教材P 40-41) [predecessor][guard-condition][sequence-expression][return-value:=]message-name([argument-list]) 表4-2 消息的语法格式 语法成分 格式 Predecessor:必须先发生的消息列表 消息顺序号1,消息顺序号1/ guard-condition:警戒条件,满足条件时 发送消息 [布尔表达式] sequence-expression:消息顺序表达式 消息顺序项.消息顺序项...: return-value   表4-3 消息的语法格式举例 2:display (x, y) 简单消息 1.3.1: p :=find(specs) 嵌套消息,消息带返回值 [x<0]4:invert(x, color) 条件消息 3.1*:update( ) 循环消息 A3,B4/C2:copy(a,b) 线程间的同步 4、对象的创建和销毁 创建对象(构造函数实现)意味着该对象生命线的开始。 如果对象位于时序图的顶部,说明在交互开始之前该对象已经存在了。如果对象是在交互的过程中创建的,那么它应当位于图的中间部分。 § 对象在创建消息发生之后才能存在,对象的生命线也是在创建消息之后才存在的 创建对象的两种表示方法: 销毁对象(析构函数实现)在目标对象的生命线重终点放一个X(大叉),该点通常是对删除或取消消息的回应。 4.2.2顺序编号(消息编号) 整个消息的传递过程形成了一个完整的序列,因此通过在每个消息的前面加上一个用冒号隔开的顺序号来表示其顺序(不是标准的UML编号方法)。除了无层次的顺序编号之外,还可以采用嵌套方案(标准的UML编号方法)。 消息的编号可以有两种:一种是无层次编号,它简单直观;另一种是嵌套的编号,它更易于表示消息的包含 或说嵌套关系。如在消息1中,1.1是嵌套在消息1中的第一个消息,它在消息1.2之前,消息1.2是嵌套在消息1中的第二个消息,依次类推。但不管使用什么样的方法来标识,都必须确保消息标号的唯一性。 无层次编号 嵌套编号 4.2.3 循环与分支 表示循环行为和条件行为不是顺序图的长项,尤其是在UML1.X版本中表示这种语义很困难,如果需要表示这种控制结构,采用活动图会容易的多。不过在UML2.0中引入了交互片段(Interaction Frame),能够有效解决上述问题。图4.2 从订单生成送货单中利用了交互片段,将业务逻辑表述的更加清晰。 交互片段中包含了一部分的顺序图,而且还可以将交互片段中的顺序图分成几个区域。每个交互片段都有一个操作符,而每个区域都有一个监护条件,其表示法如下图所示: 图:交互片段表示法 下面我们主要介绍一下最常用的如何使用交互片段表示循环和分支。 (1)分支。当顺序图中的交互是否执行取决于某个特定条件的时候,就需要用到分支。可以表示分支的操作符有两个:支持多条件的Alt和支持单条件的opt. 在图:交互片段表示法中使用的是一个alt的使用实例,它说明如果PeddeleryId (供应商户ID)不存在,则执行虚线(区域分割线)上面的交互;如果PeddeleryId (供应商户ID)存在则执行虚线下面的交互,也就是Else的交互。如果要表示多个条件分支,则可以用“区域分割线”分解出多个区域,并为每个区域设置一个监护条件。 在图4.2的例子中,实际上要表示的逻辑是“如果PeddeleryId不存在就先创建它,然后添加;否则直接添加,因此也可以使用单条件的opt操作符表示。 (2)循环。在交互片段中表示循环的操作符是Loop,它说明该片段可以执行多次。而具体的次数由循环次数范围和监护条件表达式来说明。在我们这个例中,没有通过循环次数范围来说明循环的次数,而只是采用了监护条件。它的意思是对每一个OrderItem都执行一遍该业务逻辑。当然,也可以显示的指出循环次数,如: Loop(1,n):表示for i=1;i<=n;i++. Loop(5):表示执行5次 (3)我们说了交互片段是UML 2.0中新增加的特性,因此在采用UML1.x的建模工具时无法完成上述模型,这时只能借助UML中的循环标记和监护条件(警戒条件)来表示。循环标记是在消息名前附带一个“*”号,这些标记在UML 2.0的顺序图中不再采用,但在UML 2.0的协作图中仍然保留。 4.3 建立顺序图的步骤 ① 设置交互的语境,不管它是系统、子系统、操作、类、还是用例或协作脚本。 ② 通过识别对象在交互中扮演的角色,设置交互的场景。将对象按照从左到右的顺序放在顺序图的顶部,比较重要的放在左边,其他的临近对象或次要对象放在右边。 ③ 为每个对象设置生命线。多数情况下,对象存在于整个交互过程中。对于那些在交互期间创建和销毁的对象,在适当的时刻设置它们的生命线,用适当的构造型化消息显示的指明它们的创建和销毁。 ④ 从引发某个消息的信息开始,在生命线之间画出从顶向下依次展开的消息,显示每个消息的特性(如参数)。如果有需要,还可以解释交互的语义。 ⑤ 如果需要表示消息的嵌套或表示发生时的时间点,则采用控制焦点修饰每个对象的生命线。 ⑥ 如果需要说明时间或空间的约束,可以用时间标记修饰每个消息,并附上合适的时间和空间约束。 ⑦ 如果需要更形式化的说明某控制流,可以为每个消息附上前置和后置条件。 一个单独的顺序图只能显示一个控制流,通常一个完整的控制流肯定是复杂的,所以,将一个大的流分为几个部分放在不同的图中是比较合适的。 4.4协作图 协作图也是一种交互图,与顺序图描述随着时间交互的各种消息不同,协作图描述了参与交互的对象的组织。 4.4.1协作图的建模元素 协作图中有3种元素:对象,链和消息。 图 “从订单生成送货单”的协作图,它向我们提供了在对象的组织结构的语境中观察控制流的一个清晰的可视化的轨迹。和前面的顺序图比较可以发现,对象还是那些对象,消息也还是那些消息,协作图中除了“对象”之间的链(连接线)之外,所有的元素在前面的顺序图中都体现过了。 1、 对象。这里在对“对象”补充几点。 (1)在协作图中无法表示对象的创建和撤消,所以对象在协作图中的位置没有限制。 (2)对象中有所谓的多对象和主动对象。在协作图中,多对象指由多个对象组成的对象集合,这些对象一般属于同一个类,它们的本质是类的实例。当需要把消息同时发给多个对象的时候使用多对象。在协作图中,多对象用多个方框重叠表示。在顺序图中也可以使用多对象,但显示出来和单对象是一样的,没有多个方框重叠。 有时候某些对象中包含了一组属性和方法,但这些方法中至少有一个方法不需要接收消息就能够主动的执行,这个方法被成为主动方法。包含主动方法的对象就称为主动对象,也就是说,主动对象在不接收外部消息的情况下自己开始一个控制流。它的符号: : Robot UML中的主动对象 : Robot active Rose中的主动对象 在UML中主动对象用加粗的方框表示,Rose中则是在对象名的下边加一个active说明。 2、 链 链是对象之间的语义连接,一般说来,链是关联的一个实例。每当一个类与另一个类之间有关联(关联表明两个或多个类元之间联系)时,那么这两个类的实例(也就是对象)之间也就会存在着链。而当两个对象之间存在链时,一个对象就能向另一个对象发送消息。链的符号是一条连接两个对象的实线 在大多数情况下,只需要通过链来表示一个对象向另一个对象(可以是这个对象自身)发送消息的路径。但如果需要更精确的表示路径是如何存在的,则可以采用表4-4所示的构造型来修饰这个链。(不过在UML2.0中以及功能开始弱化这些构造型的使用,因此除非不要,并不需要过多的考虑它们)。 在链上也可以加一些修饰,如角色名、导航(就是箭头,表示链是单向还是双向),链两端的对象是否有聚集关系等。 表4-4 链的构造型(UML1.X) 构造型名称 表示法 说明 关联 《association》 说明对应的对象通过关联是可见的,是默认构造型,无须显示的指出 自身 《self》 说明对应的对象就是调用该操作的自身,在协作图中表现出来的是对象与自身的链,一般也无须显示的指定 全局 《global》 说明对应的对象是一个全局的对象,在全局范围内可见 局部 《local》 说明对应的对象对发送者来说是一个局部对象,只在局部范围内可见 参数 《parameter》 说明对应的对象只是发送者调用某函数时使用的参数,例如在应用系统中数据库访问层将用户界面层所查询的数据放在一个集合对象,如Arraylist中传回,那么这个集合对象就是一个参数 表4-5 Rose2003中常用的几种链的符号 符号 含义 创建对象之间的通信路径,两个对象之间是关联的《association》 显示对象可以调用自己的属性,即自身《self》 在两个对象之间或一个对象本身增加消息 在两个对象之间或一个对象本身从反方向增加消息 显示两个对象之间的信息流 在反方向显示两个对象之间的信息流 3、 消息编号和消息语法的进一步说明 (1)前面说了消息的编号可以有两种:一种是无层次编号,它简单直观;另一种是嵌套的编号,它更易于表示消息的包含或说嵌套关系。在协作图中经常还会采用一些更复杂的消息编号方式,例如可以加如“线程”和“进程”的概念,根据消息所在的线程来区分其消息编号。 语法格式是:[integer|name],其中integer是消息序号,name表示并发的控制线程。例如:消息A5和A11就应该在同一个线程或进程中,而消息A5和B3就说明不在同一个进程或线程中。用lal和lb1表示着两个消息都在消息1内,但在并发、嵌套的不同线程中执行。 (2)循环与监护条件(警戒条件) UML 2.0的协作图中,循环是通过在顺序编号前加上一个迭代符“*”和一个可选的循环表达式来表示的。常用的循环表达式有: 循环表达式 含义 [i:=1..n] 循环n次 [while(布尔表达式)] 当布尔表达式为真时执行循环 [until(布尔表达式)] 循环执行到布尔表达式为真时停止 [for each(计算结果为对象集合的表达式) 在对象集合上循环 监护条件(警戒条件):通常是用来表示分支的,也就是表示“如果条件为true,才发送消息”的语义,以“[条件表达式]”的格式表示。 例:在图中,消息“1.1:getPeddleryID()”的前面就有一个循环表达式,说明对Order的实例aOrder对象中的每个orderItem进行循环操作。 消息“1.3:Create(PeddleryId)”的前面加了监护条件[PeddleryId Not Exist],它说明只有当PeddleryId不存在时才调用create方法来创建新的送货单,如果已经存在,就不必创建,直接调用1.4的方法,将订单项中的产品添加到相应的送货单即可。 在协作图中使用监护条件一定要有所限制,通常应只列出主要的监护条件,否则会影响其阅读。如果需要,尽可能还是通过顺序图来表示 。 4.5 建立协作图的步骤 协作图对复杂的循环和分支的可视化和对多并发控制流的可视化要比顺序图好。 利用协作图对控制流建模主要遵循以下策略: ① 设置交互的语境,或者说确定交互过程的上下文。这些语境可以是系统、子系统、操作、类、还是用例或协作脚本。 ② 通过识别对象在交互中扮演的角色,设置交互的场景。将对象作为顶点放在协作图中,其中比较重要的对象放在中央,他们的临近对象放在外围。 ③ 为每个对象设置初始特性。如果某个对象的属性值、标记值、状态等在交互期间发生重要变化,则在图中放置一个复制对象,并用新的值更新它,然后通过构造型<>或<>的消息将二者连接。 ④ 描述对象之间可能有信息沿着它传递的链。首先安排关联的链,这些链是最主要的,它们代表结构的连接。然后再安排其他链。 ⑤ 从引起交互的消息开始,适当地设置其顺序号,然后将随后的每个消息附到适当的链上。可以用带小数点的编号来显示嵌套没。 ⑥ 如果需要说明时间或空间约束,可以用时间标记修饰这个消息,并附上合适的时间和空间约束。 ⑦ 如果需要更形式化地说明这个控制流,可以为每个消息附上前置和后置条件。 和顺序图一样,一个单独的协作图只能显示一个控制流。 一般情况下,不管是顺序图还是协作图,会有很多交互图,其中一些是主要的,一些用来描述可选择的路径或例外条件,可以利用包来组织这些协作图的集合,并给每个图起一个合适的名字,以便与其他图区别。 4.6 顺序图和协作图的比较 顺序图和协作图都属于交互图,用于描述对象间的动态关系,并且两者之间可以相互转化。 强调重点不同:顺序图强调消息的时间顺序,协作图强调参与交互的对象的组织。 建模元素不同:顺序图中独有生命线和控制焦点;协作图中有路径和链,并且消息必须有消息顺序号。 4.7 定时图 如果要表示的交互具有很强的时间特性(如现实生活中的电子工程、实时控制等系统中),在UML1.X中无法有效表示出来。UML2.0引入一种新的交互图来解决这类问题。即着重表示定时约束的“定时图”。 根据UML的定义,定时图实际上是一种特殊形式的顺序图,是一种变体,她与顺序图的区别主要体现在以下几个方面: (1)坐标轴交换了位置,改为从左到右来表示时间的推移 (2)用生命线的“凹下凸起”来表示状态的变化,每个水平位置代表一种不同的状态,状态的顺序可以有意义、也可以没有意义。 (3)生命线可以跟在一根线后面,在这根线上显示些不同的状态值 (4)可显示一个度量时间值的标尺,用刻度表示时间间隔 例:定时图,用来表示一个电子门禁系统的控制逻辑,该门禁包括门(物理的门)、智能读卡器(读取用户的IC卡信息)、处理器(用来处理是否开门的判断)。图中小黑店加曲线表示的是注释,不是定时图的一部分。 说明:这个例子所表示的意思是一开始读卡器是起用的(等待用户来刷卡)、处理器是空闲的(没有验证的请求)、门是关着的。接着: (1) 当用户刷卡时,读卡器就进入了“等待校验”的状态,并发送一个消息给处理器,处理器就进入了校验状态。 (2) 如果校验通过,就发送一个“禁用”消息给读卡器(因为开门的时候,读卡器就可以不工作了),使读卡器进入禁用状态,并且自己转入启用状态,这时门的状态变成了“开”。 (3) “门”开了30秒(根据时间刻度得知)之后,处理器就会把它再次“关”上,并且发送一个“启用”消息给读卡器(门关了,读卡器又要重新工作了,这时读卡器再次进入启用状态,而处理器已经又回到了空闲状态。 不难看出,定时图包含的图元并不多,主要有:生命线、状态、状态变迁、消息、时间刻度。你可以根据自身需要来使用它。 4.8常见问题分析与练习 1假设有一系统的协作图局部如图7-29所示,print方法的功能是将传入参数的值打印在屏幕上;fact方法是用来计算阶乘的,test的初值为1。那么将打印出什么? 图7-29 协作图局部 打印的值是9。将执行三次循环,因此test的值是1!+2!+3!=9.

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 7 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档