面向对象技术.docx

上传人:b****3 文档编号:5469802 上传时间:2022-12-16 格式:DOCX 页数:85 大小:12.53MB
下载 相关 举报
面向对象技术.docx_第1页
第1页 / 共85页
面向对象技术.docx_第2页
第2页 / 共85页
面向对象技术.docx_第3页
第3页 / 共85页
面向对象技术.docx_第4页
第4页 / 共85页
面向对象技术.docx_第5页
第5页 / 共85页
点击查看更多>>
下载资源
资源描述

面向对象技术.docx

《面向对象技术.docx》由会员分享,可在线阅读,更多相关《面向对象技术.docx(85页珍藏版)》请在冰豆网上搜索。

面向对象技术.docx

面向对象技术

第一章导论

1.1面向对象技术的发展

“对象”(object)一词可以说是源远流长,从亚里士多德的哲学论著,到笛卡尔的《哲学原理》,多次用过“对象”一词,但是“面向对象”一词的使用却只有三十余年的历史。

20世纪80年代以来“面向对象”一词的广泛使用,反映了计算机科学发展的需要。

计算机科学的发展与社会发展是相互促进的,计算机科学技术的发展推动了社会的现代化,计算机应用的广泛深入,也反过来对计算机科学提出了新的要求。

人们越来越希望能尽可能:

接地与计算机进行交互,而不再需要专门的训练。

这给计算机特别是软件领域的技术发展提出了更高的要求。

20世纪60年代末70年代初,软件设计人员普遍感到负担越来越重。

软件系统越来越庞大,.杂度越来越高,但仍然不能满足用户的需要,低效的软件生产率已越来越不适应软件的发展,因此,出现了软件工程、程序设计方法学等研究领域。

为了控制大型软件系统的复杂程度,必须解决以下两个问题:

第一,更新语言中的类型定义机制,使类型的内部表示细节尽可能对外不可见,使用程序不依赖于数据的某一具体表示;

第二,寻求连接模块的新方法,尽可能缩小模块间的界面。

为解决上述两个问题,必须更新模块概念,寻求访问类型数据的新方法。

因此,程序设计语言不断得到发展。

到了20世纪70年代,随着结构化程序设计方法的推广,开始出现面向对象的思想方法,例如SIMULA语言中出现了对象和类的概念。

进入80年代后,面向对象方法已经被广大程序设计人员所接受,Smalltalk语言和c++语言便是面向对象程序设计语言的典型代表。

1992年,北美CIO(ComputerInformationOrganization)的Deloitte和Touche所作年度总结报告中称,该年度中有30%的应用开发采用了面向对象技术,到1994年底,面向对象技术的利用率增加到70%。

著名大公司与机构纷纷将面向对象技术作为其组织中的主导技术,如Apple、IBM和HP三大公司联合投资一亿美元开发面向对象的软件环境,微软公司也斥巨资开发继WindowsNT之后的新一代面向对象的操作系统Cairo。

例如,一个美国公司,其主要业务是国防监控系统,在一个项目(为五艘战舰建立监控系统,包括命令、控制和通讯等功能)中采用了OOA和OOD技术,每艘战舰上安装的系统约含600多个程序,大约150万行代码,该系统的软件生产率比该公司未采用面向对象技术以前提高了一倍多。

这一提高主要得益于OOD的软件重用性,系统中有近一半代码可重用。

这使该公司一次性节省开发费用达400万。

780万美元。

还有一个美国的系统集成商,开发了一个基于大型机上MVS和CICS的财务管理软件包,采用OOA和OOD技术,系统包含约200万行代码,该集成商获得了每工程小时3.7行的生产率,比原来1.8行的生产率提高一倍多,节省开发费用约240万美元,并大大缩短了开发时间。

目前,面向对象技术已不仅仅局限于程序设计领域,而是逐步渗透到了软件开发、系统模拟和仿真、CAD/CIMS、图形处理、数据库组织与管理、人工智能和体系结构等计算机领域的各个方向,许多专家学者已j于始从认识方法论等基础理论的角度研究这一方法。

目前,面向对象已经出现了系统、技术、语言、工具/环境和方法学等研究分支。

