




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计的基本概念面向对象程序设计的基本概念2010-04-1420:01前言:面向对象程序设计(Object-OrientedProgramming,以下简称OOP)!种起源于六十年代的Simula语言,发展已经将近三十年的程序设计思想。其自身理论已经十分完善,并被多种面向对象程序设计语言(Object-OrientedProgrammingLanguage,以下简称OOPL决现。如果把Unix系统看成是国外在系统软件方面的文化根基,那么Smalltalk语言无疑在OOPL域和Unix持有相同地位。由于很多原因,国内大部分程序设计人员并没有很深的OO似及OOPL!论,很多人从一开始学
2、习到工作很多年都只是接触到c/c+,java,vb,delphi等静态类型语言,而对纯粹的OO刖想以及作为OOPL艮基的Smalltalk以及动态类型语言知之甚少,不知道其实世界上还有一些可以针对变量不绑定类型的编程语言。而这些对比却是深刻理解OO理论的重要部分,而国内这方面的资料也为数不多。故把自己的一些OC习心得写下来做为一个系歹0文章(一共三篇,第一篇描叙OOP勺一些基本但容易被误解的理论,第二篇主要说明各种OOPL典化和发展以及对于OOP理论的支持,第三篇主要是说模式和组件在OO仲的地位以及展望OOP勺未来),由于文章描叙的只是自己对于OOP/OOPL理解,错误以及浅薄之处在所难免,只
3、是希望对大家能起到抛砖引玉的作用。浅析OO的基石从抽象说起Booch曾经在他自己的。顷域内的名著Booch94中开篇就论叙到了复杂性是软件开发过程中所故有的特质。而人们处理复杂性的最根本武器就是抽象。广义的抽象代表的是对复杂系统的简化描叙或规格说明,为了突出系统的本质届性而故意忽略其中的非实质性细节。”一个概念只有当能被最终用来实现的机制独立的描叙,理解,分析时,才将这个概念限定为抽象的概念”。而Booch也给出了他心目中关于OO域内的狭义抽象定义:抽象表示一个对象与其他所有对象相区别的基本特征,因此提供了同观察者角度有关的活晰定义的概念界限。”因此,根据不同观察角度,我们可以针对OOP合出不
4、同级别的抽象层次。通常,面对一个典型的面向对象程序,Budd2002将其分成五个抽象层,分别覆盖了OO仲的分析,设计与编程的各个阶段:1, 最高级别的抽象层上,程序被看成是由很多相互作用并且遵守契约的对象所组成的对象集合。对象之间相互合作完成程序的计算任务。这个抽象级别上的典型代表就是设计模式思想(DesignPattern)。2, 第二个抽象层就是一个对象集单元,也就是一群定义之间有相互联系的对象,在程序设计语!级别来看Java中是packages,C+中是namespace。这个抽象级别上的典型代表就是模块化思想(Modularity)。3, 第三个抽象层所代表的是典型的OOP莫式:客户/
5、服务器模型,这主要是用来抽象两个对象之间的互交过程。在这个抽象级别上的典型代表就是对象之间的消息机制(MessagePassing)。4, 第四个抽象层就是针对一组相似对象定义一个类作为生成对象的棋板,类定义了对象的对外使用接口以及继承对象所需的内部继承接口,而这个抽象层次的典型代表就是接口编程(InterfaceProgramming)。5, 第五个抽象层就是实现一个类所需要的方法和成员变量的实现(Implementation)。在这里OOP终和POP(Procedure-OrientedProgramming)相融合。当然,我们可以根据各自的观察角度划分成更细的抽象层次比如说针对第五层抽象
6、用到的POPS论,我们还可以进一步的划分出控制抽象(三种完全描叙图灵机计算模型所需要的控制结构)以及数据抽象(ADTs)等等,并由此继续下去(如果你的想象力足够丰富的话:)。什么是OOP?OOP勺许多原始思想都来之于Simula语言,并在Smalltalk语言的完善和标准化过程中得到更多的扩展和对以前的思想的重新注解。可以说OC想和OOP乎是同步发展相互促进的。与函数式程序设计(functionalprogramming)和逻辑式程序设计(logic-programming)所代表的接近于机器的实际计算模型所不同的是,OOP!乎没有引入精确的数学描叙,而是倾向于建立一个对象模型,它能够近似的反
7、映应用领域内的实体之间的关系,其本质是更接近于一种人类认知事物所采用的哲学观的计算模型。由此,导致了一个自然的话题,那就是OO倒底是什么?D&T1988B.S1991.。在OO仲,对象作为计算主体,拥有自己的名称,状态以及接受外界消息的接口。在对象模型中,产生新对象,旧对象销毁,发送消息,响应消息就构成OOP+算模型的根本。对象的产生有两种基本方式。一种是以原型(prototype)对象为基础产生新的对象。一种是以类(class)为基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习的递增特性,原型模型本身就是企图通过提供一个有代表性的对象为基础来产生各种新的对象,并由此继续产生更符
8、合实际应用的对象。而原型-委托也是OO仲的对象抽象,代码共享机制中的一种。一个类提供了一个或者多个对象的通用性描叙。从形式化的观点看,类与类型有关,因此一个类相当于是从该类中产生的实例的集合。而这样的观点也会带来一些矛盾,比较典型的就是在继承体系下,子集(子类)对象和父集(父类)对象之间的行为相融性可能很难达到,这也就是OOW常被引用的-子类型(subtype)不等于子类(subclass)Budd2002。而在一种所有皆对象的世界观背景下,在类模型基础上还诞生出了一种拥有元类(metaclass)的新对象模型。即类本身也是一种其他类的对象。以上三种根本不同的观点各自定义了三种基于类(clas
9、s-based),基于原型(prototype-based)和基于元类(metaclass-based)的对象模型。而这三种对象模型也就导致了许多不同的程序设计语言(如果我们暂时把静态与动态的差别放在一边)。是的,我们经常接触的C+,Java都是使用基于类的对象模型,但除此之外还有很多我们所没有接触的OOPIX用了完全不一样的对象模型,他们是在用另外一种观点讼释OOP勺内涵。什么是类型(type)?类型以及类型系统的起源以及研究与发展是独立于OOP勺。早在五十年代的FORTRAN言编译器实现中,就已经采用类型系统作为类型检查的一种手段。广义的类型一般被定义为一种约束,也就是一种逻辑公式。而在对
10、类型的研究过程中产生多种方法,比如C&W1985等。而代数方法(algebraicapproach)是一种非常好的建立类型的形式化规范的方法。代数中的一个类型对应于一系列元素,在它们之上定义代数操作。同时在此基础上二阶入演算已经被用于继承和棋板所支持的模型。在上面两种方法中,类型被认为是一系列满足确定约束条件的元素,更抽象的方式可以把一个类型当作规定一个约束条件,如果我们规定的约束条件越好,相对应的被定义元素的集合就越精密,所以逻辑公式(logicalformulas)就成为描叙类型特征的最合适工具。在这里,我们不想深入的探究对于类型理论的各种不同的数学模型,我们需要明白的是类型(type)以
11、及类型理论这个在编程语言中经常应用到的概念的内涵是极其丰富的,而其自身理论的发展并非局限于OO比中,但当两者相结合的时候就对我们的程序观产生了巨大的影响。类(class),类型(type),接口(interface)这三个概念是在OO叫出现频率最多,也最容易混淆的。而对于这三个概念的澄活也是文章写作的初衷。让我们先看看大师们对于这三个概念的描叙-ThefundamentalunitofprogramminginJavaprogramminglanguageistheclass,butthefundamentalunitoftheobject-orienteddesignisthetype.wh
12、ileclassesdefinetypes,itisveryusefulandpowerfultobeabletodefineatypewithoutdefiningaclass.Interfacedefinetypesinanabstractformasacollectionofmethodsorothertypesthatformthecontractforthetype.”Jams2000。InC+,AclassisauserdefinitetypeB.S1998。Atypeisanameusedtodenoteaparticularinterface-Anobjectmayhavema
13、nytypes,andwidelydifferentobjectscanshareatype.Partofanobjectsinterfacemaybecharacterizedbyonetype,andotherpartsbyothertypes.Twoobjectsofthesametypeneedonlysharepartsoftheirinterface.Interfacecancontainotherinterfaceassubset.Wesaythatatypeisasubtypeofanotherifitsinterfacecontaintheinterfaceofitssupe
14、rtype.OftenwespeakofasubtypeinheritingtheinterfaceofitssupertypeGamma1995在其中,一共出现了四个概念:类(class),类型(type),接口(interface)以及契约(contract)。这里我们说到的类型和上面提到的类型有所不同,是狭义的OO叫的类型。为了理解这几个概念,我先划分出三个概念域:一个是针对现实世界的,一个是针对特定程序设计范型的(在这里就是OC设计范型),最后一个是针对编译器实现的。也就是说,在现实世界中的概念必须有一种手段映射到。砒型中去,而OO范型中的概念也应该在编译器实现中有相同的概念对应。由此
15、,我们可以这样说,类是做为现实世界中的概念,而传统的OOPLTK会提供class关键字来表示对现实世界模拟的支持。而接口,是作为OOS序设计范型中与类对应的一个概念。在OO设计中,我们所要做的就是针对接口进行设计和编程,而接口的实质含义就是对象之间的一种契约。而类型就是编译器实现中针对类和接口所定义的对应概念。可以这样说,类是现实世界中存在的客观概念,是唯物的。接口是设计人员定义出来的,存在于设计人员心中的概念,是唯心的。而类型是类和接口这两种概念的编译器实现的映射概念,也是唯物的。类型主要是用来指导编译器的类型检查的谓词,类是创建现实对象的棋板,接口是OO设计中的关键概念。这三个概念相互区别
16、(分别位于不同的概念域),乂相互联系(都是代表相同的概念的不同概念域的映射)。有了上面的理解,我们看看下面最常见的Java语句:peoplea=newman();这代表了什么狒序员向编译器声明了一个people类型(type)的对象变量a,而对象变量a本身却指向了一个man类(class)的实体(而在编译器中理解是对象变量a指向了一个类型为man的实体)。再让我们回到Jams2000,其中句子的根本含义我们可以概括如下:声明一个类或者一个接口都同时向编译器注册了一个新的类型,而此类或者接口以及类型都是共享同样的一个名字。也就是说。编译器所能理解的全部都是类型,而程序员的工作是把现实中的类概念转
17、化为设计中的接口概念,而编译器对应于上两种概念都有直接的支持,那就是一个类声明或者接口声明在编译器的理解来看就是一个类型声明。但是反过来却不一定成立。一个类可以有多个接口(一个类完全有可能实现了设计人员的多个契约条件),同时也就可能有多个类型(因为类型不过是接口这个设计域内的概念在编译器中的实现)。多态,替换原则,对象切割多态作为OO中的核心机制之一拥有着丰富的内涵。顾名思义,多态就是一种名称多种形态的意思。其主要有三种形式:函数多态,对象变量多态,泛型多态。函数多态主要包括函数重载(overload)和改写(overriding)。泛型多态(genericity)主要是提供了一种创建通用工具
18、的方法,可以在特定的场合将其特化。在这里,我们重点要考量的是对象变量多态。在理解对象变量多态之前,我们首先了解一下0诚心机制之一的替换原则。静态类型的OOPL勺一个特征就是一个变量所包含的值(value)的类型可能并不等于这个变量所声明的类型,在传统的编程语言中并不具备这样的特征,因为我们不可能把声明为整型的变量赋上字符申的变量值。而替换原则发生作用的情况就隐含的描叙了两种不同类型所具有的关联-类型继承。BarbaraLiskov曾经这样描叙替换原则以及起作用的类型之间的关联:对于类型为S的每个对象s,存在一个类型为T的对象t,对于根据类型T所定义的所有程序P,如果用对象s替换对象t,程序P的
19、行为保持不变,那么类型S就是类型T的子类型Liskov1988在理解了多态以及替换原则后,我们可以继续深入理解继承与替换原则相结合所带来的新的观点。可以说继承与替换原则的引入影响了几乎所有的OOPL包括类型系统,值语义/引用语义,对象内存空间分配等等。下面,我将试图逐步的拨开其中的各种因果。首先考虑,peoplea;这样的代码在编译器中将如何实现?可以肯定是首先将把类型people绑定到对象a上,然后必须为对象a分配空间。同时,我们创建people的子类man由于manISApeople。根据多态以及替换原则,我们当然可以让对象a保存一个man类型的值(这就是替换原则的表现)。这是一种直观的描
20、叙,但在编程语言的实现过程中就出现一些困难。我们知道继承是一种扩展接口与实现的方式,那么我们就很难保证man类型不对people类型做扩展,而一旦做出扩展,我们如何能用存储people对象的空间去存储man类型的对象值呢?peoplea;manb=newman();a=b;这样的代码将首先把b对象进行切割,然后再存储到a对象空间去。然而这并不是我们所期望的。那么,为了支持OOP勺继承,多态,替换原则,但却需要避免对象切割的发生,面对对象a我们将采用何种分配空间模型呢?常用的有下面三种方式:1, 只为a分配基类people的存储空间,不支持对象多态以及替换原则。这样的模型内存分配紧凑,存储效率很
21、高。2, 分配继承树中的最大类对象所需要空间(在这里是man类的对象值空间),这样的模型简单,同时可以实现多态和替换原则而避免对象切割问题,但是十分浪费内存空间十分明显。3, 只分配用于保存一个指针所需要的存储空间,在运行时通过堆来分配对象实际类型所需要的空间大小,这样也可以实现多态和替换原则而避免对象切割问题。(也就是说a只是一个对象的引用,而不是真实的对象,真实对象的生成必须靠程序员显式的声明)。对于上面提到的三种内存模型,1和3都被一些程序设计语言所采用。相信说到这里,大家应该开始慢慢明白了。是的,C+乍为C语言的继承者,对于效率的追求迫使它必须采用第一种最小静态空间分配的方式,由于基于
22、栈空间的程序运行效率要比基于堆空间的程序运行效率高出许多,所以C+院许用栈空间保存对象,但同时也允许堆空间保存对象,可以说C+兜采用了1和3两种相混合的内存模型,而C+州基于1内存模型的对象,也就是说基于栈内存空间的对象是没有办法体现多态和替换原则的(请思考一下在C+州什么对象是基于栈的),而基于3内存模型的对象将支持多态和替换原则(乂想一想在C+中什么对象是基于堆的)。这里,我们终于可以揭开第一层迷雾了,很多人都知道在C+州只有指针和引用才能支持对象的多态行为,但是为什么会如此?上面做出了最好的解释。Java语舌由于设计理念和C+用着很大的区别,它米用的是第3种对象棋型,一切对象(除了基本类
23、型对象)都是基于堆分配的。这也是Java语言必须采用虚拟机的原因所在。在C+州很大一部分对象是不需要程序员进行管理的(静态空间对象),而在Java中,如果不采用虚拟机机制,所有的对象都需要程序员管理,而这样的开发代价将是巨大而不现实的。这也就揭开了第二层迷雾,当我们在对比C+新日Java语言的时候总是为虚拟机是否有其价值而争论不休,但当你抛开所谓的好与不好的简单讨论,进入到其语言本身的内在对象存储本质的时候,也许对于各种声音才会有一个届于自己的活醒认识。让我们继续望下走,不同的对象内存分配模型直接影响到其程序设计语言的赋值的含义。在各种编程语言中,赋值可以给出两种不同的语义解释:复制语义和指针
24、语义。很明显,由于C+找持两种相混合的对象存储模型(但是默认的存储方式是栈存储),所以在C+州默认赋值语义米用的是前者,但C+W时提供了指针语义的功能支持(在拷贝构造函数和=运算符重载中用户进行自定义)而在Java中采用的是后者。这也就是我们揭开的最后一道迷雾,不同的对象存储模型直接导致了不同的赋值语义。面向对象的计算模型和可计算性编程就是用计算所需要的指令构成一种运算装置,无论我们的程序设计思想以及程序设计语言如何发展和提高,最终我们所使用的底层计算数学模型并没有改变。但高级程序设计语言给我们带来的变革是在其语言环境中构建起了一个全新的,更抽象的虚拟计算模型。Smalltalk语言引入的对象
25、计算模型从根本上改变了以前的传统计算模型,以前的计算模型突出的是顺序计算过程中的机器状态,而现在的对象计算模型突出的对象之间的协作其计算结果由参加计算的所有的对象的状态总体构成。而由于对象本身具有自身状态,我们也可以把一个对象看成是一个小的计算机器。这样,面向对象的计算模型就演变成了许多小的计算机器的合作计算模型。图灵机作为计算领域内的根本计算模型,精确的抓住了计算的要点:什么是可计算的,计算时间和空间存储大小开销有多大。计算模型活楚的界定了可计算性的范围,也就界定了哪些问题是可求解,哪些问题是不可求解的。OOF%程序员提供了一种更加抽象和易于理解的新的计算模型,但其本身并没有超越冯.诺依曼体
26、系所代表的图灵机数学计算模型。所以我们不能期望00甬它帮助我们解决更多的问题,或者减少运算的复杂度。但OOFW能帮助我们用一种更容易被我们所理解和接受的方式去描叙和解决现实问题。结束这篇文章做为这个系列的第一篇,对于OO仲的许多核心概念和机制进行了有益的讨论,作者衷心的希望通过这篇文章能够让大家对于OOFW更深入的理解,同时明白OOP乍为已经发展将近三十年的程序设计思想,其自身丰富的理论内涵不是单单学习几门OOPIM可以领悟。最后期望本文能实现了它的初衷-抛砖引玉。Reference:D&T1988:TypeTheoriesandObject-OrientedprogrammingbyScottDanforthandChrisTomlinsononACMComputingSurveysVol.20No.1March1988Liskov1988:DataAbstractionandHierarchybyBarbaraLiskovonSigplanNotices,23(5),1988C&W1985Onunderstandingtypes,dataabstraction,andpolymorphismbyCardelli.LandWegne
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国危险品仓储行业市场集中度、企业竞争格局分析报告-智研咨询发布
- 2024安徽芜湖市繁昌区繁阳镇社区工作者招聘10人笔试备考题库带答案详解(完整版)
- 《计算机网络 》课件第5章
- 银行招聘考试历年机考真题集及答案详解(易错题)
- 2024中国信达资产管理股份有限公司陕西省分公司招聘笔试备考试题含答案详解(典型题)
- 安全培训班价格课件
- 受电弓和真空主断路器的工作原理及应用课件
- 基础强化人教版7年级数学上册期末测试卷含答案详解(研优卷)
- 安全培训熊猫课件
- XX企业数字化转型生产运营优化策略规划报告2025
- 《捷众电梯推介书》课件
- 《城市轨道交通车辆标志规范》
- 人事工作目标及规划
- 第十三讲-先锋队与中华民族独立解放-中华民族共同体概论教案
- 糖尿病处方点评
- 象棋入门课件教学
- 2024年3dmax模型制作与精修培训课件
- 诊断学-常见症状的诊疗(临床疾病概要课件)
- 咨询类合同合同范例
- 九上道法【思维导图+重点句+考点问题+典型例题】
- Vue3系统入门与项目实战
评论
0/150
提交评论