UML
的概述 和 顺序图标准建模语言 UML
是一种直观化、明确化和文档化的通用可视化建模语言。它捕捉了被构建系统的有关决策和理解,用来理解、设计、浏览、配置、维护以及控制系统的信息。
由于复杂系统的建模往往需要进行严格的形式化分析和验证,而 UML
却是半形式化的,因为其语法结构虽然采用了形式化的规约,但其语义部分还是用自然语言描述的,缺乏准确的语义,这使得对模型难以进行定量定行的分析和验证。针对这一问题,UML
形式化方法的研究已经成为热点。形式化方法使用具有精确数学语义基础的形式化规范语言对系统的需求分析、设计进行描述,它具有精确定义的语义模型、自动化验证工具的支持,可以对软件规范进行严格的分析和验证。
UML
的定义UML
是一种通用的可视化建模语言,描述在软件开发方法中用于表示设计的符号(通常是图形符号)。UML
的定义包括 UML
语义和 UML
表示法两个部分。
UML
语义:描述基于 UML
的精确元模型定义。元模型为 UML
的所有元素在语法和语义上提供了简单、一致、通用的定义性说明,使开发者能在语义上取得一致,消除了因人而异的最佳表达方法所造成的影响。此外 UML
还支持对元模型的扩展定义。
UML
表示法:定义 UML
符号的表示法,为系统建模提供了标准。这些图形符号和文字所表达的是应用级的模型,在语义上它是 UML
元模型的实例。
UML
的构成在 UML
构成中,主要介绍模型元素和图形。
UML
的模型元素代表面向对象中的类、对象、消息和关系等概念,是构成图的最基本的常用概念,也就是说可以在图中使用的概念都可以称之为模型元素。模型元素用相应的符号来表示,比如,类、对象、用例等模型元素在 UML
中均有对应的符号表示。
UML
的图形由模型元素的符号组成,它表示系统的一个特殊部分或某个方面。UML
规范定义了九种图形来从不同方面描述系统,分别是:
名称 | 概述 | 例子 |
---|---|---|
用例图(Use-Case Diagram) | 用于显示若干角色(actor)及这些角色与系统提供的用例之间的关系。其中,角色是与系统进行交互的外部实体,可以是系统用户,也可以是其他系统或硬件设备;用例是系统提供的功能(即系统的具体用法)的描述。 | |
对象图(Object Diagram) | 是类图的实例。它及时具体地反映了系统执行到某处时系统的工作状况。对象图中使用的图示符号与类图几乎完全相同,只不过对象图中的对象名上加了下划线。对象图没有类图重要,对象图通常用来示例一个复杂的类图,通过对象图反映真正的实例是什么,它们之间可能具有什么样的关系,帮助对类图的理解。 | |
类图(Class Diagram) | 用来表示系统中类和类之间的关系,如关联、聚合等,也包括类的内部结构(类的属性和操作)。类图描述的是一种静态关系,所以在系统的整个生命期都是有效的。 | |
状态图(State Diagram) | 一般来说,状态图是对类所描述事务的补充说明,它显示了类的对象可能具备的所有状态,以及那些引起状态改变的实践。状态的变化称之为转移(transition)。一个转移可以有一个与之相连的动作(action),这个动作指明了状态转移时应该做些什么。 | |
顺序图(Sequence Diagram) | 用来反映若干对象之间的动态协作关系,也就是随着时间的流逝,对象之间是如何交互的。顺序图重点是显示对象之间已发送的消息的先后次序,说明对象之间的交互过程,已经系统执行过程中,在某一具体位置将会有什么事件发生。 | |
协作图(Collaboration Diagram) | 像顺序图一样显示动态协作。除了显示消息的交换(称之为交互)以外,协作图还显示了对象以及它们之间的关系(有时指上下文)。协作图当做一个对象图来绘制,它显示多个对象以及它们之间的关系。 | |
活动图(Activity Diagram) | 用于反映一个连续的活动流,主要描述满足用例要求所要进行的活动以及活动之间的约束关系,有利于识别并发活动。活动图由各种动作状态(action state)组成,每个动作状态包含可执行动作的规范说明。当某个动作完成后,该动作的状态就会随着改变,转换为一个新的状态。这样,动作状态的控制就从一个状态流向另一个与之相连的状态。在活动图中,实心圆表示活动图的起点,带边框的实心圆表示终点;圆角矩形表示执行的过程或活动;菱形表示判定点;箭头表示活动之间转换,箭头上的文字表示转换所必须满足的条件;而粗线条表示会并发进行的过程的开始和结束。活动图中的动作可以放在泳道中,泳道聚合一组活动,并指定负责人和所属组织,泳道用纵向矩阵来表示,属于一个泳道的所有活动均放在其矩形符号内,泳道的名字放在矩形符号的顶部。其中动作 “更新显示” 在 Displayer 内执行,动作 “初始化” 和 “测量” 在 Sampler 内执行。活动图是一种描述交互的方式,描述采用何种动作,做什么(对象状态改变),何时发生(动作序列),以及在何处发生(泳道) | |
组件图(Component Diagram) | 用来反映代码的物理结构。组件可以是源代码、二进制或可执行文件组件。组件包含了逻辑类或逻辑类的实现信息,因此逻辑视图与组件视图之间存在着映射关系。 | |
配置图(Deployment Diagram) | 定义系统中软硬件的物理拓扑结构以及自此结构上执行的软件。它可以显示实际的计算机和设备之间的连接关系,也可显示连接的类型及部件之间的依赖性,还可以显示网络之间的通信路径。配置图常常用于理解分布式系统。 |
从应用的角度看,当采用面向对象技术设计系统时,
UML
的静态建模机制。UML
的动态建模机制。UML
顺序图在 UML
动态建模机制中,顺序图可以用来展示对象之间是如何进行交互的。为了区分,我们暂且将 UML
定义的传统意义上的顺序图称为传统顺序图。传统顺序图将显示的重点放在消息序列上,即消息是如何在对象之间被发送和接受的。顺序图有两个坐标轴:垂直坐标轴用来显示时间,水平坐标轴用来显示一组对象。首先详细介绍下顺序图中所涉及的主要内容:
对象名:对象所属类
,其中对象名可以省略。UML
中使用的消息类型有三类:
简单消息:象征一个平直的控制流。简单消息显示了控制室如何从一个对象传递到另一个对象的,这个过程中并没有描述任何有关对象之间通信的细节信息。它也可以用于显示一个同步消息的返回,在绘制时应该从处理该消息的对象引向调用者,表示控制正在传回来(也可能会同时是传回一些结果)。
同步消息:一个嵌套的控制流,一般是作为操作调用来实现的。只有在处理该消息的操作结束之后(包括作为处理过程的一部分而发送的任何进一步的消息),调用者才能够恢复继续执行。消息的返回可以在顺序图中以一个简单消息的形式显示。
异步消息:异步的控制流,其中没有显式的到调用者的返回消息。对象之间的异步消息表明了不等待语义,发送者不必等待该消息处理完就可以继续执行。
一般在浏览顺序图时,应该从图的顶部开始往下查看,分析那些随着时间的流逝而发生的消息交换。尽管传统顺序图能够比较清晰地表示对象之间的消息传递,尤其是消息传递的先后次序,但由于基本表示有限,因此对于消息传递的很多机制不能很好地表示出来,有些关系(如并发、同步等)无法表示出来,而有些关系(如选择)往往需要多个顺序图合作表示,例如,假设要在传统顺序图中描述“开户”这一情节,则用顺序图表示时,需要考虑开户成功和开户失败两种情况,这时就需要两种情况分别建立两个顺序图表示。因此,传统顺序图在表达能力上还有一定的局限性。
为了更好地描述系统的行为,我们将 UML
中的传统顺序图进行扩展,使之能够对在大型系统中发生的并发、选择、同步等性质进行建模,具体扩展的性质定义如下:
如果一个对象发送给另外多个对象的消息在执行上不存在因果联系,互不影响,则我们称这些消息的执行是并发(concurrence)的。
由于顺序图主要是用来表达用例中的某个场景,因此顺序图的画法和定义元素决定了顺序图无法表达对象之间的并发,但经过扩展,我们可以表达顺序图中存在的一种特殊形式的并发,
该并发关系在扩展顺序图中表示为在相应对象生命线右侧带有实端点的实线。只要由一个对象发布的消息位于该对象生命线右侧的并发线标记范围内,被标记为实端点,该消息就被认为是并发群(concurrency group)中的一员。并发群中的所有消息可以并发执行,且任何一个或多个消息的执行不会影响并发群中其他消息的执行。
对象 Object1
发给 Object2
的消息 Message1()
和发送给 Object3
的消息 Message2()
属于该对象的同一个消息并发群,即两个消息的执行没有因果关系,互不影响。
如果当且仅当其他多个对象发送给某个对象发送给某个对象的信息的执行都完成之后,该对象的后续动作才能执行,则这几个消息之间的关系称为同步关系(synchronization),且在该对象处同步。
同步关系在扩展顺序图中表示为与同步消息箭头对应的对象生命线另一侧带实心端点的虚线。到达某个对象的消息,只要位于该对象同步虚线标记范围内,被标记为实心端点,则这些消息均被认为是同步群(synchronization group)中的一员。某个对象的同步群中的消息只有全部到达该对象后,该对象才可以执行下一个动作(发送消息或进行操作方法的调用),同步群中只要有一个消息未到达,该对象也无法执行下一个动作,只能等待全部消息的到达。
Object2
执行调用 Message1()
的返回结果 Ack1
和 Object3
执行调用 Message2()
的返回结果 Ack2
属于对象 Object1
的同一个同步群,且该同步群中只有这两个返回消息,因此只有 Ack1
和 Ack2
两个消息都返回到 Object1
时,该对象的下一步动作才可以执行。
如果一个对象可以发送多个消息,但这些消息的发送执行是互斥的,即一个消息被发送执行后其他消息均不可以被发送执行,则这多个消息之间的关系被称为选择关系(choice)。
选择关系在扩展顺序图中表示为对象生命线右侧带空心端点的虚线。只要由一个对象发布的消息位于其生命线右侧的选择线标记范围内,被标记为虚端点,均被认为是选择群(choice group)中的一员。对象每次只能发送自己选择群中的一个消息,即每次选择群中有且只有一个消息能被触发执行,对象选择群中的消息彼此是互斥执行的。
对象 Object1
发送给对象 Object2
的调用信息 Message1()
和对象 Object1
发送给对象 Object3
的调用信息 Message2()
同属于 Object1
的选择群。即 Object1
要么选择发送调用消息 Message1()
,要么选择发送调用信息 Message2()
,但两个调用消息的发送执行是互斥的,不能同时都被调用发送。
在前面并发、同步、选择关系的定义及其表示的基础上,我们引申两种特殊关系在扩展顺序图中的定义以及表示方式。
在扩展顺序图中,如果选择群中所有的消息单独执行时都存在和某一个并发群中的消息并发执行,我们将这种关系称为选择并发关系(choice-concurrence)。
选择并发关系在扩展图中表示时既要体现正常的消息之间并发关系,还要表明并发群中存在选择关系,即具有选择关系的几个消息单独执行时和并发群中消息并发执行。表示时仍然是以带实端点的实线标记并发,不同的是存在选择关系的要在实端点上外加一个空心圆圈。
图中 Object1
发送给其余三个对象的消息均以实端点的实线所标注,其中发送给 Object2
和 Object3
的消息上实端点外还有空心圆圈表示选择关系。即 Object1
可以在 Object2
和 Object3
之间选择发送调用信息,即每次只能发送调用信息 Message1()
给 Object2
或者发送消息 Message2()
给 Object3
,但无论发送哪个调用信息,在发送的过程中 Object1
均可以并发发送信息 Message3
给 Object4
,因此三者之间是选择并发关系,按图中所示,既体现了 Object1
对 Object2
和 Object3
的选择关系,又表明 Object2
或者 Object3
单独执行调用消息时都和 Object4
执行消息 Message3
的过程并发。
在扩展顺序图中,如果选择群中的每个消息单独执行时,或者选择群中每个同步消息的返回消息单独返回时,都存在和某一个消息或某个同步群中消息的同步,则我们将这种关系称为选择同步关系(choice-sychronization)。
和选择并发关系不同,选择同步关系要在扩展顺序图中分别表示出选择关系中的每一个消息和同步消息之间的同步关系,表示方法和一般同步的表示相同,之所以要分别表示是因为同步之后的动作往往和进行的选择密切相关。一般有两种情况:
若某个对象的选择群中任一个消息或其中同步调用的返回消息和同步群中的消息同步之后该对象所进行的下一步动作相同,则表示时仅仅分开表示每一个选择消息或其返回消息与同步消息之间的同步关系即可。
在上图中,具有选择关系的两个同步调用 Message1()
和 Message2()
的返回消息 Ack1
和 Ack2
单独返回对象 Object1
时均存在与调用 Message3()
的返回消息 Ack3
之间的同步,即 Object1
发送消息 Message4
给 Object5
的前提是 Ack1
和 Ack3
均到达 Object1
或者是 Ack2
和 Ack3
两个消息均到达 Object1
.且在上图中无论是 Ack1
与 Ack3
同步还是 Ack2
与 Ack3
同步,同步之后的下一个操作均是 Object1
发送消息 Message4()
给对象 Object5
。
若根据选择的消息的不同,同步之后的下一步操作也有所不同,则在扩展顺序图中进行表示时,既要将每一组同步关系表示出来,还要将不同组同步后所对应的下一步动作范围分别表示出来,该范围中所有的动作必须与所选择的同步消息组紧密相关。同步之后的动作范围在扩展顺序图上表示时,是和相关同步组的同步线在一条垂直线上,以符号 [
将同步后的消息范围标记出来。
在上图中,Object1
发送给 Object2
的 Message1()
和发送给 Object3
的 Message2()
消息调用之间是选择关系,且调用执行后的返回消息 Ack1
和 Ack2
单独返回时都和 Object1
发送给 Object4
的消息调用 Message3()
的返回消息 Ack3
同步,但同步后分别对应不同的操作,即 Ack1
和 Ack3
同步后执行 Object1
对 Object2
的调用操作 Message4-1()
,进而 Object2
调用 Object5
的 Message4-2()
操作;而 Ack2
和 Ack3
同步后切执行 Object1
对 Object3
的调用 Message5-1()
,进而 Object3
调用 Object5
的 Message5-2()
操作。在图中同步后不同的操作范围均以 [
标出,而操作范围之所以不同是与前面的选择息息相关的。
这样,通过在传统顺序图上对关系进行进一步的定义,所得到的扩展顺序图除了具有传统顺序图的所有特点之外,还具有能够清晰描述并发、同步、选择等性质的功能,同时扩展后的顺序图能够代表多个传统的顺序图,如选择关系的描述,因而自身的描述能力大大增强。