1.2面向对象技术的特点

面向对象方法追求的是现实问题空间与软件系统解空间的直接模拟。

它希望用户用最小的气力,最大程度地利用软件系统来求解问题。

可以这样看,现实世界包含两大部分,也就是哲学的基本问题——物质和意识。

映射到面向对象系统的解空间就是意识部分:

抽象部分:

具体事物(对象)和抽象概念(类)。

如图1-1所示。

面向对象并非一种全新的技术方,面向对象技术中的主要思想和机制于20世纪60年代末便开始出现在“主流”语言(如C语言和Pascal语言)中,在SIMULA67中就更完整一些。

现实问题空间问题解空间面向对象的设计方法基于DavidParnas的信息隐蔽和JohnGuttag的抽象数据类型概念。

它把系统中所有资源,如数据、模块以及系统都看成对象,每个对象把一组数据和一组过程封装在一起,使得仅这一组过程可以对这组数据进行处理,并在定义对象时可以规定外界的请求权限。

使用这一方法,设计人员可以依照自己的意图创建自己的对象,并将问题映射到该对象上。

这一方法直接、自然,使设计人员把主要精力放在系统一级上,面对细节问题可以较少地关心。

面向对象方法有以下优点:

1模块性:

对象是一个功能和数据独立的单元,相互之间只能通过对象认可的途径进行通信。

互相没有预料不到的影响,也可以较为自由地为各个不同的软件系统所重用:

2封装功能:

为信息隐蔽提供具体的实现手段,用户不必清楚对象的内部细节,只要了解其功能描述就可以使用:

3代码共享:

继承性提供了一种代码共享的手段,可以避免重复的代码设计,使得面向对象的方法确实有效;

4灵活性:

对象的功能执行是在接收到消息时确定的,使得对象可以根据自身的特点进行功能实现,提高了程序设计的灵活性:

5易维护性:

对象实现了抽象和封装,使其中可能出现的错误限制在自身,传播,易于检错和修改:

不会向外传播,易于检错和修改。

6增量型设计:

面向对象系统可以通过继承机制不断扩充功能,而不影响原有软件的运行;

7局部存储与分布处理:

每个对象通过数据抽象和数据隐蔽将其内容和状态置于自身独立的存储结构中。

对象的处理也是自治的,由对象构成的整个系统的运行和处理是分布式的。

1.3面向对象方法学

面向对象技术是20世纪90年代计算机研究领域中广泛应用的技术,它既是一种软件开发方法,也可以作为一种建立系统的基础结构。

从广义来讲,面向对象的原则就是:

1一切事物皆为对象:

2任何系统(也是对象)均由对象构成;

3系统的发展和进化均由系统的内外部对象的相互作用完成。

从应用上看,Smalltalk语言是坚持上述三原则的最杰出代表,而C++和Java则在第一条原则上进行了许多修正。

首先它是一种从一般到特殊的演绎方法,也是一种分类方法。

一个按照面向对象方法设计的系统的构造恰好符合于这一演绎过程。

另外,面向对象系统又为人们对问题领域采用从特殊到一般的归纳方法提供了帮助由一大批相同或相似的对象构造出类的过程恰是这样一个归纳过程。

例如,动物世界可以由分类图示(图1-2)表征,这一图示基本上与面向对象方法的表示是一样的,这是一种演绎方法。

其中,每个结点表示一类动物,括号内表示该类对象的属性。

另一种认识方法是从特殊到一般的归纳方法。

我们今天看到一条猎狗,它是一个对象,

明天又看到一条警犬,它也是一个对象,这两个对象除了作用不同外,其它狗的特征完全一样。

这样,我们便可以构造一个类——“狗”,其中描述了狗的所有共同特征,如会叫、有犬齿、嗅觉灵敏、有颜色、忠实等等,而猎狗和警犬都是这个“狗”类的实例。

因此,面向对象很适合这种认识方法的组织(如图1-3)。

按图自上而下生成树,便是一种演绎方法,反之,自底向上观察树又是一种归纳方法。

面向对象既提供了从一般到特殊的演绎手段(如继承),又提供了从特殊到一般的归纳形式(如类等),从而说明它是一个很好的认知方法。

