UML基础、建模与设计实战(txt+pdf+epub+mobi电子书下载)


发布时间:2021-08-04 23:06:14

点击下载

作者:杨弘平等

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

UML基础、建模与设计实战

UML基础、建模与设计实战试读:

前言

软件的发展至今已经有近60年的历史。面向对象技术开始被深入研究并广泛予以应用也有近40年了,已经成为软件开发中分析、设计、实现的主流方法和技术。40年来,在面向对象技术发展的同时,面向对象技术的各种软件设计工具、规范等也获得了较大发展。其中,最重要的一个面向对象的建模技术的成果就是统一建模语言(Unified Modeling Language, UML)的出现。

UML的创建首先开始于1994年10月,由Grady Booch、Jim Rumbaugh和Ivar Jacobson共同开发,并于1996年发布了UML版本0.9。随后,公司联合行动,由十多家公司组成UML伙伴组织,共同提出了UML 1.0和1.1,于1997年11月17日对象管理组织(OMG)开始采纳UML作为其标准建模语言。第三阶段的修订是由OMG主导并控制完成了UML 1.2、1.3、1.4和1.5等版本。本世纪开始以来的修订,推出了UML 2.0版本,并最终统一为大众所接受的标准建模语言。

本书共由13章的内容组成。

入门基础(第1~3章):着重介绍UML的预备知识,包括面向对象概述、UML概述及UML开发工具。

图(第4~8章):着重介绍UML的各种图,包括用例图、类图、对象图、序列图、协作图、状态图、活动图、组件图与部署图等。对UML图的介绍方式分为图的基本概念、图的组成、图的建模技术和创建示例,在介绍过程中主要以图书管理系统为例进行,通过这种方式能够使读者完整而系统地把握和了解每一种UML图。

统一软件过程RUP(第9章):着重介绍RUP过程开发模型,通过介绍这一通用过程框架,让读者进一步掌握和熟悉软件开发的过程。

案例(第10~13章):着重介绍4个案例,即汽车租赁系统、BBS系统、新闻管理系统和数码录音机系统。通过这4个案例全面而系统地对使用UML进行建模给予了说明。

不管你是从事面向对象软件开发的开发人员,还是希望通过学习UML帮助自己建模的人员,本书都能够帮助你全面了解UML的基本概念和建模方法,本书同样也可作为高等院校计算机软件工程相关专业的教学用书或参考书。

本书实例工程文件和课件可以到http://download.csdn.net/detail/brucexia/4444244页面下载。如果下载有问题,请发邮件给booksaga@163.com,邮件标题为“求代码,UML基础、建模与设计实战”。

本书由杨弘平、吕海华、李波和史江萍编写。其中,第1章、第2章、第4章、第5章和第12章和第13章由吕海华完成;第3章、第6章、第11章由史江萍完成;第7章和第8章由杨弘平完成;第9章和第10章由李波完成。感谢朱克敌、朱德林、曾祥萍、代钦、孙宪丽、关颖、祝世东、衣云龙等在本书编写过程中给予的无私帮助,编者对此致以诚挚的谢意。

由于编者水平有限,书中难免有疏漏之处,敬请读者谅解。编者2012年6月第1章 UML概述

本章导读

UML的目标是以面向对象图形的方式来描述任何类型的系统,其应用领域非常广泛。其中最常用的是建立软件系统的模型,但它同样可以用于描述非软件领域的系统,如机械系统、企业机构或业务过程,以及处理复杂数据的信息系统、具有实时要求的工业系统或工业过程等。总之,UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行建模。

本章要点

本章是关于UML的总体概述,仅对UML元素做一些简单的说明,在后续的章节中将深入和详细地讲解其内容。通过学习本章,你将了解UML的发展历程和特点,并理解什么是UML、UML中的9种图和UML中的关系。1.1 什么是UML

UML(Unified Modeling Language,统一建模语言),是一种能够描述问题、描述解决方案、起到沟通作用的语言。通俗地说,它是一种用文本、图形和符号的集合来描述现实生活中各类事物、活动及其之间关系的语言。

UML是一种很好的工具,可以贯穿软件开发周期中的每一个阶段,它最适于数据建模、业务建模、对象建模和组件建模。作为一种模型语言,UML使开发人员专注于建立产品的模型和结构,而不是选用什么程序语言和算法实现。当模型建立之后,该模型可以被UML工具转化成指定的程序语言代码。1.2 UML的发展历程

UML起源于多种面向对象建模方法,它由OMG开发,目前已经成为工业标准。面向对象建模语言最早出现于20世纪70年代中期。从1989年到1994年,其数量从不到十种增加到了五十多种。在众多的建模语言中,语言的创造者努力推崇自己的产品,并在实践中不断完善。但是,OO方法的用户并不了解不同建模语言的优缺点及相互之间的差异,因而很难根据应用特点选择合适的建模语言,于是爆发了一场“方法大战”。90年代中期出现了一批新方法,其中最引人注目的是Booch 1993、OMT-2和OOSE。

面向对象软件工程的概念最早是由Booch提出的,他是面向对象方法最早的倡导者之一。后来,Rumbaugh等人提出了面向对象的建模技术(OMT)方法,该方法采用了面向对象的概念并引入各种独立于语言的表示符。这种方法用对象模型、动态模型、功能模型和用例模型共同完成对整个系统的建模,它所定义的概念和符号可用于软件开发的分析、设计和实现的全过程,软件开发人员在开发过程的不同阶段不需要进行概念和符号的转换。OMT-2特别适用于分析和描述以数据为中心的信息系统。

Jacobson于1994年提出了OOSE方法,其最大特点是面向用例(Use-Case),并在用例的描述中引入了外部角色的概念。用例的概念是精确描述需求的重要武器,但用例需要贯穿于整个开发过程,包括对系统的测试和验证,因此OOSE比较适合支持商业工程和需求分析。

此外,还有Coad/Yourdon方法,即著名的OOA/OOD,它是最早的面向对象的分析和设计方法之一。该方法简单易学,适合面向对象技术的初学者使用,但由于该方法在处理能力方面具有局限性,目前用得很少。

综上所述,首先,面对众多的建模语言,由于用户没有能力区别不同语言之间的差别,因此很难找到一种比较适合其应用特点的语言;其次,众多的建模语言实际上各有特色;第三,虽然不同的建模语言大多类似,但仍存在某些细微的差别,这极大地妨碍了用户之间的交流。因此,需要统一建模语言。

1994年10月,Grady Booch和Jim Rumbaugh开始致力于这一工作。他们首先将Booch 1993和OMT-2统一起来,并于1995年10月发布了第一个公开版本,称之为统一方法UM 0.8(Unitied Method)。1995年秋,OOSE的创始人Jacobson参与到这一工作中来。经过Booch、Rumbaugh和Jacobson三人的共同努力,于1996年6月和10月分别发布了两个新的版本,即UML 0.9和UML 0.91,并将UM重新命名为UML(Unified Modeling Language)。

1996年,UML的开发者倡议成立了UML成员协会,以完善、加强和促进UML的定义工作。当时的成员有DEC、HP、I-Logix、Intellicorp、IBM、ICON Computing、MCI Systemhouse、Microsoft、Oracle、Rational Software、TI和Unisys。这一机构对UML 1.0(1997年1月)及UML 1.1(1997年11月17日)的定义和发布起了重要的促进作用。

在美国,截止1996年10月,UML获得了工业界、科技界和应用界的广泛支持,已有700多个公司表示支持采用UML作为建模语言。1996年底,UML已稳占面向对象技术市场的85%,成为可视化建模语言事实上的工业标准。1997年11月17日,OMG采纳UML 1.1作为基于面向对象技术的标准建模语言。UML代表了面向对象方法的软件开发技术的发展方向,具有巨大的市场前景,也具有重大的经济价值和国防价值。1.3 UML的特点

可以将标准建模语言UML的主要特点归结为3点:(1)UML统一了Booch、OMT和OOSE等方法中的基本概念和符号。(2)UML吸取了面向对象领域中各种优秀的思想,其中也包括非OO方法的思想。

UML符号表示考虑了各种方法的图形表示,删掉了很多容易引起混乱的、多余的和极少使用的符号,同时添加了一些新符号。因此,UML凝聚了面向对象领域中很多人的思想。这些思想并不是UML的开发者们发明的,而是开发者们依据最优秀的OO方法和丰富的计算机科学实践经验综合提炼而成的。(3)UML在演变过程中还提出了一些新的概念。

在UML标准中增加了模板(Stereotypes)、职责(Responsibilities)、扩展机制(Extensibility Mechanisms)、线程(Threads)、过程(Processes)、分布式(Distribution)、并发(Concurrency)、模式(Patterns)、合作(Collaborations)、活动图(Activity Diagram)等新概念,并清晰地区分了类型(Type)、类(Class)和实例(Instance)、细化(Refinement)、接口(Interfaces)和组件(Components)等概念。

因此,可以认为UML是一种先进实用的标准建模语言,但其中某些概念尚待实践来验证,UML也需要一个进化过程。1.4 UML的结构

UML的组成主要有事物、图和关系。事物是UML中重要的组成部分,关系把元素紧密联系在一起,图是很多有相互关系的事物的组合。1.4.1 UML中的事物

UML包含4种事物:构件事物、行为事物、分组事物和注释事物。(1)构件事物

构件事物是UML模型的静态部分,描述概念或物理元素,它包括以下几种。

①类

类是对一组具有相同属性、相同操作、相同关系和相同语义的对象的抽象。在UML组成中,类是用矩形表示的,它包含三个区域:最上面是类名,中间是类的属性,最下面是类的方法。

②接口

