顺序图中的主要概念和表示法如下。
生命线(lifeline)。这个术语在UML1的顺序图中称为对象生命线(object lifeline),其含义是展示对象生存时间的那条线。UML2把object省略了,只剩下lifeline,却用它代表了对象本身,而不是指图中的哪条线。UML2的顺序图和其他3种交互图都是这种称呼:凡是提到“生命线”,都是指一个对象(或其他实体)。生命线表示法是用一个位于顺序图顶部的矩形框代表一个对象,框内填写对象名和它所属的类名,中间用一个冒号隔开。如果只写一个冒号和它的类名,不写具体的对象名,则表示它适用于该类的任何对象,称为“匿名对象”。从矩形框向下有一条虚线,表示对象生存的时间自上而下行进。画在虚线上的一个瘦长条表示它的一个行为单位(例如对象的一个操作)的执行期,从瘦长条的上端开始到下端结束,UML2称之为执行规约(execution specification)。如果一个对象的操作需要调用该对象自身的另外一个操作,为了避免重叠,可以把被调用操作画到偏离虚线的位置。一个来自UML1的顺序图的例子见图1。图中有6条生命线,最左侧的生命线是一个参与者,其他5条生命线分别是A、B、C、D、E等5个类的对象。
消息(message)。是在对象(或其他实体)之间发送和接收的通信信息。在顺序图中用实线闭合箭头表示同步消息,用实线开放箭头表示异步消息。在箭头旁边标出消息的名称。同步消息最常见的情况是操作调用,即消息发送者在其操作的执行中调用接收者的一个操作。被调用者执行完之后需要返回调用者,此时可以用一个虚线开放箭头表示消息返回,也可以省略而不加表示。异步消息的发送和接收不是同时发生的,若要直观地显示其时间差,则可以将表示异步消息的箭头线画成倾斜的。在图1的例子中,D和E两条生命线之间的消息是异步消息,其他消息都是同步消息。
时间约束(time constraint)。在生命线上可以具体地给出对某些事件的时间要求,即时间约束,例如一条消息的处理时间、消息的返回时间、两条消息之间的间隔时间等。时间约束的书写方式是:在一对花括号中写一个时间表达式。时间表达式有两种方式。一种方式是在生命线上给出一段时间间隔,例如{0‥3sec.}表示这段时间不能超过3秒;另一种方式是在生命线上给出一个基准时刻,标以适当的文字,例如t=now,而其他时间点的表达式用它作为参量,例如{t‥t+2sec}表示在时间t之后的2秒之内。以上方式如图1中生命线C和E上的信息所示。
条件(condition)。在生命线特定的点上可以给出一个条件,表明只有此条件得到满足才能执行某项行为(例如发送一个消息)。条件的表示法是在一对中括号内书写一个布尔表达式。同一个点上可能给出多个条件,表示在不同的条件下发送不同的消息。例如图11中生命线A上端的两个条件[x>0]和[x<0]。
状态不变式(state Invariant)。也是一种条件,即“后条件”。把它写到生命线的某一点上,表示当交互进行到这一点时,对象的状态必须满足此条件。表示法是,在一对花括号中写一个恒等式,例如图1中生命线A下端的不变式{x==0} 。
对象创建。如果从一个对象发出的消息创建了另外一个对象,则将此消息的箭头指向被创建的生命线顶端的矩形框(例如图1从生命线A到C的消息),示意后者从这个时刻才开始出现,从而表明它是由该消息创建的。
生命线终止。如果某个对象在顺序图所描述的整个交互结束之前生命就已经终止,可以在其生命线的相应位置画一个叉号╳来表示生命线终止。在图1中,生命线C和E就是这样终止的。许多对象的生存时间可能延续到顺序图所描述的交互之后,对这些对象不应该使用这种符号。
以上介绍的是顺序图中传统的和最常用的概念。为了把顺序图中的图形元素组织成一些粒度较大并且可以被复用的单位,UML2增加了一些新的概念和表示法,现介绍如下。
帧(frame)。是各种交互图中共同使用的图形表示机制。帧就是一幅图的意思,它不是一种模型元素,也不表示任何与业务逻辑有关的含义。它的作用只是给模型图加一个边框,并且给出图的标题以便引用。帧的表示法见图2。一个大的矩形框,在它右上角划分出一个小区域,用来填写标题,框内其余部分是内容区,用来绘制图的实际内容。标题由3部分构成,即类型、名字和参数,其中名字是必需的,类型和参数可空缺。无论是一个完整的模型图还是其中的一个局部都可以被绘制成一个帧,然后这个帧就可以作为一个整体被其他地方引用。
交互(interaction)。是一个行为单位,它描述了元素之间的信息交换。交互中的一个片段称为交互片段(interaction fragment)。一个交互片段可以画成一个帧。也可以把多个交互片段组织在一个帧内,称为组合片段(combined fragment),其中各个交互片段之间用虚线隔开,如图2(b)所示。
在顺序图中可以引用一个已有的帧作为自己的一个组成部分,称为交互使用(interaction use)。此时可以不必把帧的内容画出来,只须用一个简单的图形符号表示把这个帧的内容复制到顺序图的相应位置。其表示法如图2(c)所示,用一个矩形表示被引用的帧,给出它的名字,并在一个角上用一个操作符ref表示引用,以提醒读者其实际内容是在相应的帧内给出的。图2(d)是UML2给出的一个含有交互使用的顺序图的例子,描述了一个身份认证系统(门禁系统)中用户与系统之间的交互。图中有两个交互使用。第一个交互使用是引用一个名为EstablishAccess的交互,其参数是非法的个人身份号码,卡退出。下面是在一个交互片段内发生的情况——系统通过了认证,给用户一个“请进”的消息,接下来是另一个交互使用,即OpenDoor,将门打开。
通过上述机制,可以使顺序图的绘制得以简化。此外,当多个顺序图中都包含一个帧所描述的交互片段(甚至一个完整的交互)时,这个帧就可以在多个顺序图中被复用。
组合片段更多的应用场合是在一个顺序图中将它内部的交互内容都直接展现出来,并通过交互操作符(interaction operator)表明它所包含的各个片段是如何参与交互的。交互操作符的一个值称为一个交互操作数(interaction operand),UML2定义了12个枚举型的交互操作数,见表。
操作数 | 英文全称 | 名称 | 解释 |
Alt | alternatives | 选其一 | 根据条件选择组合片段中的一个交互片段执行 |
opt | option | 可选 | 表示组合片段描述了一个可选的行为 |
break | break | 暂停 | 满足条件时打断正常的执行,转而执行这个组合片段 |
par | parallel | 并行 | 组合片段中的各个交互片段可以并行地执行,彼此之间没有次序要求,只是每个片段的内部要按各自规定的交互次序执行 |
seq | week sequence | 弱序列 | 按照组合片段内各个交互片段的排列次序执行,但如果两个片段不在同一条生命线上则它们之间没有次序要求,可以并行 |
strict | strict sequence | 强序列 | 强迫组合片段内的所有交互片段都按照规定的顺序执行,不管是不是位于同一条生命线上 |
neg | negative | 否定 | 表示组合片段描述了无效行为的踪迹 |
critical | critical region | 临界区 | 一旦开始执行,就不允许被其他事件中断 |
ignore | ignore | 忽略 | 指出组合片段应该忽略哪些消息 |
consider | consider | 考虑 | 指出组合片段必须考虑哪些消息 |
assert | assertion | 断言 | 指出交互必须延续到这个组合片段,这是唯一合法的结果 |
loop | loop | 循环 | 循环执行,循环次数取决于循环条件 |