面向对象的方法起源于面向对象的编程语言。自20世纪80年代中期到90年代,OO的研究重点已经从面向对象编程语言转移到设计方法学方面,陆续提出了一些面向对象的开发方法和设计技术。其中具有代表性的工作有:B.Henderson-Sellers和J.M. Edwards提出的面向对象软件生存周期的“喷泉”模型及面向对象系统开发的七点框架方法;G.Booch提出的面向对象开发方法学;P.Coad和E.Yourdon提出的面向对象分析(OOA)和面向对象设计(OOD);J.Rumbaugh等人提出的OMT方法;Jacobson提出的OOSE方法等等。值得一提的是统一的建模语言UML(Unified Modeling Language),该方法结合了Booch、Rumbaugh和Jacobson方法的优点,统一了符号体系,并从其它的方法和工程实践中吸收了许多经过实际检验的概念和技术。这些方法的提出,标志着面向对象方法逐步发展成为一类完整的方法学和系统化的技术体系。而有关抽象数据类型的基础研究为面向对象开发方法提供了初步的理论。面向对象方法作为一种独具优越性的新方法引起计算机界广泛的关注和高度的重视。正像20世纪70年代结构化方法对计算机技术应用所产生的巨大影响和促进那样,20世纪90年代OO方法强烈地影响、推动和促进了一系列高技术的发展和多学科的综合。
面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接的对应关系。一个对象类定义了具有相似性质(属性)的一组对象。而继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
面向对象方法支持三种基本的活动:识别对象和类,描述对象和类之间的关系,以及通过描述每个类的功能定义对象的行为。
为了发现对象和类,开发人员要在系统需求和系统分析的文档中查找名词和名词短语,包括可感知的事物(汽车、压力、传感器);角色(司机、教师、客户);事件(着陆、中断、请求);互相作用(借贷、开会、交叉);人员;场所;组织;设备和地点。通过浏览使用系统的脚本发现重要的对象和其责任,是面向对象分析和设计过程初期重要的技术。
当重要的对象被发现后,通过一组互相关联的模型详细表示类之间的关系和对象的行为,这些模型从四个不同的侧面表示了软件的体系结构:静态逻辑、动态逻辑、静态物理和动态物理。
静态逻辑模型描述实例化(类成员关系)、关联、聚集(整体/部分)、和一般化(继承)等关系,这被称为对象模型。一般化关系表示属性和方法的继承关系。定义对象模型的图形符号体系通常是从用于数据建模的实体关系图导出的。对设计十分重要的约束,如基数(一对一、一对多、多对多),也在对象模型中表示。
动态逻辑模型描述对象之间的互相作用。互相作用通过一组协同的对象、对象之间消息的有序序列、参与对象的可见性定义的途径来定义系统运行时的行为。Booch方法中的对象交互作用图被用来描述重要的互相作用,显示参与的对象和对象之间按时间序列的消息。可见性图用来描述互相作用中对象的可见性。对象的可见性定义了一个对象如何处于向它发送消息的方法的作用域之中。例如,它可以是方法的参数、局部变量、新的对象或当前执行方法的对象的部分。
静态物理模型通过模块描述代码布局,动态物理模型描述软件的进程和线程体系结构。
综上所述,面向对象方法用于系统开发有如下优点:
(1)强调从现实世界中客观存在的事物(对象)出发来认识问题域和构造系统,使系统能更准确地反映问题域。
(2)运用人类日常的思维方法和原则(体现于OO方法的抽象、分类、继承、封装、消息等基本原则)进行系统开发,有利于发挥人类的思维能力,有效控制系统复杂性。
(3)对象的概念贯穿于开发全过程,使各个开发阶段的系统成分具有良好的对应关系,显著提高系统的开发效率与质量,并大大降低系统维护的难度。
(4)对象概念的一致性,使参与系统开发的各类人员在开发的各所段具有共同语言,有效地改善了人员之间的交流和协作。
(5)对象的相对稳定性和对易变因素隔离,增强了系统对环境的适应能力。
(6)对象、类之间的继承关系和对象的相对独立性,对软件复用提供了强有力的支持。
面向对象系统开发中生成的大多数模型都用符号表示,这种符号就是统一建模语言(Unified Modeling Language,UML)。Booch在 《The Unified Modeling Language User Guide》一书中对UML的定义是“UML是对软件密集型系统中的制品进行可视化、详述、构造和文档化的语言”。
UML是在多种面向对象建模方法的基础上发展起来的建模语言,主要用于软件密集型系统的建模。它的演化,可以按其性质划分为以下几个阶段:最初的阶段是专家的联合行动,由三位OO方法学家Jim Rumbaugh、Ivar Jacobson和Grady Booch将他们各自的建模方法(OMT、OOSE和Booch)结合在一起,形成UML 0.9(1996年6月)。第二阶段是公司的联合行动,由十几家公司组成的“UML伙伴组织”将各自的意见加入UML,形成UML 1.0(1997年1月)和UML 1.1(1997年11月),并作为向OMG(Object Management Group,对象管理组织)申请成为建模语言规范的提案。第三阶段是在OMG控制下的修订与改进,OMG于1997年11月正式采纳UML 1.1作为建模语言规范,然后成立任务组进行不断的修订,并产生了UML 1.2、1.3和1.4版本,目前推出的是UML 2.0版本。
UML目的是要成为一种标准的统一语言,为开发团队提供标准通用的设计语言来开发和构建计算机应用。UML包括一套IT专业人员期待多年的统一的标准建模符号,通过使用UML,这些人员能够阅读和交流系统架构和设计规划——就像建筑工人多年来所使用的建筑设计图一样。UML成为"标准"建模语言的原因之一在于,它与程序设计语言无关。UML符号集只是一种语言而不是一种方法学,它可以在不做任何更改的情况下很容易地适应任何公司的业务运作方式。UML展现了一系列最佳工程实践,这些最佳实践在对大规模、复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。
2.UML的构成
UML主要有三类元素:
1) 基本构造块(basic building block)
2) 规则(rule)
3)公共机制(common mechanism)
其中基本构造块又包括3种类型:
1)事物(thing)
2)关系(relationship)
3)图(diagram)
其中事物又分为4种类型:
1)结构事物(structual thing)。UML中的结构事物包括类(class)、接口(interface)、协作(collaboration)、用例(use case)、主动类(active class)、构件(component)和结点(node)。
2)行为事物(behavioral thing)。UML中的行为事物包括交互(interaction)和状态机(state machine)。
3)分组事物(grouping thing)。UML中的分组事物是包(package)。
4)注释事物(annotational thing)。UML中的注释事物是注解(note)。
关系有4种类型:
1)依赖(dependency)
2)关联(association)
3)泛化(generation)
4)实现(realization)
UML提供了多种类型的模型描述图(diagram),当在某种给定的方法学中使用这些图时,它使得开发中的应用程序的更易理解。
表8-1 UML图的描述
图名 |
描述 |
|
用例图 |
从用户角度描述系统的功能,并指出各功能的操作者。 |
|
静态图 |
用于定义系统的类,包括描述类之间的联系(如关联、依赖、聚合等)以及类的内部结构,即类的属性和操作。因此类图是描述系统中类的静态结构,即它描述的是一种静态关系,在系统的整个生命周期都是有效的。 |
|
包或类组成,主要表示包与包、或包与类之间的关系。包图用于描述系统的分层结构。 |
||
行为图 |
描述一类对象的所有可能状态以及事件发生时状态的转移条件。通常状态图是对类图的补充。 |
|
描述为满足用例要求所要进行的活动以及活动间的约束关系。使用活动图可以很方便地表示并行活动。 |
||
交互图 |
用以显示对象之间的动态合作关系。它强调对象之间消息发送的顺序,同时也显示对象之间的交互过程。 |
|
同序列图是等价的,但着重描述对象间的协作关系。 |
||
实现图 |
构件图 |
描述代码部件的物理结构及各部件之间的依赖关系。一个部件可能是一个资源代码部件、一个二进制部件或一个可执行部件。 它包含逻辑类或实现类的有关信息。部件图有助于分析和理解部件之间的相互影响程度。 |
定义系统中软硬件的物理体系结构。可以显示实际的计算机和设备(用节点表示)以及它们之间的连接关系,也可显示连接的类型及部件之间的依赖性。在节点内部,放置可执行部件和对象以显示节点跟可执行软件单元的对应关系。 |
UML的内涵远不只是这些模型描述图,但是对于入门来说,这些图对这门语言及其用法背后的基本原理提供了很好的介绍。通过把标准的UML图放进工作产品中,开发人员就更加容易加入项目并迅速进入角色。UML的模型描述图可以由下列五类图(9种图形)来定义,如表8-1所示。
UML五类图之间存在着或直接或间接的关系(如图5),这体现了UML中的辩证法。用例图主要用来描述系统的外部行为;类图和对象图用来定义类和对象以及它们的属性和操作;状态图描述类的对象所有可能的状态以及事件发生时状态的转移条件;顺序图显示对象之间的动态合作关系,它强调对象之间消息发送的顺序,同时显示对象之间的交互;协作图强调对象间的动态协作关系;活动图描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动。除此之外,图8-5中未显示的包图用于描述系统的分层结构,构件图描述代码部件的物理结构及各部件之间的依赖关系,配置图定义系统中软硬件的物理体系结构。
图5 UML图之间的关系
从应用的角度看,当采用面向对象技术设计系统时,首先是描述需求;其次根据需求建立系统的静态模型,以构造系统的结构;第三步是描述系统的行为。其中在第一步与第二步中所建立的模型都是静态的,包括用例图、类图(包含包)、对象图、组件图和配置图等五个图形,是标准建模语言UML的静态建模机制。其中第三步中所建立的模型或者可以执行,或者表示执行时的时序状态或交互关系,它包括状态图、活动图、顺序图和协作图等四个图形,是标准建模语言UML的动态建模机制。因此,标准建模语言UML的主要内容也可以归纳为静态建模机制和动态建模机制两大类。