接口是指类或组件提供特定服务的一组操作的集合。因此,一个接口描述了类或组件的对外的可见的动作。一个接口可以实现类或组件的全部动作,也可以只实现一部分动作。在UML中,接口被画成一个圆和它的名字。

③协作

描述一组事物间的相互作用的集合。

④用例

用例描述一系列的动作,这些动作是系统对一个特定角色执行的。在模型中,用例是通过协作来实现的。在UML中,用例画为一个实线椭圆,通常还有它的名字。

⑤构件

也称为组件,是物理上或可替换的系统部分,它实现了一个接口集合。在一个系统中,可以使用不同类型的组件,如COM+或JAVA BEANS。

⑥节点

为了能够有效地对部署的结构进行建模,UML引入了节点这一概念,它可以用来描述实际的PC机、打印机、服务器等软件运行的基础硬件。节点是运行时存在的物理元素,它表示了一种可计算的资源,通常至少有存储空间和处理能力。

此外,参与者、文档库、页表等都是上述基本事物的变体。(2)行为事物

行为事物是UML模型图的动态部分,它描述跨越空间和时间的行为,主要包括以下两部分。

①交互

实现某功能的一组构件事物之间的消息的集合,涉及消息、动作序列和链接。

②状态机

描述事物或交互在生命周期内响应事件所经历的状态序列。(3)分组事物

分组事物是UML模型图的组织部分,它描述事物的组织结构,主要由包来实现。包是指把元素编程成组的机制。(4)注释事物

注释事物是UML模型的解释部分,用来对模型中的元素进行说明和解释。注解是对元素进行约束或解释的简单符号。1.4.2 UML的关系

在UML中有4种关系:依赖、关联、泛化和实现。(1)依赖(Dependency)

依赖是两个模型元素间的语义关系,其中一个元素(独立事务)的变化会影响另一个元素(依赖事务)的语义。在图形中,依赖用一条可能有方向的虚线表示,偶尔在其上还带有一个标记,如图1.1所示。图1.1 依赖(2)关联(Association)

关联指明一个对象与另一个对象之间的关系。在图形中,关联用一条实线表示,它可能有方向,偶尔在其上还有一个标记。例如,读者可以去图书馆借书和还书,图书管理员可以管理书籍,也可以管理读者的信息,显然,在读者、书籍、管理员之间存在着某种联系。那么在用UML设计类图的时候,就可以在读者、书籍、管理员三个类之间建立关联关系。读者类和图书类之间的关联关系如图1.2所示。图1.2 关联(3)泛化(Generalization)

泛化是一种一般化到特殊化的关系,是一般事物(父类)和该事物较为特殊的种类(子类)之间的关系,子类继承父类的属性和操作,除此之外,子类还添加新的属性和操作。在图形中,泛化关系用带有空心箭头的实线表示,该实线指向父类,如图1.3所示。图1.3 泛化(4)实现(Realization)

实现是类之间的语义关系,其中的一个类指定了由另一个类必须执行的约定。在两种地方会遇到实现关系,一种是在接口和实现它们的类或构件之间,另一种是在用例和实现它们的协作之间。在图形中,实现关系用一条带有空心箭头的虚线表示,它是泛化和依赖关系两种图形的结合,如图1.4所示。图1.4 实现1.5 UML的视图

UML中的视图一般分为以下5种。

用例视图:用例视图主要强调从系统的外部参与者(主要是用户)的角度所看到的或需要的系统功能。

逻辑视图:逻辑视图主要是从系统的静态结构和动态行为角度显示如何实现系统的功能。

并发视图:并发视图显示了系统的并发性,并解决在并发系统中存在的通信问题和同步问题。

组件视图:组件视图显示代码组件的组织结构。

配置视图:配置视图主要描述了具体如何部署系统。部署指的是将系统配置到由计算机和设备组成的物理结构上。1.5.1 用例视图

用例视图主要描述一个系统应该具备的功能,指的是从系统的外部参与者所能看到的系统功能。用例表示的是系统的一个功能单元,可以被描述为参与者与系统之间的一次交互作用。系统的参与者可以是一个用户或者另外一个系统。客户要求系统提供的功能被当作多个用例在用例视图中进行描述,一个用例就是对系统的一个用法的通用描述。用例模型的用途主要是列举出系统中的用例和参与者,并指出哪个参与者参与了哪个用例的执行。用例视图是其他4种视图的核心,它的内容直接影响其他视图的开发。1.5.2 逻辑视图

逻辑视图主要用于描述在用例视图中提出的系统功能的实现。与用例视图相比,逻辑视图主要关注系统的内部,它既描述系统的静态结构(系统中的类、对象及它们之间的关系),也描述系统的动态协作关系。系统的静态结构在类图和对象图中进行描述,而动态模型是在状态图、顺序图、协作图及活动图中进行描述的。逻辑视图的使用者主要是系统的设计人员和开发人员。1.5.3 并发视图

并发视图主要是从资源的有效利用、代码的并行执行及系统环境中异步事件的处理等方面考虑的。它将系统划分为并发执行的控制,此外,并发视图还需要处理线程之间的通信和同步。并发视图主要由状态图、协作图和活动图组成。并发视图的使用者是开发人员和系统集成人员。1.5.4 组件视图

组件视图描述系统的实现模块以及它们之间的依赖关系。其中,组件指的是不同类型的代码模块,它是构造应用的软件单元。组件视图中也可以添加组件的其他附加信息,如资源分配或者其他管理信息。组件视图主要由组件图构成。组件视图的使用者是开发人员。1.5.5 部署视图

部署视图,也称之为配置视图。配置视图主要显示系统的物理部署,它描述位于节点上的运行实例的部署情况。配置视图主要由部署图表示,配置视图还允许评估分配结果和资源分配。配置视图的使用者是开发人员、系统集成人员和测试人员。1.6 UML的图

UML图是描述UML视图内容的图形。UML有9种不同的图,通过它们的相互组合提供被建模系统的所有视图。本节分别介绍这些不同的图。1.6.1 用例图

用例图从用户角度描述系统功能,并指出各功能的操作者。用例图是UML中最简单也是最复杂的一种图。说它简单是因为它采用了面向对象的思想,基于用户角度来描述系统,绘制非常容易,图形表示直观并且容易理解。说它复杂是因为用例图往往不容易控制,要么过于复杂,要么过于简单。用例图展示了一组用例、参与者以及它们之间的关系,如图1.5所示。图1.5 用例图1.6.2 类图

类图是UML面向对象中最常用的一种图,类图可以帮助我们更直观地了解一个系统的体系结构。通过关系和类表示的类图,可以图形化地描述一个系统的设计部分。如图1.6所示。图1.6 类图1.6.3 对象图

UML面向对象中对象图是类图的实例,几乎使用与类图完全相同的标识。两者的不同之处在于对象图显示类的多个对象实例,而不是实例的类。一个对象图是类图的一个实例。由于对象存在生命周期,因此对象图只能在系统某一时间段存在。1.6.4 状态图

状态图描述一个实体基于事件反应的动态行为,它显示了该实体是如何根据当前所处的状态对不同的事件做出反应的。如图1.7所示。图1.7 状态图1.6.5 活动图

在UML面向对象中,活动图记录单个操作或方法的逻辑,或者单个业务流程的逻辑。它描述系统中各种活动的执行顺序,通常用于描述一个操作中所要进行的各项活动的执行流程。同时,它也常被用来描述一个用例的处理流程或某种交互流程。

活动图由一些活动组成,图中同时包括了对这些活动的说明。当一个活动执行完毕之后,将沿着控制转移箭头转向下一个活动。在活动图中,还可以方便地描述控制转移的条件和并行执行等要求,如图1.8所示。图1.8 活动图1.6.6 顺序图

顺序图描述对象之间动态的交互关系,主要体现对象之间进行消息传递的时间顺序。

顺序图由一组对象构成,每个对象分别带有一条竖线,称作对象的生命线,它代表时间轴,时间沿竖线向下延伸。在UML面向对象中,顺序图描述这些对象随着时间的推移相互之间交换消息的过程。消息用从一个对象的生命线指向另一个对象的生命线的水平箭头表示。还可以根据需要在图中增加有关时间的说明和其他注释,如图1.9所示。图1.9 顺序图1.6.7 协作图

在UML面向对象中,协作图用于显示组件及其交互关系的空间组织结构,它并不侧重于交互的顺序。协作图显示了交互中各个对象之间的组织交互关系以及对象彼此之间的链接。与顺序图不同,协作图显示的是对象之间的关系。另一方面,协作图没有将时间作为一个单独的维度,因此,序列号就决定了消息及并发线程的顺序。它用带有编号的箭头来描述特定的方案,以显示在整个方案过程中消息的移动情况。协作图主要使用描绘对象之间消息的移动情况来反映具体的方案,并显示对象及其交互关系的空间组织结构,而非交互的顺序,如图1.10所示。图1.10 协作图1.6.8 组件图

组件图,也称为组件图。组件图描述代码部件的物理结构及各部件之间的依赖关系,组件图有助于分析和理解部件之间的相互影响程度。从组件图中可以了解各软件组件(如源代码文件或动态链接库)之间的编译器和运行时的依赖关系。使用组件图可以将系统划分为内聚组件并显示代码自身的结构,如图1.11所示。图1.11 组件图1.6.9 部署图

部署图,也称为部署图。在UML面向对象中,部署图描述系统中硬件和软件的物理配置情况和系统体系结构。

在部署图中,用结点表示实际的物理设备,如计算机和各种外部设备等,并根据它们之间的连接关系,将相应的结点连接起来,并说明其连接方式。在结点里面,说明分配给该结点上运行的可执行构件或对象,从而说明哪些软件单元被分配在哪些结点上运行,如图1.12所示。图1.12 部署图

上述9种图可归纳为5类,如表1.1所示。