只不过目前以面向对象为基础的归纳方法的研究还不太深入并引起足够的重视。

狭义上看,OOSD(面向对象系统开发)=OOA(面向对象分析)+OOD(面向对象设计)+OOP(面向对象程序设计)。

其中,面向对象分析是系统分析师对于应用系统的需求定义和分析,得到对象类及相互间关系的抽象描述;面向对象设计是指软件设计人员将对象的抽象描述及对象类间的关系抽象描述转化为程序设计语言中的具体描述;面向对象程序设计则是程序设计人员利用而向对象程序设计语言,根据设计得到的对象类,生成对象实例,建立对象间的各种联系,从而建立实际可运行的系统。

1.4面向对象语言及系统

自20世纪70年代末80年代初以来,多种面向对象的语言和系统相继问世,虽然对于

面向对象程序设计机制的取合各不相同,但它们对于促进面向对象技术的发展都起到了巨大的推动作用。

Smalltalk是第一个面向对象的语言,它的风格起源于一个模拟语言Simula。

它最初是由AlanKay于1972年在施乐公司的PARC(PaloAltoResearchCenter)实验室工作时设计的,这个名字取自“少说话(talksmall)”,意思是你通过很少的话语就可以完成很多工作。

从那时起,许多人为Smalltalk的发展做出了很大贡献,经过Smalltalk-72、Smalltalk-74和Smalltalk-78的不断改进完善,最后形成最完整的Smalltalk-80系统。

Smalltalk-72是继没计人之后推出的第一个正式Smalltalk解释器版本;Smalltalk-74第一次加上了多窗口界面,这是Smalltalk系统的一大特点;Smalltalk-78第一次采用了中间代码的设计和实现,并用微指令实现了中间代码,大大提高了系统速度,使该系统第一次有了可用性。

之后,施乐公司制订了商用Smalltalk计划,并成立了以AdeleGoldburg为首的ParcPlaceSystem公司,最后推出Smalltalk-80系统。

它在系统的设计中强调了对象概念的统一,并引入完善了类、方法、实例等概念和术语,应用了单重继承机制和动态连接,其中许多概念为其它语言所采用。

Smalltalk-80是程序设计及语言领域中一个重要的里程碑。

c++是由AT&T公司的BjarneStroustrup对c语言进行改进扩充,并增加了类似于Smalltalk语言中相应的对象机制开发而成的。

它的主要特点是将类看作用户定义类型,从而使其扩充比较自然。

c++以其高效的执行赢得了广大程序人员的喜爱。

但由于其编译结构使用了强类型的机制,代替了纯粹面向对象风格中的弱类型特征,从而引起了一些概念的不协调。

c++在最初实现中没有实现多重继承的机制,而在后续版本中则实现了多重继承机制,并增加了类库。

Objective-C是由美国康涅迪格(Connecticut)大学的BradJ.Cox领导的开发小组在C语言的基础上,用类似于Smalltalk-80系统的组织和框架建成的,它在实现中使用了动态编译技术,允许以目标代码的形式在运行过程中与系统连接。

它主要使用于MacOS和GNUstep这两个使用OpenStep标准的系统。

Objective-C不支持运算符重载和多重继承的机制。

BradJ.Cox在1986年出版的《Object-OrientedProgramming》一书中提出了Software-IC的概念,并在语言中构成了Software-IC库。

Java是由SunMicrosystems公司于1995年5月推出的面向对象的程序设计语言,是一种可以编写跨平台应用软件的编程语言。

Java以其强大的网络优势,以几乎要压倒一切的气势进入面向对象语言的市场。

Java具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、移动电话和互联网等。

Java基本结构仍离不开Smalltalk和C++,但Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operatoroverloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。

C#(CSharp)是微软在2000年推出的一种基于.NET框架的面向对象程序设计语言。

C#由C和C++派生而来,继承了其强大的性能,同时又以.NET框架类库作为基础,拥有类似VisualBasic的快速开发能力。

C#由安德斯·海尔斯伯格主持开发,是以原来的VisualJ++为基础,因此在语言语法上和Java及其相似。

