软件工程之统一建模语言UML
UML概述
UML的主要内容
1、作为一种建模语言,UML 的定义包括 UML 语义和 UML 表示法两个部分。
2、统一建模语言(UML)是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。它记录了对必须构造的系统的决定和理解,可用于对系统的理解、设计、浏览、配置、维护和信息控制。
3、UML 适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具,是一种总结了以往建模技术的经验并吸收当今优秀成果的标准建模方法。
4、UML 包括概念的语义、表示法和说明,提供了静态、动态、系统环境及组织结构的模型。它可被交互的可视化建模工具所支持,这些工具提供了代码生成器和报表生成器。
5、UML 标准并没有定义一种标准的开发过程,但它适用于迭代式的开发过程。它是为支持大部分现存的面向对象开发过程而设计的
6、UML 描述了一个系统的静态结构和动态行为。UML 将系统描述为一些离散的相互作用的对象并最终为外部用户提供一定的功能的模型结构。静态结构定义了系统中的重要对象的属性和操作以及这些对象之间的相互关系。动态行为定义了对象的时间特性和对象为完成目标而相互进行通信的机制。
7、UML还包括可将模型分解成包的结构成分,以便于软件小组将大的系统分解成易于处理的块结构,并理解和控制各个包之间的依赖关系,在复杂的开发环境中管理模型单元。它还包括用于显示系统实现和组织运行的成分。
8、UML不是一门程序设计语言,但可以使用代码生成器工具将 UML 模型转换为多种程序设计语言代码,或使用反向生成器工具将程序源代码转换为UML。
9、UML提供了两大类,共 9 种图形支持建模,其分类和各个图形的作用如下所示。
UML的主要特点
1. 统一的建模语言
UML 语言吸取面向对象及一些非面向对象方法的思想。它使用统一的元素及表示符号,为用户提供无二义性的设计模型交流方法。
2. 支持面向对象
UML 支持面向对象思想的主要概念,并提供了能够简洁明了地表示这些概念及其关系的图形元素。
3. 支持可视化建模
UML 是一种图形化语言,它自然地支持可视化建模。此外 UML 还支持扩展机制,用户可以通过它的自定义建模元素的各种属性。
4. 强大的表达能力
UML 在演进的过程中提出了一些新概念,如模板、进程、线程、并发和模式等。这些概念有效地支持了各种抽象领域和系统内核机制的建模。UML 强大的表达能力使它可以对各种类型的软件系统建模,甚至于商业领域的业务过程。
UML静态建模机制
任何建模语言都以静态建模机制为基础。UML 的静态建模机制包括用例图、类图、对象图、构件图和配置图等,使用它们建立系统的静态结构。
用例图
用例视图也称用例模型,用例模型描述的是外部执行者(actor)所理解的系统功能。用例模型用于需求分析阶段,它的建立是系统开发者和用户反复讨论的结果,表明了开发者和用户对需求规格达成的共识。在 UML中,一个用例模型由若干个用例图描述,用例图中显示执行者、用例和用例之间的关系。用例图包含系统、执行者和用例 3 种模型元素。
1.系统
系统是用例模型的一个组成部分,代表的是一部机器或一个业务活动,而不是真正实现的软件系统。系统的边界用来说明构建的用例模型的应用范围。
一般的做法是,先识别出系统的基本功能,然后以此为基础定义一个稳定的、精确定义的系统架构,以后再不断地扩充系统功能,逐步完善。
2.用例
用例代表的是一个完整的功能,用例是动作序列的集合,系统执行该动作序列来为执行者产生一个可观察的结果。动作是系统的一次执行。从本质上讲,一个用例是用户与计算机之间的一次典型交互作用。在 UML中, 用例被定义成系统执行的一系列动作,动作执行的结果能被指定执行者察觉到。
在 UML 中,用例表示为一个椭圆。方框表示系统边界,小人状图案表示执行者。
用例和执行者之间也有连接关系,它们直接的关系属于关联(association),又称通信关联,这种关联表示哪种执行者能与该用例通信。关联关系是双向的多对多关系,一个执行者可以与多个用例通信,一个用例也可以与多个执行者通信。
概括地说,用例有以下特点:
(1)、用例总由执行者初始化。用例所代表的功能必须由执行者**,而后才能执行。一般情况下执行者可能并没有意识到初始化了一个用例。换句话说,执行者需要系统完成的功能都是通过用例完成的,执行者一定会直接或间接地命令系统执行用例。
(2)、用例为执行者提供值。用例必须为执行者提供实在的值,虽然这个值并不总是重要的,但是能被执行者识别。
(3)、用例具有完全性。用例是一个完整的描述。用例可大可小,但它必须是对一个具体的用户目标实现的完整描述。
3. 执行者
执行者是指用户在系统中所扮演的角色,是与系统交互的人或事。其图形化的表示是一个小人状图案。
执行者是一个群体概念,代表的是一类能使用某个功能的人或事,而不是指某个个体。
执行者可以分为主要执行者和次要执行者。主要执行者指的是执行系统主要功能的执行者,次要执行者指的是使用系统次要功能的执行者,次要功能是指完成维护系统的一般功能,如管理数据库、通信备份等。将执行者分级的目的是,保证把系统的所有功能表示出来。
类图和对象图
在面向对象建模技术中,我们使用同样的方法将客观世界的实体映射为对象,并归纳成一个个类。类(Class)、对象(Object)和它们之间的关联是面向对象技术中最基本的元素。对于一个想要描述的系统,其类模型和对象模型揭示了系统的结构。在 UML 中,类和对象模型分别由类图和对象图表示。类图技术是面向对象方法的核心。
1.类图
类图(class diagram)描述类和类之间的静态关系。与数据模型不同,它不仅显示了信息的结构,同时还描述了系统的行为。类图是定义其他图的基础。在类图的基础上,状态图、交互图等进一步描述了系统其他方面的特性。
(1)、 类的获取和命名
类的命名应尽量用应用领域中的术语,应明确、无歧义,以利于开发人员与用户之间的相互理解和交流。类的获取是一个依赖于人的创造力的过程,必须与领域专家合作,对研究领域进行仔细的分析,抽象出领域中的概念,定义其含义及相互关系,分析出系统类,并用领域中的术语为类命名。一般而言,类的名字是名词。
(2)、类的属性
类的属性用以描述该类对象的共同特点,该项可省略。了解属性时应该考虑以下因素:
①.属性表示关于对象的信息,原则上来说,类的属性应能描述并区分每个特定的对象;
②.只有系统感兴趣的特征才包含在类的属性中;
③.系统建模的目的也会影响到属性的选取。
(3)、类的操作(Operation)
操作是一个服务的实现,是对一个对象做什么事情的抽象。一个类可以有任意数目的
操作,也可以没有操作。
2.关联关系
(1)、关联
关联(association)表示两个类之间存在某种语义上的联系。关联可以有方向,表示该关联单方向被使用。关联上加上箭头表示方向,在 UML 中称为导航(navigability)。我们将只在一个方向上存在导航表示的关联,称作单向关联。
UML 规定,不带箭头的关联可以意味着未知、未确定或者该关联是双向关联三种选择,因此,在图中应明确使用其中的一种选择。关联关系一般都是双向的,即关联的对象双方彼此都能与对方通信。根据不同的含义,关联可以分为普通关联、递归关联、限定关联、或关联、有序关联、三元关联和聚合 7 种。
(2)、关联的角色
关联两头的类以某种角色参与关联。如果在关联上没有标出角色名,则隐含地用类的名称作为角色名。角色还具有多重性(Multiplicity),表示可以有多少个对象参与该关联。
(3)、关联类
在有些问题中,关联关系不仅需要一个名称、需要定义相关对象的角色及其参与这些角色的对象数量,而且还需要设置一些属性、操作以及其他特征。关联可能要记录一些信息,因此引入一个关联类来记录,也就是说,与一个关联关系相连的类称作关联类。关联类并不位于表示关联关系的直线两端,而是对应一个实际的关联,用关联类表示该实际关联的一些附加信息。关联类通过一根虚线与关联连接。
(4)、整体/部分关联
UML 对于整体/部分关联有特殊的表示法:组成和聚集。
组成(composition)关联表示整体拥有各部分,部分与整体共存,如整体不存在了,部分也会随之消失。“整体”称作组成对象,“部分”称作成分对象。
聚集(Aggregation)是一种特殊形式的关联。聚集也表示类之间的整体/部分关联,但主要强调组/成员的关联。整体被称作聚集对象,部分称作构成对象。
①.构成对象不存在,聚集对象还可以存在。
②. 在任何时候,每个对象都可以是多个聚集的构成。
③. 聚集往往是同构的,也就是,典型的聚集的构成对象将属于同一个类。
3.泛化关系
一个类(一般元素)的所有特征(属性或操作)能被另一个类(特殊元素)继承。也称泛化。泛化定义了一般元素和特殊元素之间的关系。在 UML 中, 泛化表示为一头为空心三角形的连线。UML 对定义泛化关系有下述有三个要求:
(1)、特殊元素应与一般元素完全一致,一般元素所具有的关联、属性和操作,特殊元素也都隐含性地具有。
(2)、特殊元素还应包含额外信息。
(3)、允许使用一般元素实例的地方,也应能使用特殊元素。
4.对象图
UML 中对象图与类图具有相同的表示形式。对象图可以看作是类图的一个实例。对象是类的实例,对象之间的链(link)是类之间的关联的实例。对象的图示方法与类的图示方法几乎一样,主要差别在于对象的名字下面要加下画线。链的图形表示与关联相似。对象图常用于表示复杂的类图的一个实例。
对象名有下列三种表示格式:(1)对象名:类名。(2):类名。(3)对象名。
包
在 UML 中将各种各样的模型元素通过内在的语义关系连在一起,形成一个高内聚、低耦合的整体就叫包(package)。包中所有的元素都是包的内容。通常可以把系统划分为不同的主题层或子系统,属于同一个主题层的元素放在一个包中,主题层之间的依赖关系表现为包的依赖关系。
如下图所示是一个典型的面向对象的应用系统。将其划分为3个主题。界面层、应用逻辑层和对象持久层。
1、界面层包中放置窗体或者表单类,
2、应用逻辑层包中放置系统业务对象类,
3、对象持久化层包中放置负责对象的具体化和非具体化的类。
包之间的依赖关系用带箭头的虚线表示。
构件图
构件图(component diagram)显示了软件构件及它们之间的依赖关系。利用构件图可以对系统静态实现视图进行建模,这将包括对存在于每一个节点上的物理事物的建模,如可执行体、库、表、文件及文档等。构件图实质上是针对系统构件的类图。
构件图通常包括构件、接口和依赖、泛化等关系,也可以包括包或子系统。
构件是系统中遵从一组接口且提供其实现的物理的、可替代的部分。构件的图形表示法是把构件画成带有两个标签的矩形,构件在许多方面和类相同:二者都有名字,都可以实现一组接口,都可以参与依赖、泛化和关联关系;都可以有实例;都可以参与交互。但是构件和类之间也有一些显著的差别。
1、类表示逻辑抽象,而构件表示存在于计算机世界中的物理抽象。构件可以存在于节点之上,而类不可以。
2、构件表示的是物理模块,与类处于不同的抽象级别。
3、类可以直接拥有属性和操作;一般情况下,构件只能通过其接口访问的操作。构件图用于对系统的静态实现视图建模。这种视图主要支持系统部件的配置管理,它是由可以用各种方式进行组装以产生可执行系统的构件组成。
在对系统静态实现视图建模时,通常按下列 4 种方式之一使用构件图。
1、对源代码建模
采用当前大多数面向对象程序设计语言,使用集成化开发环境来分割代码,并将源代码存储到文件中。可以使用构件图为这些文件的配置管理建模。这些文件代表了产品的构件。
2、对可执行体的发布建模
软件的发布是交付给内部或外部用户的相对完整而且一致的产品系列。在构件语境中,一个发布注重交付一个运行系统所必需的部分。当用构件图发布建模时,其实是对构成软件的物理部分所作的决策进行可视化、详细化和文档化。
3、对物理数据库建模
可以把物理数据库看作模式在计算机世界中的具体实现。实际上模式提供了对永久信息的应用程序编程接口;物理数据库模型表示了这些信息在关系数据库的表中或者在面向对象数据库的页中的存储。可用构件图表示这些以及其他种类的数据库。
4、对可调整的系统建模
某些系统是相对静止的;其组件进入现场,参与执行,然后离开。另一些系统则是较为动态的,其中包括一些活动代理者为了负载均衡和故障恢复而进行迁移的组件。
配置图
配置图用于整个系统的物理配置建模,如系统在网络上的布局、构件在网络上的位置、网络性能和并发用户数目等情况,一个系统只有一个配置图。
在 UML 中,配置图包含 3 个元素:处理器(processor)、设备和连接。
①.处理器指的是具有计算机功能的硬件,在处理器中可以运行各种程序或进程,如工作站或各种服务器。
②.设备指的是不具备计算能力的硬件,如 Modem、打印机或各种终端。
③.连接指的是处理器之间、设备之间或处理器之间的物理上的实际连接。
如下图所示为一个典型的基于 3 层架构的财务系统的物理配置图。从图中可以看出,系统主要由数据库服务器、应用服务器和各应用客户端组成。它们之间用网线连接,系统配置在小型局域网上。应用服务器在系统中除了在数据库服务器和客户端之间起到承上启下的作用外,还提供打印服务。
UML动态建模机制
UML 动态模型包括状态模型、顺序模型、协作模型和活动模型,通常以状态图、顺序图、协作图和活动图来表示。其中,顺序图和协作图通常合起来称为交互图。状态模型关注一个对象的生命周期内的状态及状态变迁,以及引起状态变迁的事件和对象在状态中的动作等。顺序模型和协作模型强调对象间的合作关系,通过对象间的消息传递以完成系统的用例。活动图用于描述多个对象在交互时采取的活动,它关注对象如何相互活动以完成一个事务。
消息
在面向对象技术中, 对象间的交互是通过对象间消息的传递来完成的。通常,当一个对象调用另一个对象中的操作时,即完成了一次消息传递。当操作执行后,控制便返回到调用者。对象通过相互间的通信(消息传递)进行合作,并在其生命周期中根据通信的结果不断改变自身的状态。
在 UML 中,消息的图形表示是用带有箭头的线段将消息的发送者和接收者联系起来,箭头的类型表示消息的类型,如图所示。
UML定义的消息类型有三种:
(1)、简单消息(simple message)表示简单的控制流。用于描述控制如何在对象间进行传递,而不考虑通信的细节。
(2)、同步消息(synchronous message)表示嵌套的控制流。操作的调用是一种典型的同步消息。调用者发出消息后必须等待消息返回,只有当处理消息的操作执行完毕后,调用者才可继续执行自己的操作。
(3)、异步消息(asynchronous message)表示异步控制流。当调用者发出消息后不用等待消息的返回即可继续执行自己的操作。异步消息主要用于描述实时系统中的并发行为。
顺序图
顺序图用来描述对象之间动态的交互关系,着重体现对象间消息传递的时间顺序。顺序图存在两个轴:水平轴表示不同的对象,垂直轴表示时间。在顺序图中,对象用一个带有垂直虚线的矩形框表示,在矩形框内标有对象名和类名。
在面向对象程序设计中,总体的控制流程往往是难以理解的。一个好的设计应当将很多小方法放入不同的类中,并且随时能巧妙地指出总体的行为顺序,这样可以十分有效地帮助你加速了解代码。对于首次接触面向对象程序设计的人来说尤其是如此,顺序图可以帮助你看清行为的次序。
协作图
协作图是交互图的第二种形式。协作图也是用来描述对象与对象之间的消息连接关系的,但是它更侧重于说明哪些对象之间有消息传递,而不像顺序图那样侧重于在某种特定的情形下对象之间传递消息的时序性。在协作图中,对象同样是用一个对象图符号来表示,箭头表示消息发送的方向,而消息的执行顺序则由消息的编号来标明。
状态图
状态图(State Diagram)用来描述一个特定对象的所有可能状态及其引起状态转移的事件。大多数面向对象技术都用状态图表示单个对象在其生命周期中的行为。一个状态图包括一系列的状态以及状态之间的转移。
状态图适合于描述跨越多个用例的单个对象的行为,而不适合于描述多个对象之间的行为协作。
活动图
活动图显示动作及其结果,着重描述操作实现中所完成的工作以及用例实例或对象中的活动。活动图是状态图的一个变种,与状态图的目的有一些小的差别。
活动图的主要目的是描述动作(执行的工作或活动)以及对象状态改变的结果。
活动图可以用作下列目的:
(1)、描述成操作执行过程中(操作实现的实例化)所完成的工作(动作),这是活动图最常用的用途。
(2)、 描述对象内部工作。
(3)、显示如何执行一组相关的动作,以及这些动作如何影响它们周围的对象。
(4)、显示用例的实例是如何执行动作以及改变对象状态的。