面向对象的软件工程方法起源于面向对象的编程语言。20世纪60年代由挪威计算中心开发的Simula67语言,被视为面向对象语言的先驱。1972年由Palo Alto研究中心的研究员A.凯(Alan Kay,1940~ )主持研制的Smalltalk-72语言首次使用了“面向对象”这个术语,该语言吸收了Simula67中的类、对象、继承等概念和CLU语言的抽象数据类型,并借鉴了LISP语言和LOGO语言的一些思想,几经改进,于1981年推出较为完善和实用的版本Smalltalk-80,被认为是面向对象语言发展史上最重要的里程碑。此后,C++、Objective-C、Object Pascal、CLOS、Eiffel、Actor等一大批面向对象的编程语言陆续出现,标志着这种崭新的程序设计范型被广泛接受。
在20世纪80年代,人们认识到面向对象的软件开发不仅仅是编程问题,更重要的是在软件生命周期的前期阶段运用面向对象的观点进行分析和设计,建立面向对象的分析模型和设计模型。这一认识促使面向对象方法从单纯的面向对象的编程(OOP)发展到面向对象的设计(OOD),进而发展的面向对象的分析(OOA)。20世纪80年代中后期,出现了一批早期的OOD方法,如Booch86、通用面向对象开发(GOOD)和层次式面向对象的设计(HOOD)等,此时的OOD方法尚不太成熟。从20世纪80年代末到20世纪90年代初,面向对象方法进一步从OOD发展到OOA,一批既解决分析建模问题也解决设计建模问题的面向对象的分析与设计(OOA&D)方法相继出现。例如Booch方法、Coad/Yourdon方法、Jacobson方法(简称OOSE)和Rumbaugh方法(简称OMT)等。这些方法的出现,使得面向对象的软件开发从分析到设计都可运用面向对象的概念进行系统建模,从而使面向对象的编程有了良好的、概念一致模型支持。
各个流派的OOA和OOD方法所采用的概念既有许多共同部分也有一定的差异,在表示符号、模型图及文档组织等方面的差别更为明显。这种情况很不利于技术交流。因此,在20世纪90年代中期出现了各种建模方法走向统一的发展趋势,由G.Booch、J.Rumbaugh和I.Jacobson三位方法学家和16所软件公司联合提出的统一建模语言(Unified Modeling Language; UML)被对象管理组织OMG采纳为建模语言规范。此后,在OMG的主持下UML进行了多次修订,已成为ISO标准。
随着面向对象建模技术和面向对象编程语言的广泛普及,越来越多的软件系统都是采用面向对象技术开发的,因此很自然地要求以面向对象的概念为基础进行软件测试。在20世纪90年代中期,逐渐形成了面向对象测试技术。同时,在其维护阶段也顺理成章地采用了面向对象的软件维护技术。至此,面向对象方法与技术覆盖了软件生存周期的全过程,形成了一种先进而完整软件工程方法——面向对象的软件工程。
面向对象的软件工程包括面向对象的分析、面向对象的设计、面向对象的实现、面向对象的软件测试和面向对象的系统维护等主要内容,以下分别介绍。
面向对象的分析:运用面向对象的概念进行系统分析。主要工作是将问题域中的事物抽象为系统中的对象,用对象的属性和操作描述事物的数据特征和行为特征,并建立各类对象之间的关系,形成一个映射问题域并能满足用户需求的面向对象分析模型,即OOA模型。
面向对象的分析属于系统分析,而非需求分析。因为它的主要工作是发现和描述问题域中的对象,而不是直接地分析和描述需求。I. Jacobson在其OOSE方法中提出的用况概念是真正支持需求分析的。以用况为主要成分建立的用况图可作为系统的需求模型,它为面向对象的软件工程中的OOA提供了良好的基础。但是用况图并不涉及面向对象的概念,它既可以用于面向对象的软件工程,也可以由于基于其他方法的软件工程。
面向对象的设计:运用面向对象的概念进行系统设计。在OOA方法出现之后,OOD方法通常是基于OOA的,其主要工作是针对具体的实现条件,在OOA模型基础上继续运用面向对象概念进行系统设计,目标是建立一个可在特定技术条件下实现的面向对象的设计模型,即OOD模型。一个与平台无关的OOA模型可以针对不同的实现平台设计出多个平台专用的OOD模型。
面向对象的编程:运用面向对象的编程语言进行系统实现。这种程序设计范型的基本特点是:以对象作为程序的基本单元,将对象的属性和操作结合为一个封装体,在程序中将具有相同属性和相同操作对象抽象为类,用类创建对象,并实现各类对象之间的继承、聚合、关联和消息等关系。
面向对象的软件测试:对于用面向对象编程语言实现的软件,利用对象、类、继承、聚合、关联、消息等程序元素所提供的语法和语义信息进行软件测试,即面向对象的软件测试。与传统的测试技术相比,面向对象的软件测试更有利于准确地发现程序错误并提高测试效率。
面向对象的软件维护:对于用面向对象技术开发的软件,利用其分析与设计模型和源程序中的面向对象概念所提供的语法和语义信息进行软件维护,即面向对象的软件维护。由于面向对象的系统成分在软件生命周期的各个阶段都是一致的,因此在软件维护过程中非常有利于正反两个方向的变化追踪。
面向对象方法和技术不仅覆盖了软件生命周期的各个阶段,而且渗透到计算机软件的各个领域。这些领域中的面向对象技术为面向对象的软件工程提供了强有力的支持。
面向对象的软件工程环境:其历史几乎和面向对象的编程语言一样久远,第一个最有影响的面向对象编程语言Smalltalk-80就带有一个面向对象的开发环境。20世纪90年代以后的软件工程环境通常包括:覆盖软件生存周期各阶段的面向对象的开发与维护工具;一个或多个面向对象的编程语言;支持复用和共享的类库和模型库,支持对象永久存储的对象管理系统;统一的用户界面;以及项目管理、配置管理、版本管理和权限管理等软件工具。
面向对象的数据库管理系统:即采用面向对象数据模型的数据库管理系统,是面向对象方法与数据库技术的交叉领域。以往的研究与开发有3种途径:在传统的数据库管理系统中增加面向对象的功能;在面向对象的编程语言中增加数据库的功能;提供全新的、自成体系的面向对象数据库管理系统。从20世纪90年代开始,已经有多种产品问世
面向对象的图形用户界面:人机界面的开发是最早引入面向对象技术的领域之一。从早期的窗口系统,到后来的图形用户界面(GUI)和可视化编程环境,越来越向面向对象技术靠拢。当前绝大多数支持人机界面开发的软件都比较全面地采用了面向对象技术,包括用面向对象概念描述人机界面的基本元素,并提供内容丰富的界面类库。
分布式对象技术:提供在分布式环境下和异构平台上的对象互操作技术。分布式对象是一些独立的代码封装体,分布于网络环境中,通过预先定义的接口协议相互访问而构成系统。网络上的各个结点互为客户和服务器,彼此实现互操作。客户端的对象不必关心服务器端的对象如何实现,只需知道它们所提供的接口。这意味着分布式对象之间的互操作可以独立于语言、位置及平台,从而有效地支持分布、异构环境下的应用系统开发与集成。实现上述目标的核心机制是对象总线,对象总线之上是一组公共对象服务,位于平台和应用之间,称为中间件(middleware)。支持分布式对象技术的中间件产品必须遵循共同的技术标准,例如公共对象请求代理体系结构(CORBA)、构件对象模型(COM)和J2EE等。