Ada语言是美国国防部指定的唯一的一种可用于军用系统开发的语言,我国军方也将Ada作为军内开发标准。

它是美国国防部耗费巨资,历时近20年研制成功的程序设计语言。

美国国防部之所以把这种语言取名为Ada,是为了纪念艾达·洛夫莱斯伯爵夫人(AdaLovelace,1815-1852),她是英格兰诗人拜伦(Byron)勋爵的女儿,曾对现代计算机技术之父查尔斯·巴贝奇(CharlesBabbage,1791-1871)的笔记、手稿进行了整理和修正。

从某种意义上说,她是世界上第一位计算机程序员。

Ada语言以其所具有的包结构做为基本对象单元,它不以继承性做为面向对象程序设计语言的基本特征。

Eiffel由美国InteractiveSoftwareInc.的BertrandMeyer设计,于20世纪80年代中期推出,是一种强类型的面向对象语言。

其主要特点是,类是唯一的程序构造单位;严格区分静态类和动态对象;类的特征分为属性和程序;支持多继承;增加断言机制以增强语义的正确性等等。

Ctalk是在C语言之上实现了Smalltalk语言的类库而形成的一种混合型语言,被称为C与Smalltalk的混血儿,最初曾经作为产品销售了几个拷贝,后被c++所取代。

ABCL/1是在日本东京工学院的AkinoriYonezawa领导下用CommonLisp语言开发的,该系统的计算模型强调了对大量的各种并发系统进行建模和描述,并对分布计算中的算法,用对象概念在ABCL/I中进行了统一。

POOL是由荷兰阿姆斯特丹大学的America主持开发的。

它强调了并发性的开发,放弃了对继承性的要求。

Fooplog是将面向对象、函数式、逻辑式三者相结合而设计的语言。

它在面向对象的概念中强调了计算的局部性。

CommonLISPObjectSystem(CLOS)是在CommonLisp基础上支持面向对象风格特征的机制而形成的。

ACTI是在Windows环境下运行的。

它集成了一个相当大的类库和代码,可供编写应用程序使用,该语言中提出了一种ACTOR模型,将程序组织成活动对象的集合,对象之间通过消息传递以并行方式通信。

1.5面向对象设计方法与其他设计方法的比较

一、横向比较

从横向来看,当前程序设计领域中研究的重点,根据对计算过程的不同认识可分为三种:

第一,函数式程序设计(FP)将计算过程看作函数作用过程,即将某一系列函数作用于

输入得到输出的过程,其中强调等值替换,逻辑程序设计则无法做到这一点;

第二,逻辑程序设计(LP)将计算过程看作推演过程,即将具有初始状态的输入在一系列条件的约束下,采用推理算法和搜索手段进行匹配、演算的过程,有利于启发式;

第三,面向对象的程序设计(OOP)则将计算过程看作分类过程加状态变换过程,即系统逐步划分为相互关联的多个对象并建立这些对象的联系,以引发状态变换,最终完成计算。

面向对象方法模拟了人类认识问题的较高、较广层次的过程,即分类过程,属于战略性方法;函数和逻辑方法则更适合于模拟人的逻辑思维,处于人类认识问题的较深层次过程,属于战术性方法,因此它们各有侧重点,如果能将它们结合才是最完美的。

二、纵向比较

正如RentschD1982年就预言的:

“我认为,80年代的面向对象程序设计就像70年代的结构化程序设计一样,每个人都喜欢用它,每个软件商都开发他们的软件来支持它,每个管理人员都要付出代价来应用它,每个程序员都要以不同的方法展开实践。

同时,没有人能精确地讲出它到底是什么”。

果然,面向对象方法在20世纪80年代的研究热潮比70年代的结构程序设计有过之而无不及,到了21世纪,面向对象方法在软件开发方面已经占有统治性地位。

下面先看一下这两代程序设计方法有什么区别。

结构化程序设计强调了功能抽象和模块性,它将解决问题的过程看作是一个处理过程;而面向对象的程序设计则综合了功能抽象和数据抽象,它将解决问题看作是一个分类演绎过程。

1模块与对象:

结构化设计中模块是对功能的抽象,每个模块都是一个处理单位,它有输入和输出。

而对象是包括数据和操作的整体,是对数据和功能的抽象和统一。

可以说,对象包含了模块概念,但比模块更强大;

2过程调用与消息传递:

在结构化程序设计中,过程为一独立实体,显式地为它的使用者所见;而在面向对象的程序设计中,方法是隶属于对象的,它不是独立存在的实体,而是对象的功能体现。

消息传递机制很自然地与分布式并行程序、多机系统和网络通讯模型取得了一致。

在结构化设计中同一实参的调用,其结果是相同的,如以下C语言过程:

intmax(x,y)

intx,y;

{inta;

if(x>=y)a=x:

elsea=y;

retum(a);}

是求x,y中较大数的过程,那么max(45,34)的结果在每次调用都是45;而面向对象中的消息传递则不同,同一消息的多次发送可能产生不同的结果,如go:

aPoint这一消息指出从一个点画一条到点aPoint的线。

用Smalltalk语言实现如下:

go:

aPoint

|linexy|

Line:

=Linenew.

Lineorigin:

self

Lineend:

aPoint

Linedraw

但go:

50@100这条消息发送给点50@50时则是画一条竖线,而go:

50@100这条消息发给点10@100的结果是画一条横线。

其中,x@y是Smalltalk语言中点的表示形式,x表示横坐标,y表示纵坐标。

另外,过程调用所涉及到的过程及函数都同属一个程序实体,无论它们是以一个文件还是以多个文件存放的。

而不同对象间的消息传递则可以是不同程序实体之间的交互与协作,可以这样说,面向对象设计中的程序实体是松耦合的,而传统设计中的程序实体是紧耦合的。

③类型与类:

类型与类都是对数据和操作的抽象,即定义了一组具有共同特征的数据和可以作用于其上的一组操作,但是类型仍然是偏重于操作抽象的,而类是集成数据抽象和操作抽象的,二者缺一不可。

同时类引入了继承性质,实现了可扩充性。

第三章将详细讨论这一问题。

④静态连接与动态连接:

从程序设计发展来看,用户对灵活性和方便性的要求不断增强,所以动态连接代替静态连接是必然趋势,计算机硬件速度的提高弥补了动态连接的低效性,为此提供了基础。

显然,面向对象在这一方面与结构化设计相比占有优势。

1.6面向对象与大型程序设计

一般来说,很难确切定义什么样的程序是一个大型程序。

我们这里所说的大型,是相对于待解问题的复杂程度而言的,而不是指最终解决问题的程序行数而言,但是通常程序的大小能在一定程度上反映问题的复杂程度。

大型程序的复杂性主要表现在两个方面。

其一,由于大型程序必须由多人合作完成,如何划分任务,估计、分配资源,掌握每个程序员的进度,控制、检查每个阶段的设计标准等,构成了进行大型程序设计时管理的复杂性。

这也是大型程序设计与单人能够完成的小型程序设计的一个重要区别。

大型程序设计中的许多管理问题可由管理科学进行处理,而我们研究程序设计方法的目的则在于提供更适当的设计工具和规范。

其二,大型程序具有大量的系统状态。

大型复杂的系统,对于我们正确处理其中间状态、组织系统的程序逻辑、验证系统的正确性都带来极大的困难。

对于大型程序,正确性仍是程序的首要目标,程序的任一微小错误都会造成重大的损失。

但是,仅仅有正确性是远远不够的,易维护性、可读性和可重用性对于大型程序都是都是非常重要的。

这是因为大型程序的开发周期长、耗费大,并且需要多人合作,出现一定的错误是在所难免的。

同时,在短期内要想重新开发一个大型程序是不可能的。

易维护性使程序在出现错误时,能得到及时的改正;可读性可以保证程序易于理解、便于使用和调试,从而使程序功能得到充分的发挥;可重用性使一个程序中开发的通用模块可以在其它程序中使用,从而节省开发费用,也简化了程序的部分复杂性。