从应用的角度看,当采用面向对象技术设计系统时,首先是描述需求,其次根据需求建立系统的静态模型,以构造系统的结构,第三步是描述系统的行为。其中在第一步与第二步中所建立的模型都是静态的,包括用例图、类图(包含包)、对象图、组件图和部署图等5种图形,是标准建模语言UML的静态建模机制。其中第三步中所建立的模型或者可以执行,或者表示执行时的时序状态或交互关系。它包括状态图、活动图、顺序图和合作图等4种图形,是标准建模语言UML的动态建模机制。因此,标准建模语言UML的主要内容也可以归纳为静态建模机制和动态建模机制两大类。1.7 UML 2.0新特性

统一建模语言UML是以可视化方式描述软件系统的结构和行为的标准语言。UML 2.0在可视化建模方面进行了许多改革和创新。它可以描述现今软件系统中存在的许多技术,例如模型驱动架构(MDA)和面向服务的架构(SOA)。

UML 2.0解决了用户在使用UML 1.x过程中所遇到的一些问题。下面主要针对UML 2.0上层的变化进行简要的说明。(1)用例图

用例图中的主体内容用例、参与者和通信关联并没有变化。如果用UML 1.x,只能用用例图所归属的包来表达一组用例的逻辑组织关系,即用用例在模型中所处的物理位置表达逻辑组织关系。在UML 2.0中,为每个用例增加了一个称为Subject的特征,这项特征的取值可以作为在逻辑层面划分一组用例的一项依据。用例所属的“系统边界”就是Subject的一种典型例子。(2)顺序图

顺序图是最常用的一种图。主要用它来描述对象间的交互关系,着重体现交互的时间顺序。对于顺序图,UML 2.0主要做了3方面的改进。

允许在顺序图中明确地表达分支判断逻辑。这样能够将以前要通过两张图才能表达的意思通过一张图就能表达,但这并不意味着顺序图擅长表达这种逻辑,所以并不需要在顺序图中展现所有的分支判断逻辑。

允许“纵向”与“横向”地对顺序图进行拆分与引用。这样就解决了以前一张图由于流程过多造成幅面过大和浏览不方便的问题。

提供了一种新图,称为交互纵览图(Interaction Overview Diagram),可以直观地表达一组相关顺序图之间的转向逻辑。在UML1.x中,通常是通过活动图进行间接表达的。(3)活动图

活动图是比较常用的一种图,它接近于流程图。在UML 2.0中,活动图增加了许多新特性。例如,泳道可以划分成层次、增加丰富的同步表达能力、在活动图中引入对象等特性。(4)组件图

组件图是在物理层面对系统结构及内容的直观描述,它最接近于通常意义上的模块结构图。

在UML 2.0中,组件图有比较明显的改进。组件本身内容的表述更清晰,包括对组件所提供的接口、所要求的接口和组件之间的依赖关系通过组装连接器(Assembling Connector)更加明确地表达等。(5)新增加的图

UML 2.0中增加了包图、组合结构图、交互纵览图和计时图。

包图展现模型要素的基本组织单元及这些组织单元之间的依赖关系,包括引用关系(Package Import)和扩展关系(Package Merge)。在通用的建模工具中,一般可以用类图描述包图中的逻辑内容。

组合结构图描述系统中的某一部分(即组合结构)的内部内容,包括该部分与系统其他部分的交互点,这种图能够展示该部分内容内部参与者的配置情况。

组合结构图中引入了一些重要的概念。例如,端口(Port),端口将组合结构与外部环境隔离,实现了双向的封装,既涵盖了该组合结构所提供的行为(Provided Interface),同时也指出了该组合结构所需要的服务(Required Interface);如协议(Protocol),基于UML中的协作(Collaboration)的概念,展示那些可复用的交互序列,其实质目的是描述那些可以在不同上下文环境中复用的协作模式。协议中所反映的任务由具体的端口承担。

计时图是一种可选的交互图,展示交互过程中的真实时间信息、具体描述对象状态变化的时间点,以及维持特定状态的时间段。1.8 系统开发阶段

系统开发共有5个阶段:需求分析、系统分析、系统设计、程序实现和测试阶段。

软件过程对于组织的重要性,就如同算法对子程序运行一般。合适的算法可以提高运行的效率,不合适的算法则不仅无法提高效率,而且会浪费组织资源的使用率。软件开发过程牵涉到的是更为复杂的人、事、物,而算法则是纯粹的机器代码执行。本章将介绍构成软件过程(Software Process)的基本活动,以及几种在软件与系统产业界常用的软件过程。

软件开发过程主要是描述开发软件系统所牵涉到的相关活动,以及如何循序渐进地执行这些活动。对于不同的系统、组织及开发,其管理工具所采用的流程都有可能不同。例如,有些系统适合采用按部就班的方式,从分析、设计、实现、测试到移交逐步地进行;有些系统则适合采用反复循环的方式,不断地重复执行分析、设计、实现、测试等活动。

需求分析的主要内容是了解客户的需求、分析系统的可行性、分析需求的一致性及正确性等。

设计是将需求转换为系统的重要过程。设计包含架构设计、模块间的接口设计、数据库设计、算法设计与数据结构设计等。许多软件工程师通常会认为,自己可以立即编写程序而不需要分析需求和撰写设计,因而忽略了规划的重要性,直接进行程序编写。此种做法对于软件系统而言,可能会造成种种问题。举例来说,如果没有架构设计,就会缺乏整体性的思考,系统可能因此而无法满足接口需求以及非功能性的需求(如性能、可维护性等);此外,还可能会因为忽略事先的规划与分析而造成重复工作等。

实现指的是通过程序语言,将所设计的内容转化为可以执行的软件系统。除错是实现活动中不可避免的工作,主要是修改程序编写过程中产生的错误。除此之外,单元测试通常也会在实现阶段进行,目的是要确认单元程序代码的正确性。当程序有错误时,需要进行除错,将错误排除。

测试是对实现的程序代码模块进行检测,检验其功能是否正确、性能是否符合要求。一般而言,测试可以分为单元测试、集成测试、系统测试和验收测试。

单元测试:测试单元模块功能是否能正常运行。

集成测试:测试模块或子系统的接口集成是否能正常运行。

系统测试:测试系统的整体性能、安全性、稳定度等非功能性需求是否符合预期目标。

验收测试:测试系统的整体性能是否符合使用者的要求。

软件系统的特性之一就是需求会经常发生变动,许多系统每隔半年甚至是几个月就会改版。软件维护的目的是要确保已经发行的软件系统可以持续满足客户的需要。一般而言,维护可以有如下几种情况:修复错误、增加或变更功能,以及因为平台改变所做的调整。1.9 小结

UML是一种语言:它遵循特定的规则,允许创建各种模型并不告诉设计者需要创建哪些模型,而且不提供开发过程。UML是可视化语言:UML是图形化语言,用于构造系统或理解系统的语言。

UML的组成共包括三部分,即元素、图和关系。元素是UML中重要的组成部分,关系把元素紧密联系在一起,图是很多有相互关系的元素的组。

UML中的元素主要有类、接口、用例、组件、节点、消息、连接、状态、事件、活动等。UML图是描述UML视图内容的图形。UML有9种不同的图,通过它们的相互组合提供被建模系统的所有视图。可以将这9种图归结为5大类:静态图包括类图、对象图和包图;行为图包括状态图和活动图;用例图;交互图包括顺序图和协作图;实现图包括组件图和部署图。1.10 习题

1.UML事物有哪些?

2.UML关系有哪些?

3.UML图有哪些?其中哪些是静态图?哪些是动态图?

4.为什么要学习统一建模语言UML?

5.简述什么是UML?

6.在Internet上查询UML图的知识,写出自己关于UML的认识体会。第2章 面向对象技术和建模基础

本章导读

面向对象技术强调在软件开发过程中面向客观世界或问题域中的事物,采用人类在认识客观世界的过程中普遍运用的思维方法,直观、自然地描述客观世界中的有关事物。本章主要介绍关于面向对象的基本概念,这些概念也是系统建模的基础。使用UML可以建立易于理解和使用的对象模型,这样可以方便程序设计者根据模型实现对应的软件。

本章要点

重点理解面向对象的相关概念,掌握面向对象的特征。了解面向对象开发的相关技术和过程。2.1 面向对象的基本概念

在学习面向对象程序设计之前,一般都会学习面向过程的程序设计,例如,使用C面向过程的程序设计语言,面向过程的语言是用流程化的思想来组织的。在这些语言的设计思想中,通常将存放基本数据类型的变量作为程序处理对象,将变量的赋值作为程序的基本操作,以变量值的改变作为程序运行的状态。这种程序设计风格存在着数据抽象简单、信息完全暴露、算法复杂和无法很好地描述客观世界等缺点。在程序设计过程中,为了实现有限度的代码重用,公共代码被组织成为过程或函数。当需要代码重用时,就调用已经组织好的过程或函数。在这种应用方式中,如果软件项目庞大,程序的调试和维护将变得异常困难。而面向对象的程序设计思想是将数据及对于这些数据的操作封装在了一个单独的数据结构中。这种模式更接近于现实世界,在这里,所有的对象都拥有属性及与这些属性相关的行为。对象之间的联系是通过消息来实现的,消息是请求对象执行某一处理或回答某些信息的要求。某个对象在执行相应的处理时,可以通过传递消息请求其他对象完成某些处理工作或回答某些消息。其他对象在执行所要求的处理活动时,同样也可以通过传递消息和另外的对象联系。所以,一个面向对象程序的执行,就是通过对象之间传递消息来完成的。

面向对象程序设计是一种新兴的程序设计方法,或者说是一种新的程序设计规范,它使用对象、类、继承、封装和消息等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。其应用领域不仅仅是软件,还有计算机体系结构和人工智能等。

