UML历史及软件开发中常用的UML图

时间:2024-03-21 22:06:37

面向对象软件开发需要经过OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)三个阶段,其中OOA和OOD的分析和设计需要统一的符号来描述并记录,从而诞生了UML-统一建模语言。

UML历史简介

面向对象软件工程的概念由Booch提出,Booch也是面向对象方法最早的倡导者之一。Booch 1993表示法比较适用于系统的设计和构造。
Rumbaugh等人提出了面向对象的建模技术(OMT)方法,采用面向对象的概念,并引入各种独立于语言的表示符。用对象模型、动态模型、功能模型和用例模型共同完成对整个系统的建模,所定义的概念和符号可用于软件开发的全过程,软件开发人员不必在不同阶段进行概念和符号的转换。OMT-2适用于分析和描述数据为中心的信息系统。
1994年Jacobson提出了OOSE方法,其最大特点是面向用例,并在用例的描述中引入了外部角色的概念。OOSE适合支持商业工程和需求分析。
1996年10月,UML建模语言获得了700多个公司支持,到1996年年底,UML已稳占面向对象技术市场的85%,成为可视化建模语言事实上的工业标准。
1997年年底,OMG组织(Object Management Group,对象管理组织)采纳UML 1.1作为基于面向对象技术的标准建模语言,目前最新版本为UML 2.0,UML发展史如下图所示。
UML历史及软件开发中常用的UML图
图中UML 1.1和UML 2.0是UML历史上两个具有里程碑意义的版本,UML 1.1是OMG正式发布的第一个标准版本,UML 2.0是目前最成熟、稳定的UML版本。
UML图大致可分为静态图和动态图两种,UML 2.0的组成如下图。
UML历史及软件开发中常用的UML图
从上图可看出,UML 2.0共包含13种图形:活动图(activity diagram)、类图(class diagram)、通信图(communication diagram,对应于UML 1.x中的协作图)、组件图(component diagram)、复合结构图(composite structure diagram,UML 2.0新增)、部署图(deployment diagram)、交互概观图(interactive overview diagram,UML 2.0新增)、对象图(object diagram)、包图(package diagram)、顺序图(sequence diagram)、状态机图(state machine diagram)、定时图(timing diagram,UML 2.0新增)、用例图(use case diagram)。

常用UML

一个软件系统中要用13种图来表现分析、设计阶段的细节,让人看了就产生恐怖,而实际上并非如此,一个软件系统的分析、设计很少将13种图都用上。最常用的UML图包括用例图、类图、组件图、部署图、顺序图、活动图和状态机图等。

用例图

用例图用于描述系统提供的系统功能,每个用例代表系统的一个功能模块。用例图是以可视化方式展现系统的需求功能,不对系统的实现做说明,仅是功能的描述。
用例图的构成包括用例(功能描述,椭圆形状的图案,用例名称放在椭圆中心或下方)、角色(与系统交互的实体,人形符号)、角色和用例之间的关系、用例之间的关系。
用例图一般要表示出用例的组织关系–要么整个系统的全部用例,要么完整功能的一组用例。通常用于表达系统或者系统范畴的高级功能,主要在需求分析阶段使用,用于描述系统实现的功能,方便与客户交流,保证系统需求的无二性,需要注意的是不要将用例做得过多,以免导致难以阅读。

类图

类图表示系统中应该包含哪些实体,各实体之间如何关联,显示系统的静态结构,可用于表示逻辑类(逻辑类即业务人员所谈及的事物种类)。
类在类图中表示包含三个部分(构成一个大矩形):类的名称(矩形最上面)、类的属性(矩形中间)、类的方法(矩形最下方)。类图还可以表示出实体之间的关系,有三种基本关系:

  • 关联 使用一条实现来表示,带箭头的则表示方向
    • 方向性,包括单项关联(仅能从一个类单方向地访问另一个类)、双向关联(两个类可以互相访问对象)。
    • 多重性:一个对象能访问关联对象的数目
    • 特例:关联关系包含两种特例:聚合和组合,它们都有部分和整体的关系,但通常认为组合比聚合更加严格。当某个实体聚合成另一个实体时,该实体还可以同时是另一个实体的部分;当某个实体组合成另一个实体时,该实体则不能同时是一个实体的部分。聚合使用带空心菱形框的实线表示,组合则使用带实心菱形框的实线表示。聚合和组合的区别:聚合关系是“has-a”,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。举个例子来说明下,“国破家亡”,国灭了,家自然也就没了,“国”和“家”就是组合关系。相反的,计算机和计算机外设之间就是聚合关系,因为计算机没了,外设还是可以独立存在的,还可在其他计算机上使用。
  • 泛化:泛化与继承是同一个概念,都是指子类是一种特殊的父类,类与类之间的继承关系是非常普遍的,继承关系使用带空心三角形的实线表示。
  • 依赖:如果一个类的改动会导致另一个类的改动,则称这两个类之间存在依赖。依赖关系使用带箭头的虚线表示,其中箭头指向被依赖的实体。依赖的常见可能原因如下:
    • 改动的类将消息发给另一个类
    • 改动的类以另一个类作为数据部分
    • 改动的类以另一个类作为操作参数

组件图

