构建顺序图是以图形方式记录情景(scenarios)的方式。每当要记录一系列动作时,就可以构建顺序图,而不是编写情景。什么时候要这么做呢?由用例图部分可知,用例由一系列任务(情景)构成,可通过构建顺序图将它记录下来。假如有图4-8中的文本记录的情景,为什么要构建一个顺序图呢?原因有三个:
要记录支持对象:可记录通常不在情景中描述的所有辅助对象。由图4-8中的情景可知,可能需要一个订单表,可从中提取列表,选择用哪些订单构建清单。如果用顺序图记录,则比在情景中用普通文本描述更容易。
要记录技术问题:随着项目的发展,可能要记录一些关于顺序图的技术问题。例如,可记录所需要的参数类型和默认值等。如果这个阶段了解这些信息,则确实应该记录下来,开发人员和测试者将用到这些信息。如果将这些信息记录在顺序图中,则更容易理解要实现的内容。
一幅图片能抵得上千言万语:图形更容易记录问题,如果用普通文字描述的话,可能需要很多话语才能说清楚。
顺序图与后面介绍的协作图属于同一系列。二者的区别在于:顺序图基于时间显示情景,而协作图显示对象之间的关联方式。所谓基于时间,即一件事情先发生,接着发生另一件事情,事情完全按描述的顺序发生。
上面提到过,顺序图常与用例(情景)相关。不过,顺序图也可用于其他许多目的。用例一节曾介绍过,如果不了解正处理的业务,或任务非常复杂,需要了解业务过程的更多信息,则可执行业务分析。在执行业务分析时,可用顺序图记下所有过程(这很可能是业务用例)。实际上,顺序图可能是记录要实现内容的最强大工具。
顺序图包含以下一些元素:
- 对象(objects)
- 激活(activations)
- 消息(messages)
- 注解(notes)
下面几节将描述这些顺序图元素。
4.2.1 对象
解决方案中对象的表示符号是矩形,如图4-16所示。顺序图中的对象是解决方案中的持久元素。它们可能是表、物理窗体或类。一般情况下,对象表示解决方案中的类,也可表示节点、行动者和表等。构建顺序图的一个主要原因是:可了解顺序图中可能作为对象的候选对象。
图4-16 包含类生命线的顺序图
练习4-8显示如何将对象插入顺序图。
练习4-8
(1) 在VEA中新建UML模型。
注意:
在新模型中执行本练习时,将自动显示顺序图。或者,可右击需要插入顺序图的包,并选择New | Sequence
Diagram插入顺序图。
(2) 从Shapes窗口中的UML Sequence选项卡中将Object Lifeline(对象生命线)拖入图中。
(3) 双击对象生命线,将对象生命线的名称改为Class1,该名称必须惟一。
注意:
当UML模型不包含任何类时(如本例),在打开UML Classifier Role Properties对话框(如双击Object
Lifeline形状)时,将自动打开UML Class Properties对话框。这是因为每个对象必须与分类器(类)相关。如果UML模型中已有类,则当双击Object
Lifeline形状时,UML Class Properties对话框不会自动打开。此时,可通过选择UML
Classifier Role Properties对话框中的Classifier列表,来设置分类器。如果不存在,可单击New按钮创建,并指定设置。
(4) 在自动打开的UML Class Properties对话框中,可接受新建类(分类器)的默认名Class1。单击OK。顺序图如图4-16所示。
提示:
当同时按下Ctrl和Shift键时,指针将变成一个放大镜,左击将放大视图,右击将缩小视图。在放大或缩小时,新视图将居中。
分类器(classifier)由类生命线表示。在本例中,类生命线表示Class1类。由第2章知,对象可以是人,也可以是物,故可以是类。对象也可以是行动者。在练习4-9中,为顺序图添加一个行动者对象。
练习4-9
(1) 右击准备放置行动者的包,从弹出菜单中选择New | Actor,在Model Explorer中构建行动者。
(2) 在UML Actor Properties对话框中单击OK,以接受默认名(Actor1)。
(3) 将Object Lifeline拖入顺序图。
(4) 双击Object Lifeline形状,将名称改为Actor1(不一定使Object Lifeline与其分类器同名,但名称必须惟一)。如图4-17所示。
图4-17 包含类和行动者生命线的顺序图
由图4-17可看到,Object Lifeline形状已改为Actor形状,因为它通过分类器设置表示行动者。另外注意Object
Lifeline形状下的虚垂线,这就是生命线。生命线表示时间,其长度应反映实际时间(对象被销毁前的生命期)。不能将动作直接连接到生命线,为达到目的,需要使用激活,见4.2.2节。
4.2.2 激活
激活是可连接到对象生命线的细长矩形。这样,对象生命线(对象)能参与动作。动作(action)类似于事件,可由用户(例如,当用户双击时)、另一个系统或信号(例如,日子或日期的特定时间)触发。
练习4-10演示如何为对象添加激活。
练习4-10
(1) 对于在练习4-8中构建,在练习4-9中进行修改的顺序图,将Activation拖到Class1对象生命线。
(2) 将Activation形状的终点连接到对象生命线的连接点,两个连接点必须相连(可能要拖动Object
Lifeline形状进行扩展,使其大于Activation形状)。
(3) 重新调整Activation形状的长度,以表示执行动作需要的时间。不能指定时间量,如30分钟,但可指定动作将占用多少对象生命线。例如,如果占用整个生命线,则该动作占用100%的对象生命期。如图4-18所示。
图4-18 包含Activation形状的顺序图
由图4-18可以看到,Class1对象准备参与动作,将消息传给其他对象,或从其他消息接收消息。
4.2.3 消息
对象(如类、表等)是解决方案的持久元素。消息是对象之间执行的动作,经常是类的方法,是未实例化对象或代码模块中的函数。消息标志着两个对象之间的通信,从而表示一个动作。在顺序图中,消息只表示一条消息[9]。
顺序图存在以下消息类型,如图4-19所示。
图4-19 6种顺序图消息类型
消息:这是普通消息。它连接到两个不同对象生命线的连接点。在图4-19中,Message1是个消息例子。此类消息表示一个动作,与接收对象(箭头所指的对象)的方法或操作相关。换言之,接收消息的对象执行这个请求上的动作。消息可包含传给要执行方法的参数。
消息(调用):消息调用的流程类型是过程调用,即消息调用是过程调用的一部分。尽管如此,消息调用的行为类似于普通消息。图4-19的Message2和Message3是消息调用。Message3与Message2不同,它是到发送对象本身的消息调用(例如,给出一些多态行为)。
消息(返回):返回消息是将信息返给对象的消息,一般发生在执行动作之后。返回信息不执行动作,仅返回信息,与普通消息的方法或操作无关。在图4-19中,Message4和Message6是返回消息,但Message6是发送对象本身的所返回消息。
消息(异步):异步调用是流程类型被设置为异步的消息。这意味着,发送对象将消息发送给接收对象,并不等待接收对象的响应。发送对象可继续其他操作,同时接收对象执行发送消息的动作请求。在图4-19中,Message5是异步消息。异步消息与普通消息和消息调用不同,因为异步消息不是真正的方法(操作),而是一种接收(reception)。接收仅指示分类器(操作)能对指定信号做出反应。
要将一条消息添加到顺序图中,将Message形状从UML Sequence选项卡拖到图中,并将连接点连接起来。消息可包含参数,如果确保将所需参数添加到消息,则开发人员可真正使用此类文档来构建类图。还可指定顺序编号,这有利于表示发送消息的顺序及哪些消息是相关的。将顺序图的编号用作快速索引,顺序说明了消息的位置(在协作图中,顺序编号更加重要)。双击消息,并在Sequence文本框中输入编号,即可指定顺序编号。
设有一个对象,一个名为Order的类,该对象包含称为GetList的方法或操作,它检索出特定日期的订单列表。要检索订单列表,需要从Orders表提取信息,Orders表包含所有订单。Orders表也是一个对象。可以记录该对象,见练习4-11。
练习4-11
(1) 在VEA中新建UML模型。
(2) 使用名称Order和Implementation Class定型,在Top Package包新建一个类。
(3) 使用名称Orders,在Top Package包构建另一个类。
(4) 将Object Lifeline形状拖入当前图,将其命名为Order。将这个分类器设置为Top
Package::Order。
(5) 将Object Lifeline形状拖入当前图,并将其命名为Orders。再将这个分类器设置为Top
Package::Orders,如图4-20所示。
图4-20 包含对象的顺序图
注意:
在图4-20中,使用Implementation Class定型来指示类是一个实现类。类也可能是表示类型的类型类(type
class)。实现类可以是特殊类型的实现,在建模时,在类型类和实现类之间构建关系。
下一步添加GetList动作,该动作从Orders表检索特定日期的所有订单。要添加动作,必须首先将Activation放在Object
Lifeline上。可通过从UML Sequence选项卡拖动Message形状,将GetList消息放在图中,并连接参与消息交互的两个对象的连接点。练习4-12演示了该方法。
练习4-12
(1) 将Activation形状拖放到练习4-11构建的顺序图的Order对象生命线上。
(2) 将Activation形状拖放到Orders对象生命线上,如图4-21所示。
图4-21 包含对象和激活的顺序图
(3) 将Message形状拖入图中,将Order对象生命线和Orders对象生命线连接起来,如图4-22所示。可以看到,Message1消息从Order对象发送到Orders对象。不过,它还未在Orders对象上执行任何操作。
图4-22 包含消息的顺序图
(4) 将消息重命名为GetList。
(5) 双击Message形状,打开UML Message Properties对话框。
注意:
当接收Message形状的对象不包含任何操作时(如本例),在打开UML Message Properties对话框时,将自动打开UML
Operation Properties对话框。如果接收Message形状的对象包含一个或多个操作,但不是您要执行的操作,则单击UML
Message Properties对话框的New按钮,以新建一个操作。
(6) 在自动打开的UML Operation Properties对话框中,将操作命名为GetList,并单击OK。
(7) 在UML Message Properties对话框的Operation列表中,第6步新建的操作被自动选中。单击OK,将其接受为这条消息的操作。如图4-23所示。
图4-23 包含消息名的消息
在图4-23中,有一条源自Order类的消息,在Orders表对象上执行GetList操作或方法。当Orders表对象接收到该消息时将要做什么?什么也不做。为使Orders表对象执行GetList方法并返回请求的数据,需要添加返回消息。练习4-13演示如何为图添加所需要的返回消息。
练习4-13
(1) 将Return Message拖入图中。
(2) 对于练习4-11中构建的、在练习4-12中修改的顺序图,连接Order对象生命线与Orders对象生命线。
(3) 将返回消息命名为Orders (DataSet),以指示返回包含请求订单的DataSet。如图4-24所示。
图4-24 顺序图上的返回消息
由图4-24可知,Orders返回的消息在DataSet中返回请求的订单。前面提到过,Orders对象的GetList方法检索与特定日期匹配的所有订单。但目前为止,还没有明确指定。练习4-14演示如何为消息执行的操作添加参数。
练习4-14
(1) 对于在练习4-11构建的,在练习4-12和4-13修改的顺序图,打开Orders对象GetList操作的UML
Operation Properties对话框。双击Model Explorer中Orders对象下显示的消息,打开这个对话框。
(2) 选择Categories列表中的Parameters,并单击New。
(3) 将参数命名为FromDate,并从Type列表中选择VB::Date。如图4-25所示。
图4-25 消息上的参数设置
由图4-25可看到,GetList消息包含参数FromDate,该参数的类型为VB Date[10]。注意,Model
Explorer窗口的Orders类也显示了参数。
4.2.4 注解
“注解(note)”可附加到元素上。注解很简单,但很有用。要添加注解,只需将Note形状从UML Sequence选项卡放到图中,如图4-26所示。
图4-26 顺序图上的标记
在Note形状中间(当选中时),将看到一个连接点(一颗黄色钻石形状),可将它连接到需附加注解的对象的连接点。可将一个注解连接到需要的很多元素。在图4-27中,注解被连接到Orders对象生命线。在双击注解时,可在Documentation文本框中输入注解文本。
图4-27 包含文本的附加注解
4.2.5 顺序图小结
本节介绍了顺序图的基本原理。通过本节的学习,您可以了解到,对象是可以用对象生命线表示的类、行动者或事件形式。可将激活附加到对象生命线,以在其上放置动作。大致说来,激活演示执行动作需要的时间。激活可以与消息连接。消息指示一个对象将一条消息发送给另一个对象,根据消息流类型,可能伴有动作。还可以看到,消息可包含参数。
顺序图是一个二维图。水平维度表示对象,垂直维度表示时间。时间按从上到下的顺序显示。
|