使用UML进行系统建模时,首先必须弄清楚什么是对象,以及在系统的分析与设计过程中如何利用对象。2.1.1 面向对象方法

从事软件开发的工程师们经常会有这样的体会:在软件开发过程中,客户会不断地提出各种修改要求,即使在软件投入使用后,也常常需要对其做出修改,但在用结构化开发的程序中,这种修改往往是很困难的,而且还会因为计划或考虑不周,不但旧错误没有得到彻底改正,又引入了新的错误。另一方面,在过去的程序开发中,代码的重用率很低,使得程序员的效率并不高。因此,为了提高软件系统的稳定性、可修改性和可重用性,人们在实践中逐渐创造出软件工程的一种新途径——面向对象方法。

面向对象方法的出发点和基本原则是尽可能模拟人类习惯思考问题的方式,使软件开发的方法与过程尽可能接近人类认识世界和解决问题的方法与过程。由于客观世界的问题都是由客观世界中的实体及实体相互间的关系构成的,因此我们把客观世界中的实体抽象为对象。也就是说,面向对象是一种认识客观世界的世界观,是从结构组织角度模拟客观世界的一种方法。

综上所述,面向对象所带来的好处是程序的稳定性、可修改性(它把客观世界分解成一个一个的对象并把数据和操作都封装在对象的内部)和可重用性(通过面向对象技术,不仅可以重用代码,而且可以重用需求分析、设计和用户界面等)。

面向对象方法具有以下几个要点。(1)客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。按照这种观点,可以认为整个世界就是一个复杂的对象。因此,面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。(2)把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法,数据用于表示对象的静态属性,是对象的状态信息。因此,每当建立该对象类的一个新实例时,就按照类中数据的定义为这个新对象生成一组专用的数据,以便描述该对象独特的属性值。

例如,在屏幕上不同位置显示的半径不同的几个圆,虽然都是Circle类的对象,但是每个圆都有自己专用的数据,以便记录各自的圆心位置和半径等。

在类中定义的方法是允许施加于该类对象上的操作,它是该类所有对象共享的,并不需要为每个对象都复制操作的代码。(3)按照子类与父类的关系,把若干个对象类组成一个层次结构的系统。(4)对象彼此之间仅能通过传递消息进行联系。2.1.2 对象

对象(Object)是面向对象的基本构造单元,它是系统中用来描述客观事物的一个实体。一个对象由一组属性和对属性执行操作的一组方法组成。

对象不仅能表示具体的实体,也能表示抽象的规则、计划或事件。主要存在如下的对象类型。

有形的实体:指一切看得见、摸得着的实物。如汽车、书、计算机、桌子、鼠标、机器人等,都属于有形的实体,也是最易于识别的对象。

作用:指人或组织,如医生、教师、员工、学生、公司、部门等所起的作用。

事件:在特定时间所发生的事。如飞行、事故、中断、开会等。

性能说明:制造厂或企业通常需要对产品的性能进行全面的说明,如车厂对车辆的性能说明,往往要列出型号及各种性能指标等。

对象不仅能表示结构化的数据,而且也能表示抽象的事件、规则以及复杂的工程实体,这是结构化方法所不能做到的。因此,对象具有很强的表达能力和描述功能。

因此,在面向对象的系统中,对象是一个封装数据属性和操作行为的实体。数据描述了对象的状态,操作指的是操作私有数据并改变对象的状态。当其他对象向本对象发出消息,本对象响应时,其操作才得以实现,在对象内部的操作通常叫做方法。

对象具有如下特征。(1)模块性

模块性指的是对象是一个独立存在的实体。从外部可以了解它的功能,其内部细节是隐蔽的,不受外界干扰,对象之间的相互依赖性很小。因此,模块性体现了抽象和信息的隐蔽。它使得一个复杂的软件系统可以通过定义一组相对独立的模块来实现,这些独立模块之间只需交换一些为了完成系统功能所必须交换的信息就可以。当模块内部的实现发生变化而导致必须要修改程序时,只要对外接口操作的功能不变,就不会给软件系统带来影响。(2)继承性

继承性是指利用已有的定义作为基础来建立新的定义,而不必重复定义它们。

例如,汽车具有“车型”、“颜色”和“出厂日期”等属性,其子类吉普车、轿车和卡车都继承了这些属性。(3)动态连接性

各个对象之间是通过传递消息来建立起连接的。消息传递机制是面向对象语言的共同特性,其含义是将一条发送给一个对象的消息与包含该消息方法的对象联接起来,使得在增加新的数据类型时不需要改变现有的代码。2.1.3 类

类定义一组大体上相似的对象。一个类所包含的方法和数据描述一组对象的共同行为和属性。例如,窗口、车轮和玻璃等都是类的例子。类是在对象之上的抽象,有了类以后,对象则是类的具体化,是类的实例。类可以有子类和父类。

类是对事物的抽象,它不是个体对象,而是描述一些对象的完整集合。

例如,可以把CPU看做对象类,它具有CPU的共同属性,如主频、指令集、Cache容量、运算位数、功率等。也可以把它看做CPU的某个具体实例,如Intel的P4处理器。

把一组对象的共同特性加以抽象并储存在一个类中,是面向对象技术最重要的一点;是否建立了一个丰富的类库,是衡量一个面向对象程序设计语言成熟与否的重要标志。

类是静态的,类的语义和类之间的关系在程序执行前就已经定义好了,而对象是动态的,对象是在程序执行时来创建和删除的。

如图2.1所示的是类的例子,其中类的名字是图书(Book)。该类有9个属性(b_id、b_name、t_id、p_id、author、isbn、r_date、price、quantity)和7个方法(add、delete、update、querybyname、querybypid、querybyauthor、queryall)。图2.1 图书类

实例的概念和对象很相似,在UML中经常使用实例这个术语。一般来说,实例的概念比较广泛,它不仅仅是对类而言,其他建模元素也有实例。例如,类的实例是对象,而关联的实例就是链。

一般情况下,实例就是由某个特定的类所描述的一个具体的对象。类是对具有相同属性和行为的一组相似的对象的抽象,类在现实世界中并不能真正存在。在地球上并没有抽象的中国人,只有一个个具体的中国人,例如,张名、李洋,同理,也没有抽象的“圆”。

实际上类是建立对象时使用的模板,按照这个模板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。2.1.4 封装

封装(Encapsulation)就是把一个对象的方法和属性组合成一个独立的单位,并尽可能隐蔽对象的属性、方法和实现细节的过程,仅仅将接口对外公开。例如,图2.1中的图书类就反映了类的封装性,在图书类中,将属性(如b_id、b_name等)和方法(如add()、delete()等)进行了组合,对外只提供了图书类的一些属性和方法,而对于方法的具体实现过程是隐藏的。

在访问类的时候,根据其封装的特点,对外访问时提供了4种访问控制级别。

Public:公有访问。最高一级的访问,所有的类都可以访问。

Protected:受保护的。只有同一个包中的类或者子类可以公开访问。

Private:私有访问。最低一级的访问,只能在对象的内部访问,不对外公开。

Default:默认的。属于当前目录(包)下的类都可以访问。

因此,根据类的封装性,在对属性和方法进行访问时,需要知道其访问的控制级别,否则是不能使用的。实质上,封装包含了两层含义:一是把对象的全部属性和方法结合在一起,形成一个不可分割的独立单位,对象的属性(除了公有访问的属性)只能由这个对象的方法来存取;二是极大可能地隐蔽了对象的内部实现细节,与外部的联系只能通过外部接口来实现。

封装将类的信息进行了隐蔽,使得类彼此相对独立。对于一个类可以只考虑其对外所提供的接口,即有什么功能,能做什么,而不需要注意其内部实现的细节,也就是说这些功能是如何实现的。例如,在图2.1的图书类中,其提供了图书信息的增加、删除、修改和查询等功能,也就是说,图书类能做的事情就是对图书信息的基本维护,而对其查询、增加、删除和修改等功能的内部实现是隐藏的。

对类的封装,使得对象以外的部分不能随意对对象的内部属性和方法做修改,从而有效地避免了外界产生的错误对其造成的影响,极大地降低了查错和排错的难度。此外,当对对象的内部实现做修改时,由于其只通过一些外部的接口对外提供服务,同样也减小了其内部的修改对外界所造成的影响。

封装机制将对象的开发者和使用者分离开来,使用者不需要知道对象具体的实现细节,只需要使用开发者提供的外部接口,就可以使用对象提供的功能。因此,封装的结果实际上是将对象的复杂实现进行了隐蔽,并提供了代码的可重用性,从而降低了软件开发的难度。

综上所述,封装的最大优点如下。

方便了使用者对类和对象的操作,并降低了使用者错误地修改其属性的风险。

体现了系统之间的松散耦合关系并提高了系统的独立性。

提高了程序的复用性。

针对大型的开发系统,降低了开发风险。如果整个系统开发失败,一些相对独立的子系统仍然存在可用价值。

综上所述,系统的封装性越高,相对独立性就越强,使用也越方便。2.1.5 继承

客观世界的事物除了具有共性外,还存在着特性。如果只一味的考虑事物的共性,而忽略了事物的特性,就不能反映出客观世界中事物之间所存在的层次关系,也就不能正确地、完整地、详细地描述客观世界。如果在分析客观世界中的事物时,先忽略其特性,抽取事物的共性,这样就能够得到一个适合客观事物某个集合的类。如果在这个抽象类的基础上,再考虑在对事物进行抽象的过程中每个对象被忽略的那部分特性,这样就能够得到一个新的类,这个新类具有前一个类的全部特征,是前一个类的子集,这两个类之间就形成了一种层次结构,我们称之为继承结构。