组件图提供系统的物理视图,其用途是显示系统中的软件对其他软件组件的依赖关系,可以在一个非常高的层次上显示,仅显示系统中粗粒度的组件,也可以在组件包层次上显示。
组件图通常包含组件、接口和Port等图元,UML使用带有UML历史及软件开发中常用的UML图符号的矩形来表示组件,使用圆圈代表接口,使用位于组件边界上的小矩形代表Port。组件的接口表示它能对外提供的服务规范,这个接口通常有两种表现形式:
- 用一条实线连接到组件边界的圆圈表示
- 使用位于组件内部的圆圈表示
组件除了可以对外提供服务接口之外,还可能依赖于某个接口,组件依赖于某个接口使用一条带半圆的实线来表示。

部署图

部署图用于描述软件系统如何部署到硬件环境中,其用途是显示软件系统不同的组件将在何处物理运行,以及它们将如何彼此通信。
因为部署图是对物理运行情况进行建模,所以系统的生产人员就可以很好地利用这种图来安装、部署软件系统。部署图中的符号包括组件图中所使用的符号元素,还增加了节点的概念:节点是各种计算资源的通用名称,主要包括处理器和设备两种类型,两者的区别是处理器能执行程序的硬件构件,而设备是一种不具备计算能力的硬件构件。UML中使用三维立方体来表示节点,节点的名称位于立方体的顶部。

顺序图

顺序图显示具体用例的详细流程,并且显示流程中不同对象之间的调用关系,同时还可以很详细的显示对不同对象的不同调用。顺序图描述了对象之间的交互,重点在于描述消息及其时间顺序。
顺序图有两个维度
- 垂直维度:以发生的事件顺序显示消息/调用的顺序;
- 水平维度:显示消息被发送到的对象实例。
顺序图的关键在于对象之间的消息,对象之间的信息传递就是所谓的消息发送,消息通常表现为对象调用另一个对象的方法或方法的返回值,发送者和接收者之间的箭头表示消息。
顺序图的绘制:顺序图的顶部每个框表示每个类的实例,框中的类实例名称和类名称之间用冒号或空格来分隔。如果某个类实例名向另一个类实例发送一条消息,则用一条指向接收类实例的带箭头的连线,并把消息/方法的名称放在连线上面。对于某些特别重要的消息,可绘制一条带箭头的指向发起类实例的虚线将返回值标注在虚线上。
顺序图主要是帮助开发者对某个用例的内部执行清晰化,当需要考察某个用例内部若干对象行为时,应使用顺序图,顺序图擅长表现对象之间的协作顺序,不擅长表现行为的精确定义。

活动图

活动图和状态机图都被称为演化图,其区别和联系如下:
- 活动图:用于描述用例内部的活动或方法的流程,如果出去活动图中的并行活动描述,它就变成流程图。
- 状态机图:描述某一对象生命周期中需要关注的不同状态,并会详细描述刺激对象状态改变的事件,以及对象状态改变时所采取的动作。
演化图的5要素:
1. 状态:状态是对象响应事件前后的不同面貌,状态是某个时间段对象所保持的稳定态,目前的软件计算都是基于稳定态的,对象的稳定态是对象的固有特征,一个对象的状态一般都是有限的。有限状态的对象是容易计算的,对象的状态越多,对象的状态迁移越复杂,对象状态可以想象成对象演化过程中的快照。
2. 事件:来自对象外界的刺激,通常的形式是消息的传递,只是相对对象而言发生了事件。事件是对象状态发生改变的原动力。
3. 动作:动作是对象针对所发生事件所做的处理,实际上通常表现为某个方法被执行。
4. 活动:活动是动作激发的后续系统行为。
5. 条件:条件指事件发生所需要具备的条件。
对于技法对象状态改变的事件,通常有两种类型:
- 内部事件:从系统内部激发的事件,一个对象的方法(动作)调用另一个对象的方法(动作)。
- 外部事件:从系统边界激发的事件。
活动图主要用于描述过程原理、业务逻辑以及工作流技术,活动图类似于传统流程图,使用圆角矩形表示活动,使用带箭头的实现表示事件,使用菱形框表示条件;区别是活动图支持并发。一个活动图中只可有一个开始活动,但可有多个结束活动。活动图最大优点在于支持并行行为,对工作流建模和过程建模非常重要,并行行为需要通过汇合来指明需要进行同步。

状态机图

状态机图表示某个对象所处的不同状态和该类的状态转换信息。状态机图符号集的5个基本元素:
1. 初始状态,使用实心圆来绘制
2. 状态之间的转换,使用具有带箭头的线段来绘制
3. 状态,使用圆角矩形来绘制
4. 判断点,使用空心圆来绘制
5. 一个或多个终止点,使用内部包含实心圆的圆来绘制
绘制状态机图时应保证对象只有一个初始状态,可以有多个终结状态。状态要表示对象的关键快照,有重要的实际意义,无关紧要的状态无需考虑,要明确事件和方法。状态机图擅长表现单个对象的跨用例行为,对多个对象的交互行为应考虑用顺序图,不要对系统每个对象都画状态机图,只需画关心的状态。

注:内容摘自李刚的《疯狂Java讲义 第2版》