摘 要:面向对象程序设计始于面向对象程序设计语言的出现,它产生的直接原因是为了提高程序的抽象程度,以控制软件的复杂性。与结构化程序设计比较,面向对象程序设计更易于实现对现实世界的描述,因而得到了迅速发展,对整个软件开发过程产生了深刻影响。
关键词:面向对象,程序设计
引言
伴随着软件产业的蓬勃发展,软件系统变得越来越复杂,开发成本越来越高,而且在开发过程出现一系列问题,典型的例子是IBM360操作系统。这一系统经历四年时间才完成,并不断修改、补充,但每一文本仍存在上千条的错误。这种软件开发与维护过程中遇到的一系列严重问题被人们称为“软件危机”。出现软件危机的原因是多方面的,如软件需求变化频繁,开发工具落后等。人们尝试从不同角度、不同层次来解决,比如严格确定软件需求、采用新的开发模型、采用计算机辅助工具等。
面向对象程序设计就是在这一大环境中产生的。在面向对象程序设计语言(下文简称为面向对象语言)产生之后,面向对象程序设计逐步成为编码的主流,其中所蕴涵的面向对象的思想不断向开发过程的上游和下游发展,形成现在的面向对象分析、面向对象设计、面向对象测试等,并一起逐步发展为面向对象软件开发方法。
1.历史回顾
1967年挪威计算中心的Kisten Nygaard和Ole Johan Dahl开发了Simula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,它被认为是第一个面向对象语言。20世纪70年代初,Palo Alto研究中心的Alan Kay所在的研究小组开发出Smalltalk语言,之后又开发出Smalltalk-80,Smalltalk-80被认为是最纯正的面向对象语言,它对后来出现的面向对象语言,如Object-C,C++,Self,Eiffl都产生了深远的影响。随着面向对象语言的出现,面向对象程序设计也就应运而生且得到迅速发展。之后,面向对象不断向其他阶段渗透,1980年Grady Booch提出了面向对象设计的概念,之后面向对象分析开始。1985年,第一个商用面向对象数据库问世。1990年以来,面向对象分析、测试、度量和管理等研究都得到长足发展。
实际上,“对象”和“对象的属性”这样的概念可以追溯到20世纪50年代初,它们首先出现于关于人工智能的早期著作中。但是出现了面向对象语言之后,面向对象思想才得到了迅速的发展。过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,到高级语言,直到面向对象语言。汇编语言出现后,程序员就避免了直接使用0-1,而是利用符号来表示机器指令,从而更方便地编写程序;当程序规模继续增长的时候,出现了Fortran、C、Pascal等高级语言,这些高级语言使得编写复杂的程序变得容易,程序员们可以更好地对付日益增加的复杂性。但是,如果软件系统达到一定规模,即使应用结构化程序设计方法,局势仍将变得不可控制。作为一种降低复杂性的工具,面向对象语言产生了,面向对象程序设计也随之产生。
2.面向对象程序设计的基本概念
面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。
1)对象
对象是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。
2)类
类是具有相同类型的对象的抽象。一个对象所包含的所有数据和代码可以通过类来构造。
3)封装
封装是将数据和代码捆绑到一起,避免了外界的干扰和不确定性。对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。
4)继承
继承是让某个类型的对象获得另一个类型的对象的特征。通过继承可以实现代码的重用:从已存在的类派生出的一个新类将自动具有原来那个类的特性,同时,它还可以拥有自己的新特性。
5)多态
多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。
6)动态绑定
绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。
7)消息传递
对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。
3.面向对象语言
一个语言要称为面向对象语言必须支持几个主要面向对象的概念。根据支持程度的不同,通常所说的面向对象语言可以分成两类:基于对象的语言,面向对象的语言。
基于对象的语言仅支持类和对象,而面向对象的语言支持的概念包括:类与对象、继承、多态。举例来说,Ada就是一个典型的基于对象的语言,因为它不支持继承、多态,此外其他基于对象的语言还有Alphard、CLU、Euclid、Modula。面向对象的语言中一部分是新发明的语言,如Smalltalk、Java,这些语言本身往往吸取了其他语言的精华,而又尽量剔除他们的不足,因此面向对象的特征特别明显,充满了蓬勃的生机;另外一些则是对现有的语言进行改造,增加面向对象的特征演化而来的。如由Pascal发展而来的Object Pascal,由C发展而来的Objective-C,C++,由Ada发展而来的Ada 95等,这些语言保留着对原有语言的兼容,并不是纯粹的面向对象语言,但由于其前身往往是有一定影响的语言,因此这些语言依然宝刀不老,在程序设计语言中占有十分重要的地位。
4.面向对象程序设计的优点
面向对象出现以前,结构化程序设计是程序设计的主流,结构化程序设计又称为面向过程的程序设计。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数(在此泛指例程、函数、过程)用于完成这些任务,解决问题的焦点集中于函数。其中函数是面向过程的,即它关注如何根据规定的条件完成指定的任务。
在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。每个函数都可以具有它们自己的局部数据。下图显示了一个面向过程程序中函数和数据的关系。
图1 面向过程程序设计中函数和数据的关系示例
这种结构很容易造成全局数据在无意中被其他函数改动,因而程序的正确性不易保证。面向对象程序设计的出发点之一就是弥补面向过程程序设计中的一些缺点:对象是程序的基本元素,它将数据和操作紧密地连结在一起,并保护数据不会被外界的函数意外地改变。下图显示了一个面向对象程序中对象与函数和数据的关系。
图2 面向对象程序设计中函数和数据的关系示例
比较面向对象程序设计和面向过程程序设计,还可以得到面向对象程序设计的其他优点:
1)数据抽象的概念可以在保持外部接口不变的情况下改变内部实现,从而减少甚至避免对外界的干扰;
2)通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度;
3)结合面向对象分析、面向对象设计,允许将问题域中的对象直接映射到程序中,减少软件开发过程中中间环节的转换过程;
4)通过对对象的辨别、划分可以将软件系统分割为若干相对为独立的部分,在一定程度上更便于控制软件复杂度;
6)以对象为中心的设计可以帮助开发人员从静态(属性)和动态(方法)两个方面把握问题,从而更好地实现系统;
7)通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级。
5.面向对象程序设计对软件开发过程的影响
尽管面向对象程序设计和面向对象语言正不断地取得进展,但程序设计并不是软件开发中问题的主要来源。相比之下,需求、分析和设计阶段的问题更加普遍,因此,面向对象方法越来越集中地关注软件开发的全过程。
随着面向对象方法的推广,它在处理复杂系统的分析和设计、分析和设计的重用等方面的应用前景越来越光明。面向对象方法强调从问题模型开始,然后识别对象并不断细化对象,这一方法在本质上就是迭代的、渐增的,因此,快速原型和反馈成了它的标准结构,开发过程成了一次次的迭代反复过程,对象成为分析、设计、编码、测试等阶段的共同的表达媒质,开发过程的重心从编码阶段向两端移动。
6.对面向对象程序设计的评价
面向对象程序设计在软件开发领域引起了大幅度变革,极大地提高了软件开发的生产率,为解决软件危机带来了一线光明。Maurice Wilkes在图灵奖颁奖仪式上说:“对象是软件界70年代以来最激动人心的革新之一。”
但现实中仍然存在着不同的声音,两位美国学者(Stave Halladay 和 Michael Wiebel)曾这样说:“一般的面向对象编程思路不过是一批乌合之众,把灵机一动、随机应变的技巧用于他们绞尽脑汁抽象出来的‘对象’而已。即使是最优秀的面向对象编程程序员,他们所能对付的极限也莫过于中等规模的开发项目。倘若程序员经验不足,系统规模又很大,那么采用面向对象只能把你引入漫无边际的泥沼之中。”
虽然事实表明,面向对象程序设计方法确实比结构化方法能更自然地表现现实世界,但它不是灵丹妙药,也有自己的不足。
结论
面向对象程序设计在软件产业中是一个带有革命性质的变革,但它也不是与以前的技术完全分离的。相反,以往的成功经验在它上面都得到了体现,如结构化程序设计中的“分解求精”的思想。
然而,面向对象程序设计,或者更广泛地说,面向对象方法学并非能解决所有问题的“银弹”,其发展还不够成熟,它的应用领域正在不断地扩展,在这些已扩展的或将扩展的领域中还有许多问题等待着我们去付出真正的热情与努力。
参考文献
1.Stepen R. Schach著,袁兆山等译,软件工程Java语言实现,机械工业出版社,1999年9月,北京
2.周之英编著,现代软件工程——管理技术篇,科学出版社,1999年9月,北京
3.156ok,面向对象技术概述,山海网络,2002-3-25
4.156ok,面向对象软件工程方法学实践,山海网络,2002-3-25
5.156ok,转引软件工程专家网(http://www.21cmm.com),面向对象的软件开发,山海网络,2002-3-25
6.leasun翻译,http://www.cpp-home.com/,Ramchandra Garge,面向对象程序设计,中国程序员开发网络
7.http://www.javaworld.com/,Jeff·Friesen,面向对象语言基础一,中国程序员开发网络
8.http://www.javaworld.com/javaworld/jw-05-2001/jw-0504-java101.html,Jeff·Friesen,面向对象语言基础二,中国程序员开发网络