继承(Inheritance)是一种一般类与特殊类的层次模型。继承性是指特殊类的对象具有其一般类的属性和方法,在其之上又增加了自己的特殊属性和方法。继承意味着在特殊类中不用重新定义在一般类中已经定义过的属性和方法,特殊类可以自动地、隐含地拥有其一般类的属性与方法。继承体现了类之间代码的重用性特点,提供了一种明确表达共性的方法。对于一个特殊类来说,既有自己新定义的属性和方法,还有从一般类中继承下来的属性和行为。尽管继承下来的属性和行为是隐藏的,但无论在概念上还是在实际使用效果上,都是这个类的属性和行为。当这个特殊类又被它更下层的特殊类继承时,它继承来的和自己定义的属性和方法又被下一层的特殊类继承下去。因此,继承具有传递性,体现了客观世界中特殊与一般之间的关系。

在继承中,需要明确这样两个概念,子类和父类。

子类:指的是通过继承创建的新类,称为子类或者派生类。

父类:指的是被继承的类,称为基类、父类或超类。

继承的过程,就是从一般到特殊的过程。继承性提供了父类和子类之间共享数据和方法的一种机制。继承表示的是类之间的一种关系,在定义和实现一个类的时候,可以通过一个已经存在的类来创建新类,把这个已经存在的类作为父类,将其所定义的内容作为自己的内容的一部分并加入一些新的内容。图2.2显示了父类A和它的子类B之间的继承关系,箭头从子类B指向父类A,子类B由继承部分(C)和新增内容(D)组成。图2.2 继承

继承分为单重继承和多重继承两类。

单重继承:指的是一个子类只有一个父类。

多重继承:指的是一个子类可以有多个父类。

单重继承和多重继承时父类和子类之间的关系如图2.3所示,其中(a)表示的是单重继承,(b)表示的是多重继承。

单重继承所表示的类之间的关系类似一棵树,如图2.3中的(a)。在图中,每个类都只有一个父类,如类A是最顶层的父类,类B、类C和类D是类A的子类,类C是类E和类F的父类。多重继承所表示的类之间的关系比单重继承复杂,一个类可以有多个父类,如图2.3(b)中的类E和类F,其中类E的父类是类B和类D,而类F的父类是类C和类D。

此外,继承关系是可传递的,如图2.3(a)中的类E继承类C,而类C继承类A,因此类E也继承了类A,所以类E也是类A的子类,是间接的子类,类C则是类A的直接子类。

在软件开发过程中,继承性体现的是软件模块的可重用性和独立性,可以缩短软件的开发周期,提高软件的开发效率,并为日后的维护和修改软件提供了便利。因为如果要修改某个模块的功能,只需在相应的类中做一些变动,它派生的所有类都会自动地、隐含地做出相应的改动。

综上所述,继承真实地反映了客观世界中事物的层次关系。通过类的继承,能够实现对问题的深入抽象描述,反映出事物的发展过程,继承性是面向对象程序设计语言不同于其他语言的最主要的特点。图2.3 继承性2.1.6 多态

客观世界的事物具有特性,可以以不同的形态存在,在面向对象程序设计中也参考了客观世界多态性的特点。

也就是说,类具有多态性,它体现在当不同的对象收到相同的消息后,可以产生多种不同的行为方式。多态性使得同一个属性或行为在父类及其各派生类中可以具有不同的语义。例如,在一般类“几何图形”中定义了“计算图形面积、周长或绘制图形”等行为,但是这些行为并不具备具体的含义,也就是说还不确定要计算什么几何图形的面积或者是绘制一个什么样的图形。根据一般类再定义特殊类,如“矩形”、“正方形”、“圆”和“梯形”等,它们都继承了父类“几何图形”的“计算图形面积、周长或绘制图形”等行为,因此自动具有了计算面积或绘制图形的功能,但每个特殊类的功能却不一样,一个是要计算矩形的面积或画出一个矩形,另一个是计算正方形的面积或画出一个正方形。这样的计算面积或绘图的消息发出后,“矩形”、“正方形”等类的对象接收到这个消息后各自执行不同的计算面积或绘图函数。图2.4所示就是多态性的表现。图2.4 多态

具体来说,多态性(Polymorphism)是指类中同一函数名对应多个功能相似的不同函数,可以使用相同的调用方式来调用这些具有不同功能的同名函数,这些同名的函数可以是参数的个数不同或是类型不同,但是函数名相同,当调用它们的时候,根据所传递的数据选定相应的函数,从而执行不同的功能。

在面向对象程序设计中,通过继承性和多态性的结合,可以生成许多类似但是功能却各不相同的对象。根据继承性的特点,这些对象共享一些相似的特征,并显出自己的特性;根据多态性,针对相同的消息,不同对象可以具有特殊的表现形式,从而实现个性化的设计。2.1.7 消息

在面向对象程序设计中,对象之间要进行数据的传递,那么对象之间靠什么来传递数据?对象之间是通过消息进行通信的,多个对象之间通过传递消息来请求或提供服务,从而使软件具有更强大的功能。

在面向对象的系统中,把请求或命令抽象成消息,当系统中的其他对象请求某个对象执行某个服务时,就将一个消息发送给另一个对象,接收到消息的对象将解释该消息,然后响应这个请求,完成指定的服务。通常,把发送消息的对象称为发送者,把接收消息的对象称为接收者。通常,一个消息由以下几部分组成。

提供服务的对象名。

服务的标识,即方法名。

输入信息,即实际参数。

响应结果,即返回值或操作结果。

消息是实现对象之间通信的一种机制,一个对象可以接收不同形式的多个消息,并产生不同的结果;相同形式的消息可以发送给不同的对象,并产生不同的结果;在发送消息的时候可以不考虑具体的接收者,对象可以对消息做出响应,也可以拒绝消息,也就是说,不是必须要对消息做出响应。2.2 面向对象开发

面向对象方法(简称为OO)具有很强的类的概念,因此它能很直观地模拟人类对客观世界的认识方式,也能模拟人类在认知过程中的由一般到特殊或由特殊到一般的归纳功能。前面介绍的类的概念既能反映出对象的本质属性,又提供了实现对象共享机制的理论根据。

如果按照面向对象方法的思想进行软件系统的开发,其过程共分成4个阶段。(1)系统调查和需求分析,分析问题并求解

对用户的开发需求以及要开发的系统所面临的问题进行调查和研究。针对复杂的问题领域,抽象出对象及其属性和方法。这个阶段通常称为面向对象分析,即OOA。(2)整理问题,对第一阶段的结果进行进一步抽象和归类整理

对每一部分进行单独具体的设计。首先是类的设计,类的设计可能包含多个层次(利用继承、派生),然后在这些类的基础之上,提出程序设计的思路和方法,即算法的设计。在设计阶段,不牵扯某一种具体的计算机语言,而是用一种更通用的描述工具进行描述,这个阶段即为面向对象设计OOD。(3)程序实现

利用面向对象的程序设计语言进行系统的实现,即面向对象编程OOP。(4)系统测试

系统开发好后,在交付用户使用前,必须对程序进行严格的测试。测试的主要目的就是发现程序中的错误,进行改正,使系统更健壮。在进行面向对象测试时,采用面向对象的方法进行测试,以类作为测试的基本单元。这个阶段称为面向对象测试OOT。

下面将对面向对象开发过程的4个阶段进行详细的描述。2.2.1 系统调查和需求分析

面向对象的系统调查和需求分析阶段主要是提取系统的需求,也就是要分析出为了满足用户的需求,系统必须“做什么”(系统所能提供的功能),而不是“怎么做”(系统如何实现)。(1)分析过程概述

在系统调查和需求分析阶段,系统分析员要对需求文档进行分析。通过分析可以发现需求文档中的歧义性和不一致性并对它们进行修正,去除那些冗余内容,挖掘系统中应该存在的潜在内容并弥补系统中的不足,从而使需求文档更完整和准确。

对需求文档进行分析和整理后,为了给面向对象分析过程提供依据,要进行需求建模。这时系统分析员根据提取的用户需求,对用户的需求进行深入理解,识别出问题领域内的对象,并分析对象之间的关系,抽象出目标系统需要完成的任务,这样就可以利用OOA模型准确地表示出来,即用面向对象观点建立对象模型、动态模型和功能模型。

通过对需求的分析和建模,最后对所得的需要进行评审。通过用户、领域专家、系统分析员和系统设计人员的评审,并进行反复修改后,最终确定目标系统的需求规格说明。(2)实例需求文档

需求文档也叫需求陈述或问题陈述。对于要开发的任何一个系统,建立需求陈述是首要任务。因为系统最终是要由用户使用的,而在该过程中,主要是陈述用户的需求,即该系统应该“做什么”,而不是“怎么做”,即系统要完成的任务是什么,而不是解决问题的方法。

在进行需求陈述时,必须要清楚地了解所要解决问题的目标。如果目标模糊,将会影响整个系统分析、设计和实现等后续开发阶段的所有工作。也就是说,需求质量的好坏直接影响到整个系统的质量,因此这一环节是很关键的。如果想准确表达用户的要求,在对需求进行陈述时需要分析人员和用户一起研究和讨论。2.2.2 面向对象分析方法

面向对象的分析方法(简称为OOA),指的是按照面向对象的概念和方法,在对任务的分析中,根据客观存在的事物以及事物之间的关系,归纳出相关的对象,包括对象的属性、行为以及对象之间的联系,并将具有共同属性和行为的对象用一个类来表示。

通过面向对象的分析,建立一个能反映真实工作情况的需求模型。在这个阶段所形成的模型只是一个比较粗略的模型。OOA所强调的是在系统调查资料的基础上进行的对象的归类分析和整理。

使用OOA方法对系统调查和需求分析进行分析处理时,一般要遵循前面讲述的抽象、封装、继承、消息通信等原则。

