“面向对象”是软件程序设计中的一种新思想,由于这种新思想的引入,使我们的程序设 计能更加贴近现实,并且花费更小的精力。本章主要介绍“面向对象”思想的由来和面向对象 的程序设计方法。 11面向对象思想的由来 对象”一词在现实生活中经常会遇到,它表示现实世界中的某个具体的事物。 社会的不断进步和计算机科学的不断发展是相互促进的,一方面计算机科学的发展推 动了社会的发展,计算机的广泛应用给整个社会生产力带来了勃勃生机;另一方面社会的发 展,又给计算机科学提出了许多新的要求计算机科学只有不断地进行自身提高和自身完 善,才能适应不断进步的社会生产力的需要。随着计算机的普及应用,人们越来越希望能更 直接与计算机进行交互,而不需要经过专门学习和长时间训练后才能使用它这一强烈愿望 使软件设计人员的负担越来越重,也为计算机领域自身的发展提出了新的要求。利用传统的 程序设计思想无法满足这一要求人们就开始寻求一种更能反映人类解决问题的自然方法 “面向对象”技术就是在这样的情况下产生的。 面向对象”技术追求的是软件系统对现实世界的直接模拟,尽量实现将现实世界中的 事物直接映射到软件系统的解空间它希望用户用最小的气力,最大程度地利用软件系统来 解决问题 现实世界中的事物可分为两大部分,即物质和意识物质表达的是具体的事物;意识描 述的是某一个抽象的概念。例如“自行车”和“这辆白色的自行车”“这辆白色的自行车”是物 质,它是具体的客观存在;“自行车”是意识,它是一个抽象的概念,是对客观存在的事物的 种概括这些现实世界中的事物可直接映射到面向对象系统的解空间,现实世界中的物质 对应于面向对象系统中的“对象”,现实世界中的意识可对应面向对象系统中的抽象概念 类自行车在面向对象系统中可用自行车类来表达,一辆白色的自行车在面向对象系统 中是一个具体的对象,是自行车类的一个实例。如图1.1所示。 现实问题空间 面向对象解空间 物质 具体事物 辆白色的自行车 一个对象—一自行车的实例 抽象概念 自行车 自行车类 图1.1现实世界与面向对象系统之间的对应关系
2面向对象程序设计 面向对象程序设计是软件系统设计与实现的新方法,这种新方法是通过增加软什可扩 充性和可重用性,来改善并提高程序员的生产能力,并控制维护软件的复杂性和软件维护的 开销。 到底什么是面向对象程序设计?在我们对它给出解释之前,需要首先讨论一下结构化 程序设计。 1.什么是结构化程序设计( Structure Programming) 结构化程序设计是60年代诞生的,在70年代到80年代已遍及全球,成为所有软件开 发设计领域及每个程序员都釆用的程序设计方法,它的产生和发展形成了现代软件工程的 基础。 结构化程序设计的设计思路是:自顶向下逐步求精;其程序结构是按功能划分若干个 基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立; 每模块內邵均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用 子程序。 结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的手段,从而有 效地将一个较复杂的程序系统的设计任务分成许多易于控制和处理的子任务,这些子任务 都是可独立编程的子程序模块,这些子程序中的每一个都有一个清晰的界面使用起来非常 方便。 结构化程序设计方法虽然具有很多的优点,但它仍是一种面向数据/过程的设计方法 它把数据和过程分离为相互独立的实体,程序员在编程时必须时刻考虑所要处理的数据的 格式。对于不同的数据格式即使要做同样的处理或对相同的数据格式要做不同的处理都需 编写不同的程序。因此结构化程序的可重用性不好。另一方面,当数据和过程相互独立时, 总存在着用错误的数据调用正确的程序模块或用正确的数据调用了错误的程序模块的可能 性。因此,要使数据与程序始终保持相容,已经成为程序员的一个沉重负担。上述这些问题 结构化程序设计方法本身是解决不了的,它需要借助于我们下面要讨论的面向对象程序设 计方法给予解决。 2.什么是面向对象程序设计( Object Oriented Programming 筒称OoP) 面向对象程序设计既吸取了结构化程序设计的一切优点,又考虑了现实世界与面向对 象解空间的映射关系它所追求的目标是将现实世界的问题求解尽可能简单化 面向对象程序设计将数据及对数据的操作放在一起,作为一个相互依存、不可分割的整 体来处理,它采用数据抽象和信息隐藏技术它将对象及对对象的操作抽象成一种新的数据 类型—类,并且考虑不同对象之间的联系和对象类的重用性 例如我们可以将各种各样的自行车抽象成一个自行车类,它所包含的数据内容有架子 尺寸、车轮尺寸、颜色和原材料等,它所具有的操作有转弯、移动和修理等。每一辆具体的自 行车就是属于自行车类的一个对象如图1.2所示
自行车类 目行车对象 架子尺寸 车轮尺小 颜色 原材料 数据扯象 操作: 转弯 移动 图1.2对象和类 面向对象程序设计优于传统的结构化程序设计,其优越性表现在,它有希望解决软件工 程的两个主要间题—软件复余性控制和软件生产率的提高,此外它还符合人类的思维习 惯能够自然地表现现实世界的实体和问题,它对软件开发过程具有重要意义。 面向对象程序设计能支持的软件开发策略有 编写可重用代码; 编写可维护的代码 共享代码; 精化已有的代码 有了高质量的可重用代码就能有效地降低软件的复杂度和提高开发效率。面向对象方 法,尤其是它的继承性,是一种代码重用的有效途径。开发者在设计软件时可以利用一些已 经被精心设计好并且经过测试的代码,这些可重用的代码被组织和存放在程序设计环境的 类库中。由于类库中的这些类的存在,使以后的程序设计过程变得简单,程序的复杂性不断 降低、正确性不断加强,也越来越易于理解、修改和扩充 1.3面向对象程序设计语言 面向对象程序设计语言必须支持抽象数据类型和继承性。但是在某些不支持抽象数据 类型的程序设计语言中,可以使用特别的编程技术和约束规则在一定程度上实现抽象数据 类型,这是一种把抽象数据类型看待成程序设计方法的观点。因此有人认为,用传统的程序 设计语言也能在一定程度上进行面向对象的程序设计,这是一种把面向对象看待成编程技 巧的观点,并不是真正意义上的面向对象编程面向对象的程序设计语言则提供了特定的语 法成分来保证和支持面向对象程序设计,并且提供了继承性、多态性和动态链接机制,使得 类和类库成为可重用的程序模块 面向对象程序语言经历了一个比较长的发展阶段,下面我们从几个大的家族来介绍面 向对象程序语言的发展
家族 LISP是50年代开发出来的一种语言,它以表处理为特色,是一种人工智能语言。70年 代以来,在LISP基础上开发了很多IISP家族的面向对象语言 (1) Flavors它是M的 Lisp Machine小组于1979年设计而成的,它的基语言是 Symbolics Common Lisp。1981,1985年 Symbolics公司又推出了它的新版本,它的设计目 标是支持程序的模块性,便于大型复杂软件的开发,并尽可能提高运行效率。这是一个基于 ISP的OOP语言版木 (2) LOOPS LOOPS即 Lisp Object- Oriented Programming System,是在In terLisp-D环境上实现的、基于Lisp的OOP语言版本。它支持类变量、缺省值、域属性、主动 值等概念,是形成 CommonLOOPS, CommonObjects和CLOS语言的基础 (3) Common LOOPS它是在 LOOPS和 Flavors的基础上实现的,其中的元对象概 念有助于系统的有效实现,它还支持OOP的一些复杂概念,如组合对象、多重继承等。 (4) Cammon objects它是HP公司经过三年(1983-1985的努力设计实现的,是 基于 CommonLisp的OOP语言版本,1985年推出新版本,新版本具有能支持多重继承、严 格的封装机制、类名更换、类重定义等功能 (5) CLOS CLOS即 Common Lisp Object System,它是LISP家族在OOP语言的 个分支。 2. Simula Simula语言是60年代开发出来的,在 Simula中引入了几个面向对象程序设计语言中 最重要的概念和特性,即,数据抽象的概念类机构和继承性机制。 Simula67是它具有代表 性的一个版本,70年代发展起来的CLU,Ada, Modula-2等语言是在它的基础上发展起来 的 3. Smalltalk malltalk是第一个真正的面向对象程序语言,它体现了纯粹的OOP设计思想,是最纯 的OOP语言。它起源于 Simula语言。在 Smalltalk的发展过程中推出了许多版本: ①Smlk-72它是第一个正式的 Smalltalk解释器版本。 ② Smalltalk-74它第一次加上了多窗口界面,这是 Smalltalk系统的一大特点 ③ Smalltalk-78在此版本中第次采用了中间代码的设计,并用微指令实现了中间 代码,大大提高了系统速度,使该系统第一次具有了可用性 ④ Smalltalk-80是 smalltalk中最成功的一个版本,它在系统的设计中强调对象概念 的统一,并引入和完善了类、方法、实例等概念和术语,应用了继承机制和动态连接。它被看 作是一种最纯粹的面向对象程序设计语言。在其后围绕“面向对象”所进行的研究和讨论有 很大一部分都是以它为基础的。 尽管 Smalitalk不断完善,但在那个时期,面向对象程序设计语言并没有得到广泛的重 视,程序设计的主流仍然为结构化程序设计语言所控制
4.C家族 在80年代,C语言成为一种极其流行,应用非常广泛的语言。C++是在C语言的基础 上进行扩充,并增加了类似 Smalltalk语言中相应的对象机制,它将“类”看作是用户定义类 型,使其扩充比较自然。C+十以其高效的执行赢得了广大程序设计者的喜爱,在C+十中提 供了对传统语言C的向后兼容性,因此,很多已有的程序稍加改造就可以重用,许多有效的 算法也可以重新利用。它是一种混合型的面向对象程序设计语言,由于它的出现,才使面向 对象的程序设计语言越来越得到重视和广泛的应用。 C++有很多种类,如MSC十十, Turbo C++, Borland c++和Ⅴ isual c++等,每 种又有几个版本与之相对应。 除上述四大类面向对象的程序语言之外,还有一些,如 PASCAL的面向对象版本Tu PASCAL, Object PASCAL, Basic的面向对象版本 Visual basic等。 综观所有的面向对象程序语言,我们可以把它们分为两大类:纯粹的面向对象语言和 混合型的面向对象语言。在纯粹的面向对象语言中,几乎所有的语言成分都是“对象”,这类 语言强调开发快速原型的能力;而混合型的面向对象语言是在原传统的过程化语言中加入 各种面向对象的话言机构,它所强调的是运行效率 1.4面向对象方法在大型程序设计中的应用 首先找们要明确一卜,什么样的程序才称为大型程序。我们讲的大型程序,并不单单指 最终解决问题的程序行数,而是指待解决问题的复杂程度,当然在通常情况下,程序的大小 在一定程度上反映问题的复杂程度。 大型程序的复杂性主要表现在两个方面,一方面,由于大型程序必须由多人合作完成, 如何划分任务、估计和分配资源、掌握每个程序员的进度、控制及检查每个阶段的设计标准 等。这就构成了进行大型程序设计时管理的复杂性,也是大型程序设计与单人能够完成的小 型程序设计的一个重要区别;另一方面大型程序具有大量的系统状态,我们要正确地处理 它的中间状态,组织系统的程序逻辑和验证系统的正确性都是比较困难的 对于大型程序,正确性是程序的首要目标,程序的任一微小错误都会造成重大的损失, 并且大型程序设计的周期长,且需要多人合作,不可避免地要出现一些错误。 但是,对于一个大型程序,仅仅满足正确性是远远不够的,易维护性、可读性和可重用性 都是非常重要的,这是因为要想在短期内重新开发一个大型程序是不可能的。易维护性能 使程序在出现错误时,得到及时的政正;可读性又可以保证程序易于理解便于使用和调试, 从而使程序功能得以充分的发挥;可重用性可以使一个程序中开发的通用模块能够在其它 程序中再次使用从而节省开发费用,简化程序的部分复杂性 在开发一个大型系统时,应对整个任务进行清晰的、严格的划分,使每个程序员清晰地 了解自己要做的工作以及与他人的接口,使每个程序员可以独立地设计调试自己负责的模 块使各模块能顺利地应用到整个系统中去。 大型程序在设计时采用模块化的办法将一个问题分解成若干个小问题,而每一个小问 题又可以再分解成更小的问题每个小问题都可以是一个独立的模块,这些模块都有一个清