张 晶
(云南工业大学省计算机技术应用重点实验室 昆明 650051)
摘要:在这篇文章中,首先回顾了面向对象方法的发展过程,然后对几种主要的OOA方法进行了比较;并介绍了面向对象方法当前的应用情况和主要研究领域。
关键词:面向对象, 面向对象编程,面向对象分析,面向对象设计
Summary of Object-oriented Method
Zhang Jing
(Key Laboratory of Computer Technology Application, Yun Nan Polytechnic University, Kunming 650051)
Abstract In this paper, we review the past and current situation of Object-oriented Method. We also compare with several OOA(Object-oriented Analysis) methods and introduce the newest and main research fields of Object-oriented technology .
Key words OO(Object-oriented), OOP(Object-oriented Programming),OOA(Object-oriented Analysis), OOD(Object-oriented Design)
随着80年代Smalltalk-80等一系列描述能力较强、执行效率较高的面向对象编程语言的出现,标志着面向对象的方法与技术开始走向实用。当时就有人曾经预言,面向对象(OO)将成为90年代计算机领域的主流技术,现在这个预言已经成为无可置疑的事实。人们对面向对象的研究重点,从面向对象的编程(OOP),转移到面向对象的分析与设计(OOA与OOD)。本文概述面向对象方法的发展过程,并对流行的几种主要OOA方法进行比较。最后,介绍面向对象方法当前主要研究领域。
一、 面向对象方法的产生与发展
面向对象方法起源于面向对象的编程语言,在编程语言这个领域,它的诞生与发展经历了下述主要阶段。
1、雏形阶段
面向对象方法的某些概念,如"对象"、"对象属性"等可以追溯到50年代的人工智能早期研究。但是人们一般把60年代由挪威计算中心开发的Simula67语言看作面向对象语言发展史上的第一个里程碑。对于Simula67是不是面向对象的语言,评论者意见不一,但共同的看法是它确实具有一些面向对象的重要特征,被称作面向对象语言的先驱。
70年代出现的CLU、并发Pascal、Ada和Modula-2等编程语言对抽象数据类型理论的发展起到了重要作用。这些语言支持数据与操作的封装。例如,Ada语言中的package和并发Pascal语言中的class和monitor,都是数据与操作的结合体并且支持信息隐蔽,已经是比较完善的封装概念。但这些语言都不支持继承,这是它们与面向对象语言的主要差距。
一般认为,继承和封装是面向对象的编程语言两个最主要的特征。上述语言各自从不同的侧面局部地引入了这些概念并提供支持机制,但是都不全面。此外,这一时期在与上述语言有关的文献中并没有把面向对象作为一种完整的、系统的方法论加以论述和倡导,只是后人在研究面向对象方法的发展史时从上述语言中找到了某些概念的渊源。因此这一时期面向对象只是处于萌芽状态和雏形阶段。
在稍晚于Simula67问世的时间,犹他大学的博士生Alan Kay为在个人计算机上开展图形学和模拟工作,设计了一个实验性的语言Flex。该语言从Simula67中借鉴了许多概念,如类、对象、继承等。由于当时软硬件条件的限制,Kay的尝试没有成功,但是他没有放弃自己的思想,在他加入Xerox公司Palo Alto研究中心(PARC)后继续进行了这一研究。
在PARC,Kay成为Dynabook项目组的成员,并成为该项目的软件Smalltalk的主要设计者。按照Kay在大学时的研究思路,吸收了Simula67中的类、对象、继承等概念,借鉴了CLU语言的抽象数据类型以及LISP语言的一些思路,并受到LOGO语言用"画笔"类描述海龟行为的启发,Kay和他的同事设计了Smalltalk语言。1972年PARC发布了该语言的第一个版本Smalltalk-72,其中正式使用了"面向对象"这个术语。Smalltalk的目标是使软件开发者能用一些尽可能独立的(或者说自治的)单位来进行软件开发。按有关文献的说法,在Smalltalk中任何东西都是对象,即类的实例。对象具有封装性,因此是一个较为独立的程序单位。所有的对象都是类的实例;类有超类、子类之分,子类继承超类的所有信息。作为面向对象语言主要特征的继承与封装,在Smalltalk中都具备了。因此,Smalltalk的问世标志着面向对象程序设计方法的正式形成。但是这个时期的Smalltalk语言还不够完善,被看作一种研究性和实验性的工作。
2、完善阶段
从70年代初到80年代,PARC一直坚持对Smalltalk的研究与改进。几经修改,先后 发布了Smalltalk-72,76,78等版本,直到1981年推出该语言最完善的版本Smalltalk-80,Smalltalk-80的问世被认为是面向对象语言发展史上最重要的里程碑。迄今人们所采用的绝大部分面向对象的基本概念及其支持机制在Smalltalk-80中都已具备,它是第一个完善的、能够实际应用的面向对象语言。它的发布使越来越多的人认识并接受了面向对象的思想,形成了一种崭新的程序设计风格,引发了计算机软件领域一场意义深远的变革。此外,Smalltalk-80不仅是一个编程语言,而且是一个具有类库支持和交互式图形用户界面的编程环境,这对于它的迅速流传也起到了很好的作用。
但是直到80年代后期,Smalltalk的应用尚不够广泛,这种情况与它在学术上的重大影响相比显得很不相称,其原因有以下几点:
(1)面向对象作为一种崭新的软件方法学被广泛接受需要一定的时间。
(2)Smalltalk的商品化软件开发工作到1987年才开始进行。
(3)追求纯OO的宗旨(例如严格的封装)使许多讲究实效的软件开发人员感到不便。
3、繁荣阶段
自80年代中期到90年代,是面向对象语言走向繁荣的阶段。其主要表现是大批比较实用的OOPL的涌现,例如C++,Objective-C,Object Pascal, CLOS(Common Lisp Object System),Eiffel,Actor等等。
在这些语言中,Eiffel和Actor也和Smalltalk一样,属于纯面向对象语言,其余几种被称作混合型面向对象语言。这时纯OO语言也比较重视实用性,例如Eiffel提供了强有力的开发工具,为解决多继承命名冲突提供了更名机制,并允许程序员用export语句控制对象的可见性。Smalltalk自1987年起也开发了商品化的版本。混合型的语言是在传统的过程式语言中增加面向对象的语言成分。这类语言在实用性方面具有更大的优势:以某种被广泛使用的传统语言为基础进行扩充,并做到向后兼容,从而更容易被众多的编程人员接受。这里特别值得一提的是C++,它是在C语言基础上扩充的,对C兼容,并且从开始研制就十分重视代码的执行效率(近几年推出的C++版本代码执行效率已经与C语言相差无几)。所以C++已成为目前应用最广泛的OOPL,国内外大量的软件开发单位已十分重视程序员具有C++的编程技能。
从最近的动态看,C++的销售总量仍居首位,但Smalltalk的销售增长率却一度超过C++。这说明,许多单位为了在软件开发中更彻底的运用OO方法而宁愿承受一些效率上的损失。
面向对象的编程语言的繁荣是面向对象方法走向实用的重要标志,也是面向对象方法在计算机学术界、产业界和教育界受到越来越高的重视的推动力。进入90年代以来,仍不断有新的OOPL的问世,许多非OO语言增加了OO概念与机制而发展为OO语言。这表明OOPL的繁荣仍在继续,也表明面向对象是今后的大势所趋。
二、 OO方法发展到软件工程的前期阶段
自80年代末期到90年代,一个意义颇为深远的动向是,面向对象的方法与技术向 着软件生命期的前期阶段发展。即:人们对面向对象方法的研究与运用,不再局限于编程阶段,而是从系统分析和系统设计阶段就开始采用面向对象方法。这标志着面向对象方法已经发展成一种完整的方法论和系统化的技术体系。
在计算机软件领域,很多新的方法与技术都是从编程阶段首先出现,进而发展到软件生命期的前期阶段。例如大家熟悉的结构化方法,开始提出时叫做"结构化程序设计",它引出了一系列的结构化编程语言,最后发展到"结构化分析"和"结构化设计"。又如形式化方法,最早的形式化语言是编程语言,后来才着眼于研究对需求分析和设计的形式化描述,出现了形式化规约语言。软件复用技术也是从程序(可执行程序或源代码)的复用发展到分析结果和设计结果的重用。上述现象的出现并不奇怪。说到底,人们对软件本身的认识,开始也只是着眼于编程,后来才形成了从分析、设计到编程、测试与维护一整套的软件工程体系。
与上述种种方法与技术相比,面向对象的方法与技术发展到软件生命期的前期阶段有着更为深刻的意义。因为面向对象方法的本质,就是主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的思维方法来认识、理解和描述客观事物,强调最终建立的系统能够映射问题域,即:系统中的对象以及对象之间的关系能够如实地反映问题域中固有事物及其关系。这恰恰是从分析和设计阶段入手才能根本解决的问题。试想,在一个软件开发单位,如果只拥有一批会使用某种OOPL(例如C++)的程序员,而分析与设计依然采用传统的方法,则程序员的编程技巧再熟练,也难以透过传统的方法产生的分析及设计文档(例如数据流图和模块结构图)而看透现实世界中事物的本来面貌;纵然在程序中定义了一些类及对象,也很难直接地映射现实世界中的事物。从这个意义上讲,软件生命期的前期阶段,正是面向对象方法最能从根本上发挥其优势的领域。OOA和OOD的出现是面向对象方法发展的必然结果,也是它走向完善,走向实用的重要标志。这并不是说,在OOA和OOD出现之前人们对面向对象技术的运用效果可以一笔抹杀。实际上,对一些小型系统而言,开发人员常常是根据面向对象方法的基本原则,首先在头脑中(或纸面上)进行构思,决定系统中要设立哪些类及对象,然后才用面向对象的语言去编程。应该说,这种开发方式确实是面向对象的,也能够产生一些相当不错的小型系统。但是对大系统而言,事情就不那么简单了。一是问题域、系统责任以及与实现有关的因素要复杂的多;二是这样的系统不可能由少数几个人从头到尾地完成,而要有不同开发阶段的分工。它的分析和设计不是在头脑中想一想或者在草稿纸上构画一下就能解决的。它需要一种完整的面向对象的系统模型;需要一整套针对分析与设计阶段的方法、策略与技巧;还需要一套便于分析人员、设计人员、编程人员、管理人员以及用户彼此沟通的一致的基本表示。这些正是面向对象的分析和面向对象设计所要解决的问题。
从80年代后期开始,国际上有一批论述面向对象的分析与设计(或面向对象的建模与设计)的专著相继问世。这些著作的共同点是把面向对象在分析与设计阶段的运用提升到理论和工程的高度(而不仅仅是一些可供参考的指导思想),各自提出了一套较为完整的系统模型、表示法和实施策略。同时,在模型、表示法和策略等方面,彼此又各有差异)。
三、各种OOA方法比较
自80年代后期以来,相继出现了多种OOA及OOD方法,现将其中影响较大的十种 ,列举如下:
.Beard方法
.Booch方法
Booch方法把系统的开发工作分为两个部分:微观过程和宏观过程。微观过程主要用于建立一个反复、递增的开发框架,而宏观过程用来对微观过程进行控制。Booch'93方法的微观过程是由脚本和产品的体系结构驱动的,它由四步组成,如图1所示。
图 一
Booch'93方法的宏观过程控制着开发过程中的许多活动,这些活动有益于开发人员评估开发风险并且及时纠正微观过程中的各种错误。宏观过程关心的是开发过程中的管理方面。宏观过程由五步组成。如图2所示。
图 二
.Coad-Yourdon方法
.Firesmith方法
.Jacobson方法(简称OOSE)
OOSE(Object-Oriented Software Engineering)方法是一个使用事例(use case)驱动的方法,它建立的所有模型都是以使用事例模型为基础的。OOSE方法的主要特点是能够较好地描述系统的需求。
.Martin-Odell方法
.Rumbaugh方法(简称OMT)
OMT(Object Modeling Technique)方法覆盖了应用开发的全过程,包括分析、设计和实现。在分析阶段,OMT方法强调对系统和相关领域的理解,并在此基础上建立模型。分析阶段的模型由三部分组成:对象模型、动态模型和功能模型。OMT方法突出的特点是在分析阶段,它可以较为全面的描述系统的静态结构。
.Seidewitz-Stark方法
.Shlaer-Mellor方法
.Wirfs-Brock方法
以下几个方面是人们评论、比较各种OOA/OOD方法的主要着眼点。各种OOA方法都要涉及到这些方面,并在这些方面表现了各种方法的相似与不同。
1、概念
一种OOA方法要采用哪些面向对象的概念?几十年来关于面向对象的研究与讨论 已经提出了许多OO概念,有些概念又包括许多种具有细微区别的子概念(例如有几十种"类"和几十种"对象")。对这些概念并不是采用越多、辨别越细微就越好,过多的概念和过细的概念区别会使方法变得太复杂,影响其可用性。
多种OOA方法在概念方面的差别体现在:概念的取舍不同;同一术语的概念定义不同(但在这一点上往往是措词不同而涵义相近);对同一概念使用的术语不同。
此外,有些OOA方法不同程度地采用了一些非OO方法的概念(例如Rumbaugh方法的功能模型,使用了数据流和加工)。这一点是衡量该方法是不是纯OO的重要因素。
2、原则
对于面向对象方法所提倡的原则,各种OOA方法遵从的程度有所不同,例如有的方法不体现数据与操作的封装,有的方法不支持操作的继承。
3、表示法及详细说明规范
各种OOA方法都提出了一套表示OO概念(如类、对象、属性、服务)并体现OO 原则(如继承、消息通信)的表示法,采用一些图形符号,作为建立OOA模型的图元。除图形表示之外,还规定了一套建立系统成分详细说明的文档规范。
各种OOA方法在表示法上的差别体现了所采用的概念与原则的不同。对相同的概念,各种方法采用的表示符号也不尽相同。
4、OOA模型
OOA模型就是通过面向对象的分析建立的系统逻辑模型,它以基本表示法的图形符 为图元,表达OOA阶段所认识的系统成分及彼此之间的关系,在系统的全局范围内构成完整的图形表示。各种OOA方法所产生的OOA模型从整体形态、结构框架到具体内容都有较大的差异,例如有的方法采用分别刻画系统某一侧面的若干个模型(如对象模型、动态模型、事件模型、状态模型、功能模型等等)构成对整个系统的逻辑表示;有的方法则通过各种信息的叠加产生一个统一的系统模型。OOA模型的差异最集中地体现了各种OOA方法在概念、表示法、执行过程等方面的不同,特别是体现了各种方法所强调的重点和该方法的主要特色。一般来说各种方法只把它认为最重要的信息放在模型中表示,其它信息则放到详细说明中,作为对模型的补充描述和后续开发阶段的实施细则。
5、过程
各种OOA方法一般都要规定一些进行实际分析工作的具体步骤,指出每个步骤应 该做什么及如何做,并给出一些策略与启发(告诉使用者对各种情况应该怎样处理以及从哪些方面去思考有助于实现自己的目标)。
各种OOA方法在概念和模型方面的差别都将在其过程中反映出来。过程的详简也各有差异。有些方法为了强调过程中的各个步骤不要求按照固定的次序进行,故不称"步骤"而称"活动"。
6、技术支持
一种OOA方法最终能否被广泛采用,要看是否能提供必要的技术支持。最重要的技术支持包括:CASE工具、技术资料(包括书籍)、培训计划等。
四、当前的研究及实践领域
面向对象方法自诞生以来经历了二十多年的发展历程,目前已进入计算机科学的各个分支领域,并且在这些领域中继续发展,以下进行一些简要的介绍。
1、面向对象的编程语言
OOPL是面向对象方法的发源地,也是最成熟的领域。但是仍然有许多问题需要研 究和解决。例如:对象语义、永久对象的表示及处理、对象之间关系的永久性存储、主动对象的表示及处理、分布式对象及其消息、与数据库管理系统的接口等等。
2、面向对象的分析和面向对象的设计
把面向对象方法运用于需求分析和系统设计。其理论及工程体系自80年代末期开 始形成,目前仍在不断地发展和健全。
3、面向对象的数据库
OODB是面向对象方法与数据库技术的结合领域。OODB既需要具备传统数据库的 必备功能,也需要具有面向对象方法的基本特征。例如:采用面向对象的数据模型,把对象作为存储与检索单位,支持继承与封装,提供面向对象的数据定义语言和数据操纵语言等等。目前OODB的研究与开发有三种途径:
.在传统的数据库管理系统中增加面向对象的功能;
.在面向对象的编程语言中增加数据库的功能;
.开发全新的、自成体系的面向对象的数据库。OODB是目前的一个研究热点,需要解决的问题既有理论方面的也有技术方面的。
4、面向对象的软件开发环境
面向对象的软件开发环境的历史几乎和面向对象的编程语言一样久远。第一个最有 影响的面向对象编程语言Smalltalk-80同时又是第一个面向对象的开发环境。其后出现的环境有Macintosh的MacApp环境。NeXT计算机及环境、Eiffel语言及环境等等。然而在90年代,人们对面向对象的软件开发环境寄予更高的希望,比较理想的环境应该具有下述功能:
.有一个支持复用和共享的类库及其浏览、维护界面;
.有一个存储并管理永久对象的对象管理系统(OMS)
.有一个或多个基于类库和OMS的面向对象的编程语言;
.提供一套覆盖软件生命周期各阶段的面向对象的开发工具;
.提供面向对象的编程语言与数据库的接口机制;
.支持面向对象的用户界面开发;
.具有传统的软件工程开发环境中所具有的必要功能,如配置管理、版本管理、权限管理等;
.支持软件工具的紧密集成并具有开放性。
5、面向对象的图形用户界面开发技术
图形用户界面(GUI)的开发在整个软件系统的开发中占有相当大的比例,提高GUI的开发效率是人们多年来的奋斗目标。面向对象的方法与技术为从更根本上提高GUI的开发效率带来了新的生机,其主要途径有:
.使用户掌握面向对象的界面的设计功能,在现有的技术支持下尽可能提高应用程序的对象化程序;
.研制面向对象的GUI开发系统及界面描述语言;
.以现有的GUI开发系统为基础,为常用的界面成分开发符合流行的OOPL语法的界面类,建立界面类库;
.提供相应的界面辅助生成工具。
6、面向对象的智能程序设计
把面向对象方法运用于智能程序设计领域。例如:用对象描述知识系统中的智能 实体,用对象的属性表示实体所包含的知识,用服务表示其智能行为。面向对象方法在人工智能领域具有先天性的适应能力,它的概念、原则及表示法比其他任何软件方法更接近人类的知识结构和智能活动。例如特殊类与一般类之间的"is-a-kind-of"关系,部分对象和整体对象之间的"part of "关系,这本身就包含了许多知识信息,在很多情况下可以使知识的表示更为简单明晰,更接近事物的本来面貌和人类的自然思维方式。
7、面向对象的体系结构
研究能够支持对象的存储、管理及协同运行的计算机体系结构。这种新型的计算机 体系结构,连同支持面向对象技术的新型操作系统,可望从根本上提高面向对象的软件开发效率和运行效率,并形成从硬件到操作系统、语言、界面及上层应用支持系统一体化的面向对象的开发及运行环境。
五、结束语
面向对象方法以其自身特有的优势正逐步成为计算机领域的主流技术。随着各种面向对象方法和技术的不断完善和发展,必将愈加显示出其优越性和生命力。
参 考 文 献
1、Rumbaugh J, Blaha M, Premerlani W et al. Object-Oriented Modeling and Design. Englewood Cliffs, NJ: Prentice-Hall, 1991
2、Coad P and Yourdon E. Object-Oriented Design. Englewood Cliffs,NJ:Prentice-Hall, 1991
3、Krueger C W. Software Reuse . ACM Computer Survey,1992,24(1)
4、Coad,P., Yourdon,E著,邵维忠等译,面向对象的分析,北京大学出版社,1992年2月第一版
5、Coad,P., Yourdon,E著,邵维忠等译,面向对象的设计,北京大学出版社,1994年12月第一版
6、邵维忠、杨芙清,面向对象的分析,清华大学出版社,1998年12月
7、杨芙清 软件复用及相关技术,计算机科学,1999,26(5)