在使用OOA具体地分析一个事物时,一般分为如下几个阶段。(1)识别并筛选对象

按照对象的定义,对象应该是实际问题域中有意义的个体或概念实体。对象具有目标软件系统所关心的属性。并且,对象应该以某种方式与系统发生关联,即对象必须与系统中其他有意义的对象进行消息传递,并提供外部服务。

通过对用户需求分析文档的分析可以找出所有的名词或名词短语,合并同义词,这些是极有可能成为对象的。除去具有动作含义的名词,动词将被描述为对象的操作而不是对象本身。(2)标识对象的属性

属性是对问题域中对象性质的描述,对象在系统中所有可能的状态就是属性的取值。对象一般具有很多属性,但在分析阶段就要分析出对象的哪些属性是和系统紧密相关的。

在问题域中,如何能够识别对象的哪些属性是有意义的呢?要识别出所关心的潜在属性,需要对问题领域涉及到的知识进行深刻的理解。

在识别属性的过程中,对于问题领域中的某个实体,不但要求其取值有意义,而且它本身在系统中必须是独立存在的。这时应该将该实体作为一个对象,而不能作为另一对象的属性。此外,为了保持需求模型的简洁性,一般将省略对象的一些导出属性。例如,“年龄”可通过“出生日期”和系统当前时间导出,因此,不应该将“年龄”作为人的基本属性。(3)识别对象的行为

对象的行为可以简单地理解为对象对外提供的所有的功能。比如,在面向对象模型中,一个对象要处理另一对象的请求、查询或命令,即响应外部的事件,要完成某项操作,这种操作将改变对象自身的属性值或系统的状态,这些都是对象的行为。当对象受到外部事件的刺激或接收另一个对象传来的消息后,为完成某项操作,响应外部事件,该对象可能又需要向其他对象发送消息。因此,我们可以把整个系统看成是对象之间的相互通信,以及在通信过程中引发的动作。

一般可以将对象的行为分为以下3类。

①对象生命周期中的创建、维护和删除行为

例如,图书管理系统中的图书信息的创建、删除和修改等行为。

②计算性行为

典型的计算性行为主要包括:利用基本的对象属性值计算出派生出的属性值,以及为了响应其他对象的请求,完成某些数据处理功能,并返回结果。这类计算性行为往往完成的是数据处理功能,即对象提供的外部的计算性行为。因此,分析人员可以在定义对象的外部行为时,针对其他对象发出的消息请求提取计算性行为。

③监视性行为或称响应行为

为了提取对象的响应行为,分析人员需要对对象的主要状态进行定义。对于每一种状态,列出可能的外部事件、预期的反应,并进行适当的精化。例如,“图书”对象的状态可以为借出和库存等,在每一状态可处理的事件及预期反应可以表示为响应行为。2.2.3 面向对象设计方法

面向对象的设计方法(简称为OOD)是面向对象方法中的中间过渡环节。其主要作用是对OOA分析的结果进行规范化的整理,以便为面向对象程序设计打下基础。在OOD的设计中,主要有如下几个过程。(1)精化对象的定义规格

对于OOA所抽象出来的对象和类以及在分析过程中产生的分析文档,在OOD过程中,根据设计要求对其进行整理和精化,使之更符合面向对象程序设计的需要。整理和精化的过程主要包括两个方面:一个是根据面向对象的概念模型,整理分析所确定的对象结构、属性和方法等内容,纠正错误的内容,删去不必要和重复的内容等;另一个是进行分类整理,这样便于下一步的数据库设计和程序处理模块设计。整理的方法主要是进行归类,即对类和对象、属性、方法和结构等进行归类。(2)数据模型和数据库设计

数据模型的设计是对系统中的类和对象的属性、方法等内容的确定,对消息连接的方式、系统访问数据模型的方法等的确定,最后将每个对象实例化数据都映射到面向对象的库结构模型中。(3)优化

OOD的优化设计过程是从另一个角度对分析结果和处理业务过程的整理归纳。优化包括对象和结构的优化、抽象和集成。对象和结构的模块化表示OOD提供了一种范式,这种范式支持对类和结构的模块化。集成化把单个构件有机地结合在一起,相互支持。2.3 软件建模概述

模型提供了系统的蓝图,可以包括详细的计划,也可以包括从很高的层次考虑系统的总体计划。一个好的模型包括那些有广泛影响的主要元素,而忽略那些与给定的抽象水平不相关的次要元素。每个系统都可以从不同的方面用不同的模型来描述,因而每个模型都是一个在语义上闭合的系统抽象。模型可以是结构性的,强调系统的组织;它也可以是行为性的,强调系统的动态方面。

建模是为了能够更好地理解正在开发的系统。通过建模,可以达到如下4个目的。

模型有助于按照实际情况或按照所需要的样式对系统进行可视化。

模型能够规约系统的结构或行为。

模型给出了指导构造系统的模板。

模型对做出的决策进行文档化。2.3.1 软件建模的概念

模型是对现实存在的实体进行抽象和简化,模型提供了系统的蓝图。模型过滤了非本质的细节信息,使问题更容易理解。抽象是一种允许我们处理复杂问题的方法。为建立复杂的软件系统,我们必须抽象出系统的不同视图,使用精确的符号建立模型,验证这些模型是否满足系统的需求,并逐渐添加细节信息把这些模型转变为实现。这就是软件建模。这样的一个过程就是软件模型形成的过程,软件建模是捕捉系统本质的过程,也是把问题领域转移到解决领域的过程。

软件建模是开发优秀软件的核心工作,其目的是把要设计的结构和系统的行为联系起来,并对系统的体系结构进行可视化和控制。可视化的建模使用一些图形符号进行建模,可视化建模可以捕捉用户的业务过程,可以作为一种很好的交流工具,可以管理系统的复杂性,可以定义软件的架构,还可以增加重用性。2.3.2 软件建模的用途

现在的软件越来越庞大,大多数软件的功能都很复杂,使得软件开发只会变得更加复杂和难以把握。解决这类复杂问题最有效的方法之一就是分层理论,即将复杂问题分为多个问题逐一解决。软件模型就是对复杂问题进行分层,从而更好地解决问题。这就是为什么要对软件进行建模的原因。有效的软件模型有利于分工与专业化生产,从而节省生产成本。为了降低软件的复杂程度,便于提早看到软件的将来,便于设计人员和开发人员交流从而使用了软件建模技术。对于软件人员来说,模型和工程人员的图纸一样重要。只是目前来看,软件模型在软件工程中的重要性还远远没有达到图纸的在其他工程中地位。2.3.3 软件建模的优点

软件建模的优点主要有如下几点。

使用模型便于从整体上、宏观上把握问题,以便更好地解决问题。

软件建模可以加强软件工作人员之间的沟通,便于提早发现问题。

模型为代码生成提供依据,帮助我们按照实际情况对系统进行可视化。

模型允许我们详细说明系统的结构或行为,提供了指导我们构造系统的模板,并对我们做出的决策进行文档化。2.4 小结

面向对象程序设计是一种新兴的程序设计方法,或者说是一种新的程序设计规范,它使用对象、类、继承、封装、消息等基本概念来进行程序设计。在面向对象方法中需要明确什么是对象和类,以及类的相关特征。

对象(Object)是面向对象的基本构造单元,是系统中用来描述客观事物的一个实体,一个对象由一组属性和对属性进行操作的一组方法组成。类定义了一组大体上相似的对象,类所包含的方法和数据描述一组对象的共同行为和属性。

在早期阶段,软件开发所面临的问题一般比较简单,从任务分析到编写程序,再到程序的调试,难度都不是太大,可以由一个人或一个小组来完成。随着软件规模的迅速增大,软件人员面临的问题十分复杂,需要考虑的因素很多。需要将软件整个开发过程规范化,明确软件开发的过程中每个阶段的任务,在保证前一个阶段的正确性的情况下,再进行下一个阶段的工作。这就是软件工程学需要研究和解决的问题。

面向对象的软件工程一般包括面向对象分析、面向对象设计、面向对象编程和面向对象测试。

如果要设计一个规模大的软件,就要严格按照面向对象软件工程的几个阶段进行开发。如果所处理的是一个比较简单的问题,可以不必严格按照以上几个阶段进行,而由程序设计者按照面向对象的方法进行程序设计。2.5 习题

1.什么是对象,具有什么特征?

2.简述面向对象的开发过程。

3.UML在面向对象开发过程中起的作用是什么?

4.什么是建模,有什么优点?

5.什么是面向对象技术?第3章 UML建模工具简介

本章导读

随着UML的出现与发展,建模工具也越来越多。每一个软件开发者都希望找到适合自己的、拥有自己所需要的功能并且尽可能简单的建模工具。为此,本章主要介绍几种应用比较广泛并且在建模工具中颇具影响力的4种工具。

本章要点

几种常见的UML建模工具

比较简单的建模工具StarUML的安装及配置

利用StarUML的建模过程

随着人类社会的发展和技术的进步,项目越来越复杂,需要参与的人也越来越多。但是人脑本身是有局限性的,考虑问题的时候不可能面面具到。特别是软件项目,有可能今天要加个按钮,明天要加个报表,后天又要增加其他的内容,这就给软件开发造成了不稳定性。从事过软件开发的人都知道这种不稳定性意味着有可能为了实现一个功能,之前花了大半年时间设计的代码都要重新编写,或者因为不同人对代码的修改,让代码乱到无法修改的地步。

为此软件项目的管理就被提上了日程。软件项目把软件开发维护过程中的需求分析、系统结构设计、代码实现、系统测试及系统改进各个环节都进行了规范化,而UML就是为此而设计的一种图形化描述工具。所以说实现UML的项目就会变得结构简明、容易理解且标准清楚。3.1 常用UML建模工具