大型程序的上述特点要求我们在开发一个大型软件系统时,应对整个任务进行清晰、严格的划分,使每个程序员清晰地了解自己要做的工作及与他人的接口,使每个程序员可以独立地设计调试自己负责的模块,并确保其满足以上几个特性,从而使各模块可以顺利地应用到整个系统中去,同时使整个系统的正确性和可靠性建立在各模块的可靠性和正确性之上。

大型程序的特点决定了大型程序系统的设计必然要走模块化的道路,自顶向下、分而治之是解决系统复杂性的重要手段,分解与抽象是设计大程序的重要方法,将一个问题分解成许多小的子问题可由每个子问题重复上述过程;直到子问题的复杂性能够由单个程序员来控制为止。

各个子问题的处理可由不同的程序员同时编制,这样,我们就得到了许多易于控制的模块,这些模块都有一个清晰的抽象界面,它只说明做什么,而不必说明如何去做,同时还说明了该模块与其它模块的相互作用关系。

这些模块构成了一种层次结构,每个层次完成某个指定的任务。

单个模块的设计对应于小型程序设计,它需要程序员用一些数据结构、控制结构来实现算法的细节。

所有这些单个模块可以分别编译,存放在程序库中,以备使用。

而如何分解一个大型程序系统为易于管理的模块,如何定义模块的界面,以及如何把这些模块组织为一个程序系统,就是我们所说的大型程序设计。

大型程序的实质就是用模块进行程序设计,重点在于模块的连接和相互作用。

因此,一个软件系统设计可分为两个阶段——大型程序设计和小型程序设计,即软件系统设计=大型程序设计+小型程序设计在定义了模块界面之后,这两个阶段可以同时进行。

于是,整个系统的复杂性被分成两个层次——模块内部的复杂性和模块界面之间的复杂性,前者由小型程序设计来控制,后者由大型程序设计来解决。

从上面的讨论可知,模块的分解在大型程序设计中占有极其重要的位置。

若仅仅从系统开发易于管理的角度来看,任一种模块分解方法都是可接受的,但这是远远不够的。

不同的分解方法,对系统的效率及复杂性的控制有着很大的影响。

一般来讲,有两种分解模块的方法。

第一种是基于功能的模块分解方法,这种分解以系统的功能路线(流程图)为准则,以数据作为模块的界面。

基于这种分解方法的大型程序设计称为“横向模块化程序设计”。

第二种方法是基于数据抽象的模块分解方法。

模块分解以“信息隐蔽”为准则,用数据上的操作作为模块的界面。

基于这种分解方法的大型程序设计称为“纵向模块化设计”。

面向对象方法正是提供了一种有效的分解方法,它进一步发展了基于数据抽象的模块化设计,在数据抽象和抽象数据类型之上又引入了动态连接和继承性等机制,这样不但支持了大型程序设计,同时支持了小型程序设计。

面向对象的设计方法包括两大过程:

第一是战略性过程,我们称之为面向对象设计,它是脱离具体程序系统可以独立存在的一种设计方法;第二是战术性过程,我们称之为面向对象程序设计,它具体解决程序设计中各项操作的实现,这一过程是要与一种具体的程字语言相联系的。

如果写出一个公式,就是软件系统设计=面向对象设汁+面向对象程序设计

从这个公式可以看出,面向对象设计的前后两个过程,恰恰分别支持了大型程序设计与小型程序设计。

1.7面向对象方法学基础

任何新型技术和方法都离不开已经取得的成就和现有的研究基础。

面向对象技术同样也具有这样的特点,本节介绍面向对象方法赖以产生和发展的基础理论和概念。

1.7.1程序设计方法学软件工程多年来的研究与实践证明,要确保软件的质量,提高软件生产率,就必须进一步研究软件开发的方法学,使得软件开发过程不仅仅是一个合理的、有组织的过程,而且也应当成为软件产品的组成部分之一。

在软件开发初期,程序设计被认为是一种技巧,针对于机器指令的程序设计以少用指令、少占空间为其主要目的,美国学者高德纳(DonaldErvinKnuth)1966年开始撰写的巨著《计算机程序设计艺术》(TheArtofComputerProgramming),正是当时软件开发核心内容的反映。

随着计算机的发展,计算机的存储已不是程序设

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1