本节和大家一起学习一下UML类图,主要包括UML2中的类图,大体上的结构图,类的属性列表等内容。相信通过本文的你对UML类图一定会有深刻的认识。
UML类图详解
这是关于统一建模语言、即UML里采用的基本图的文章。在这篇文章中,我将会讨论结构图,这是已经在UML2中提出的一种新图种类。由于本系列文章的目的是使人们了解记号元素及它们的含意,该文主要关注类图。你很快就会知道这样做的理由。随后的文章将会覆盖结构范畴中包含的其它图。
我也想提醒读者,这一系列文章是关于UML记号元素的,所以这些文章并不意味着为建模的最好方式提供指导方针,或是该如何决定哪些内容应该首先被建模。相反的,该文及本系列文章的目的主要是帮助大家对于记号元素--语法和含义有一个基本的理解。借由这些知识,你应该可以阅读图,并使用正确的记号元素创建你自己的图。
这篇文章假定你对面向对象的设计已经有了基本的理解。你们当中如果有人需要一些面向对象概念的帮助,那么可以访问http://java.sun.com/docs/books/tutorial/java/concepts/,来获得Sun公司关于面向对象编程的简短指导。阅读“什么是类?”和什么是继承?”章节,将提供给你足够的理解,并对该文的阅读会有所帮助。另外,DavidTaylor的书《Object-OrientedTechnologies:AManager'sGuide》提供了面向对象设计的优秀,高水平的说明,而无需对计算机编程有高深的理解。
UML2中的阴和阳
在UML2中有二种基本的图范畴:结构图和行为图。每个UML图都属于这二个图范畴。结构图的目的是显示建模系统的静态结构。它们包括UML类图,组件和(或)对象图。另一方面,行为图显示系统中的对象的动态行为,包括如对象的方法,协作和活动之类的内容。行为图的实例是活动图,用例图和序列图。
大体上的结构图
如同我所说的,结构图显示建模系统的静态结构。关注系统的元件,无需考虑时间。在系统内,静态结构通过显示类型和它们的实例进行传播。除了显示系统类型和它们的实例,结构图至少也显示了这些元素间的一些关系,可能的话,甚至也显示它们的内部结构。
贯穿整个软件生命周期,结构图对于各种团队成员都是有用的。一般而言,这些图支持设计验证,和个体与团队间的设计交流。举例来说,业务分析师可以使用类或对象图,来为当前的资产和资源建模,例如分类账,产品或地理层次。架构师可以使用组件和部署图,来测试/确认他们的设计是否充分。开发者可以使用类图,来设计并为系统的代码(或即将成为代码的)类写文档。
特殊的类图
UML2把结构图看成一个分类;这里并不存在称为“结构图”的图。然而,类图提供结构图类型的一个主要实例,并为我们提供一组记号元素的初始集,供所有其它结构图使用。由于类图是如此基本,本文的剩余部分将会把重点集中在类图记号集。在本文的结尾,你将对于如何画UML2类图有所了解,而且对于理解在后面文章中将涉及的其他结构图有一个稳固的基础。
基础
如先前所提到的,类图的目的是显示建模系统的类型。在大多数的UML模型中这些类型包括:
类
接口
数据类型
组件
UML为这些类型起了一个特别的名字:“分类器”。通常地,你可以把分类器当做类,但在技术上,分类器是更为普遍的术语,它还是引用上面的其它三种类型为好。
类名
UML类图的UML表示是一个长方形,垂直地分为三个区,如图1所示。顶部区域显示类的名字。中间的区域列出类的属性。底部的区域列出类的操作。当在一个类图上画一个类元素时,你必须要有顶端的区域,下面的二个区域是可选择的(当图描述仅仅用于显示分类器间关系的高层细节时,下面的两个区域是不必要的)。图1显示一个航线班机如何作为UML类建模。正如我们所能见到的,名字是Flight,我们可以在中间区域看到Flight类的3个属性:flightNumber,departureTime和flightDuration。在底部区域中我们可以看到Flight类有两个操作:delayFlight和getArrivalTime。
图1:Flight类的类图
类属性列表
UML类图的属性节(中部区域)在分隔线上列出每一个类的属性。属性节是可选择的,要是一用它,就包含类的列表显示的每个属性。该线用如下格式:
name:attributetype
flightNumber:Integer
继续我们的Flight类的例子,我们可以使用属性类型信息来描述类的属性,如表1所示。
表1:具有关联类型的Flight类的属性名字
#p#
在业务类图中,属性类型通常与单位相符,这对于图的可能读者是有意义的(例如,分钟,美元,等等)。然而,用于生成代码的类图,要求类的属性类型必须限制在由程序语言提供的类型之中,或包含于在系统中实现的、模型的类型之中。
在UML类图上显示具有默认值的特定属性,有时是有用的(例如,在银行账户应用程序中,一个新的银行账户会以零为初始值)。UML规范允许在属性列表节中,通过使用如下的记号作为默认值的标识:
name:attributetype=defaultvalue
举例来说:balance:Dollars=0
显示属性默认值是可选择的;图2显示一个银行账户类具有一个名为balance的类型,它的默认值为0。
图2:显示默认为0美元的balance属性值的银行账户UML类图。
类操作记录在类图长方形的第三个(最低的)区域中,它也是可选择的。和属性一样,类的操作以列表格式显示,每个操作在它自己线上。操作使用下列记号表现:
name(parameterlist):typeofvaluereturned
下面的表2中Flight类操作的映射。
表2:从图2映射的Flight类的操作
图3显示,delayFlight操作有一个Minutes类型的输入参数--numberOfMinutes。然而,delayFlight操作没有返回值。1当一个操作有参数时,参数被放在操作的括号内;每个参数都使用这样的格式:“参数名:参数类型”。
图3:Flight类操作参数,包括可选择的“in”标识。
当文档化操作参数时,你可能使用一个可选择的指示器,以显示参数到操作的输入参数、或输出参数。这个可选择的指示器以“in”或“out”出现,如图3中的操作区域所示。一般来说,除非将使用一种早期的程序编程语言,如Fortran,这些指示器可能会有所帮助,否则它们是不必要的。然而,在C++和Java中,所有的参数是“in”参数,而且按照UML规范,既然“in”是参数的默认类型,大多数人将会遗漏输入/输出指示器。
【编辑推荐】