面向对象的软件建模工具应对软件系统的模型进行可视化、构造化和文档化。一套面向对象的软件建模工具应该拥有特定的概念和表示方法,除对建模人员进行过程性支持、辅助进行建模之外,还要按照规范生成相应的开发文档,并生成尽可能多的代码。面向对象的软件建模工具应该具有以下功能。

绘图

存储

一致性检查

对模型进行组织

导航

写作支持

代码生成

逆向项目

集成

支持多种抽象层和开发过程

文档生成

脚本编程

在UML的发展过程中使用过多工具,其中比较有代表性的有Rational Rose和PowerDesigner等,这里提出4种工具加以介绍。3.1.1 Rational Rose

Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具,用于可视化建模和公司级水平软件应用的组件构造。Rose是直接从UML发展而来的设计工具,它的出现就是用于对UML建模的支持。

Rational Rose包括统一建模语言(UML)、OOSE和OMT。其中统一建模语言(UML)由Rational公司3位世界级面向对象技术专家Grady Booch、Ivar Jacobson和Jim Rumbaugh通过对早期面向对象研究和设计方法的进一步扩展得来的,它为可视化建模软件奠定了坚实的理论基础。

Rational Rose是一个完全的具有能满足所有建模环境(Web开发、数据建模、Visual Studio和C++)需求能力和灵活性的一套解决方案。Rose允许开发人员、项目经理、系统项目师和分析人员在软件开发周期内将需求和系统的体系架构转换成代码,消除浪费的消耗,对需求和系统的体系架构进行可视化、理解和精练。通过在软件开发周期内使用同一种建模工具可以确保更快更好地创建满足客户需求的、可扩展的、灵活的和可靠的应用系统。

Rational Rose的两个受欢迎的特征是它提供反复式发展和来回旅程项目的能力。Rational Rose允许设计师利用反复发展(有时也叫进化式发展),因为在各个进程中新的应用能够被创建,通过把一个反复的输出变成下一个反复的输入。(这和瀑布式发展形成对比,在瀑布式发展中,在一个用户开始尝试之前整个项目被从头到尾地完成。)然后,当开发者开始理解组件之间是如何相互作用和在设计中进行调整时,Rational Rose能够通过回溯和更新模型的其余部分来保证代码的一致性,从而展现出被称为“来回旅程项目”的能力。Rational Rose是可扩展的,可以使用下载附加项和第三方应用软件,它支持COM/DCOM(ActiveX)、JavaBeans和Corba组件标准。

Rational Rose不是单纯的绘图工具,它专门支持UML的建模,有很强的校验功能,能检查出模型中的许多裸机错误,还支持多种语言的双向项目,特别是对当前比较流行的Java的支持非常好。Rose早期没有对数据库端建模的支持,但现在的版本中已经加入数据库建模的功能。它提供了一个名为Data Modeler的工具,利用该工具可以将对象模型转换成数据模型,也可以将现有的数据模型转换成对象模型,从而实现两者之间的同步。

具体来说,Data Modeler具有以下功能。

将对象模型转换成数据模型,即将类映射到数据库的表,构成传统的E-R图。

将数据模型转换成对象模型。

利用数据模型生成数据库DDL,也可以直接连接到数据库里,对数据库产生结果。

从现有数据库或DDL文件里生成数据模型。

将数据模型同DDL文件或现有数据库进行比较。

Rational Rose包含多个版本。

Rose Enterprise:支持用C++、Java、Visual Basic和Oracle生成代码,支持逆向项目。

Rose Professional系列:可以用一种语言生成代码。

Rose Modeler:可以对系统生成模型,但不支持逆向项目,也不支持由模型转出代码。

Rational Rose 2003企业版(Rose Enterprise)的设计窗口如图3.1所示。图3.1 Rational Rose

作为一种建模工具,Rational Rose是影响面向对象应用程序开发领域发展的一个重要因素。Rational Rose自推出以来就受到了业界的瞩目,并一直引领着可视化建模工具的发展潮流。越来越多的软件公司和开发团队开始或者已经采用Rational Rose,将它用于大型项目开发的分析、建模和设计等方面。

从使用的角度分析,Rational Rose易于使用,支持使用多种构件和多种语言的复杂系统建模;利用双向项目技术可以实现迭代式开发;团队管理特性支持大型、复杂的项目和通常队员分散在各个不同地方的大型开发团队。同时,Rational Rose与微软Visual Studio系列工具中GUI的完美结合所带来的方便性,使得它成为绝大多数开发人员首选建模工具;Rose还是市场上第一个提供对基于UML的数据建模和Web建模支持的工具。此外,Rose还为其他一些领域提供支持,如用户定制和产品性能改进。

Rose主要是在开发过程中的各种语义、模块、对象以及流程、状态等描述,主要体现在能够从各个方面和角度进行分析和设计,使软件的开发蓝图更清晰,内部结构更明朗,但对数据库的开发管理和数据库端的迭代不是很理想。Rose现在已经退出市场,不过仍有一些公司在使用。IBM推出了Rational Software Architect来替代Rational Rose。3.1.2 Visio

Microsoft Office Visio是微软公司出品的软件,Office Visio提供了各种模板:业务流程的流程图、网络图、工作流图、数据库模型图和软件图,这些模板可用于可视化和简化业务流程、跟踪项目和资源、绘制组织结构图、映射网络、绘制建筑地图以及优化系统。

Visio有两个版本,即Microsoft Office Visio Professional和Microsoft Office Visio Standard。Office Visio Standard具备Office Visio Professional包含的许多功能,但是Office Visio Professional还包含更多图表类型的模板和若干项高级功能。

Visio原来仅仅是一种画图工具,能够用来描述各种图形(从电路图到房屋结构图)。到Visio 2000才开始引进从软件分析设计到代码生成的全部功能,它可以说是目前能够用图形方式来表达各种商业图形用途的最好工具(对软件开发中的UML支持仅仅是其中很少的一部分)。

使用Office Visio,可以轻松地将流程、系统和复杂信息可视化。Office Visio提供了特定工具来支持IT和商务专业人员的不同图表制作需要。使用Office Visio Professional中的ITIL(IT基础设施库)模板和价值流图模板,可以创建种类更广泛的图表。使用预订义的Microsoft SmartShapes符号和强大的搜索功能可以找到合适的形状,无论该形状是保存在计算机上还是保存在网站上。

通过浏览简化的模板类别和使用大模板预览,在新增的“入门”窗口中查找所需的模板。使用“入门”窗口中新增的“最近打开的模板”视图找到最近使用的模板。

在Office Visio Professional中,打开新的“入门”窗口和使用新的“示例”类别,可以更方便地查找新的示例图表。查看与数据集成的示例图表,为创建自己的图表获得思路,认识到数据为众多图表类型提供更多上下文的方式,以及确定要使用的模板。

无需绘制连接线便可连接形状,只需单击一次鼠标,Office Visio中新增的自动连接功能就可以将形状连接、使形状均匀分布并使它们对齐。移动连接的形状时,这些形状会保持连接,连接线会在形状之间自动重排。

Microsoft Office Visio绘图和图表制作软件有助于IT和商务专业人员轻松地可视化、分析和交流复杂信息。它能够将难以理解的复杂文本和表格转换为一目了然的Visio图表。该软件通过创建与数据相关的Visio图表(不使用静态图片)来显示数据,这些图表易于刷新,并能够显著提高生产率。使用Office Visio中的各种图表可以了解、操作和共享企业内组织系统、资源和流程的相关信息。

Microsoft Office Visio Standard 2003的设计窗口如图3.2所示。图3.2 Microsoft Office Visio

Visio与微软的Office产品能够很好兼容,它能够把图形直接复制或者内嵌到Word文档中。但是对于代码的生成更多支持使用如VB、VC++、MS SQL Server等微软产品(这也是微软的传统),Visio用于图形语义的描述比较方便,但是用于软件开发过程的迭代开发则力不从心。3.1.3 PowerDesigner

PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型、物理数据模型,可以生成多种客户端开发工具的应用程序,还可为数据仓库制作结构模型,也能对团队设备模型进行控制。它可与许多流行的数据库设计软件(如PowerBuilder、Delphi和VB等)配合使用来缩短开发时间和优化系统设计。

PowerDesigner开始是从数据库建模而发展起来的一种数据库建模工具,直到7.0版才开始引入对面向对象的开发的支持,后来又引入了对UML的支持。

PowerDesigner是Sybase的企业建模和设计解决方案,采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并为研发生命周期管理提供强大的分析与设计技术。PowerDesigner支持60多种数据库系统(RDBMS)/版本。PowerDesigner在Microsoft Windows平台上运行,并提供Eclipse插件。

PowerDesigner的设计窗口如图3.3所示。图3.3 PowerDesigner

由于PowerDesigner侧重点不同,它对数据库建模的支持非常好,支持90%左右的数据库,但对UML建模使用的各种图的支持不尽人意,虽然在最近的几个版本上有所加强但使用它来进行UML开发并不是很普遍,很多人都是用它来作为数据库的建模。但不可否认的是,使用UML分析,PowerDesigner可以生成代码,并对Sybase的产品、C++、Java、VB和C#有很好的支持。3.1.4 StarUML

StarUML(简称SU),是一款开放源码的UML开发工具,是由韩国公司主导开发出来的产品,可以直接到StarUML网站下载该工具。

StarUML(简称SU),是一种创建UML类图,生成类图和其他类型的统一建模语言(UML)图表的工具。StarUML是一个开源项目,它发展快、灵活、可扩展性强。(1)可绘制UML中常用的9种图

StarUML可绘制11种图,包括UML中最常用的用例图、类图、对象图、顺序图、协作图、状态图、活动图、组件图和部署图。(2)完全免费

StarUML是一套开放源码的软件,不仅可以免费自由下载,连代码都免费开放。(3)多种格式

StarUML遵守UML的语法规则,不支持违反语法的动作。(4)双向工程

无论是把设计模型转换成代码,还是把代码转换为设计模型,都是一项非常复杂的工作。将正向和逆向工程这两方面结合在一起定义为双向工程。双向工程提供了一种机制,它使系统架构或者设计模型能够与代码之间进行双向交换。

正向工程把设计模型转换为代码框架,开发者不需要编写类、属性和方法代码。一般情况下,开发人员将系统设计细化到一定的级别,然后应用正向工程。

逆向工程是指把代码转换成设计模型。在迭代开发周期中,一旦某个模型作为迭代的一部分被修改,采用正向工程把新的类、方法和属性加入代码;同时,一旦某些代码被修改,采用逆向工程,将修改后的代码转换为设计模型。

StarUML可以依据类图的内容生成Java、C++和C#代码,也能够读取Java、C++和C#代码反向生成类图。逆向工程有两个主要用途,其一是将有的源码反转成图之后,可以使用构建UML模型的方式继续将新的设计添加上去;另一种用途是想要解析源码时,可以通过反转的类图来理解,不再需要查看一行又一行的代码,这将节省大量的时间和精力。(5)支持XMI(XML-based Metadata Interchange)

StarUML接受XMI 1.1、XMI 1.2和XMI 1.3版的导入导出。XMI是一种以XML为基础的交换格式,用以交换不同开发工具所生成的UML模型。(6)导入Rose文件

StarUML可以读取Rational Rose生成的文件,让原先Rose的用户可以转而使用免费的StarUML。在早期,Rational Rose是市场占有率最高的UML开发工具,同时也是相当昂贵的。由于Rational Rose非常闻名,后来被IBM收购了。(7)支持模式

StarUML支持23种GoF模式(Pattern)和3种EJB模式。GoF模式出自于Erich Gamma等4人合著的《Design Patterns:Elements of Reusable Object-Oriented Software》一书,其中列出了23种软件模式,可解决软件设计上的特定问题。StarUML也支持3种常用的EJB模式,分别为EntityEJB、MessageDrivenEJB和SessionEJB。

StarUML设计窗口如图3.4所示。图3.4 StarUML3.2 StarUML的安装与配置3.2.1 StarUML的安装

首先,下载StarUML安装包,本章及本书中介绍的是StarUML 5.0.2版本,也是现在最常用的版本。

01 双击启动staruml-5.0-with-cm.exe,进入安装向导界面,如图3.5所示。图3.5 StarUML 5.0.2安装界面

02 单击Next按钮,进入许可协议选择界面,如图3.6所示。图3.6 License Agreement界面

03 阅读完相关条约后选择第一个单选按钮,出现Next按钮后单击它,即进入安装路径的设置页面,如图3.7所示。图3.7 Select Destination Location界面

04 图3.7对话框中的路径是默认路径,修改路径时需要选择Browse按钮,选择所需要的安装路径即可。选择好路径后就可以单击Next按钮进入选择菜单的程序文件夹中,如图3.8所示。图3.8 Select Start Menu Folder界面

05 选择默认值,单击Next按钮进入图3.9。图3.9 Select Additional Tasks界面

06 在该图中,可以在桌面上创建StarUML的快捷图标,当然可以根据自己的喜好选择该选项或者不选。处理完后单击Next按钮,进入图3.10。图3.10 Ready to Install界面

07 该图为用户提示安装之前用户所做的操作。如果想进行修改,则单击Back按钮;如果确认没有问题,则单击Install按钮,开始安装。安装界面如图3.11所示。图3.11 Installing界面

08 安装成功后出现图3.12。图3.12 安装成功

如果在界面中选中Launch StarUML复选框,则单击Finish按钮后,即可运行StarUML,如图3.4所示。3.2.2 StarUML的配置

为了能与面向对象的程序设计语言相关联,实现双向工程,需要在StarUML中配置profile属性。

打开StarUML设计界面,通过Model/Profile……菜单设置工程所需的profile。设置成功后就决定了工程所使用的规则和约定。根据语言的关联,可以选择适合的项,这里为了与Java语言关联,必须包含Java Profile项,如图3.13所示。图3.13 Profile Manager对话框3.3 使用StarUML建模

StarUML是一款开放源代码的UML开发工具,StarUML支持UML语法规则检验,正反向Java、C++、C#工程,并且支持多种图片格式导出。同时,它还支持23种GoF(Gang of Four)模式及3种EJB(Enterprise JavaBean)模式。3.3.1 StarUML主界面

StarUML的开发界面主要由工具箱、绘图区、模型资源管理器和属性区等构成,具体结构如图3.14所示。图3.14 StarUML界面结构图3.3.2 StarUML的模型、视与图

StarUML中清晰地区分了模型(Model)、视(View)与图(Diagram)的概念。模型是包含软件模式信息的元素,视则是模型中信息的可视表达法,图则是表示用户特定设计思想的可视元素的集合。

UML包含了11种图,在StarUML开发中通过Add Diagram可以弹出如图3.15所示的菜单,以供设计时选择。图3.15 StarUML的11种图3.3.3 StarUML建模的基本过程

1.创建或打开项目(工程)

在StarUML中,项目是基本的管理单位。一个项目可以管理一个或多个软件模型,它是在任何软件模型中都存在的顶级的包。一般来说,项目保存在文件中。一个项目包含并管理如表3.1所示的3种子元素。(1)创建新项目

启动StarUML或在设计窗口中选择File→New Project By Approach……,弹出如图3.16所示的New Project By Approach对话框。从项目列表中选择合适的方法后单击单击OK按钮(建议不要选中Set As Default Approach复选框),即可打开StarUML窗口,如图3.4所示。

另外还可以选择File→New Project菜单,采用默认的方法创建项目。如果之前在环境中修改过默认方法,则以最后一次修改为准。图3.16 New Project By Approach对话框(2)打开项目

为了继续处理保存的项目,必须先打开项目文件。

选择File→Open……菜单,在打开的项目对话框中,选择一个项目文件(*.uml),单击Open按钮即可打开它。

2.设置Profile

为了与Java语言交互,设置Profile属性,界面如图3.13所示。

3.创建模块

模块是一种包,它提供了对StarUML功能与特征的扩充。模块的创建可以是几种新扩充元素的结合。不但可以为某用途对一个独立的模块配置扩充元素,还可以在同一模块中创建同一类型的扩充元素。

StarUML的模块有下列功能:

扩展主菜单或弹出菜单;

添加新方法(approach);

添加新轮廓(profile);

通过构造型(stereotype)或表示法(notation)的扩充添加新元素;

通过COM服务器或简单的脚本文件实现新的功能;

与其他应用程序集成;

其他的插件(Add-In)功能。

在项目中创建3个元素的方法相同,如果添加模块,需要选择图3.4窗口中右侧的Model Explorer小窗口中的Untitled模块。通过Model主菜单或右击选定的模型,可以选择Add/Model,默认名称为Model1,在其属性区可以更改为所需要的名称,如tsgl。

4.创建参与者和用例(1)创建参与者

参与者定义了在与实体交互时该实体的用户可以发挥作用的一套清楚的角色。参与者可以被认为是对于每个用来交流的用例而言的独立角色。

如果在创建用例图之前创建参与者,则需要经过以下步骤:

通过Model主菜单或右击选定模型,选择Add/Actor;

在模型资源管理器中会出现图标;

可以在属性区设置和修改相关属性。

例如,“借阅者”的浏览窗口和属性窗口如图3.17所示。

如果在用例图中创建参与者,则只需要选择工具箱中的元素即可,具体操作同其他元素的添加相同。(2)创建用例图3.17 “借阅者”的Model Explorer和Properties窗口

用例构造用于定义系统行为或者气压的语义实体而不展示其内部结构。每个用例指定一系列行为,包括变体和可执行的实体,与参与者实体交互。

其创建过程与参与者类似,这里不再赘述。

5.创建类

根据需要,使用创建参与者的方式来创建类。在创建类时,需要为其创建属性及操作,也就是Java语言类体中的变量和方法,具体操作步骤如下。(1)对类创建属性或操作

在设计图中,右击图中的类目标,在弹出的菜单中选择Add中的Attribute(被标示为绿色)或Operation(被标示为红色),为其创建属性或操作,也可以通过其属性窗口的Attributes或Operation后的按钮进行创建。(2)为属性或操作设置数据类型

在窗体右下角的Properties窗口中,找到Type输入框,输入属性或操作的类型。其中由于类的封装性和类内部使用的规范性,其内部数据(属性)都是私有的,所以,在Properties面板中将属性设置为Private。

属性区常见的属性类型及描述如表3.2所示。

6.创建图

在StarUML中提供了常用的11种图,其类型及描述如表3.3所示。

其中UML中的对象图就是类图的一个实例,它没有单独的设计图形,在第5章中会详细介绍此内容。(1)创建图

从模型资源管理器选择相应的模型;

右击选择Add Diagram菜单,选择对应的图的类型后图就创建出来了。

例如,在模型tsgl中创建了一个包tsg,该包中一个主要的参与者“图书管理员”的用例图如图3.18所示。图3.18 图书管理员用例图(2)在图中添加元素

为了在图中创建新元素,必须先打开图。对于不同类型的图,工具箱中包含的元素也不同,每种图中可用的图元素也彼此不同。

从工具箱中选择要创建的元素类型;

在图中单击要创建元素的位置。可以通过拖动鼠标选择一个区域确定新元素的大小,如果两个元素需要连接到一起,要认真、准确地操作,否则可能会弹出如图3.19所示的错误提示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载