面向对象的优缺点Word文档格式.docx
《面向对象的优缺点Word文档格式.docx》由会员分享,可在线阅读,更多相关《面向对象的优缺点Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
缺点:
1、优点:
(1)通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途。
(2)我们可以在标准的模块上构建我们的程序,而不必一切从头开始。
这可以减少软件开发时间并提高生产率。
(3)数据隐藏的概念帮助程序员保护程序免受外部代码的侵袭。
(4)容许一个对象的多个实现同时存在,而且彼此之间不会相互干扰。
(5)容许将问题中的对象直接映射到程序中。
(6)基于对象的工程可以很容易的分割为独立的部分。
(7)以数据为中心的设计方法容许我们抓住可实现的更多细节。
(8)面向对象程序的系统很容易从小到大逐步升级。
(9)对象间通讯所使用的消息传递技术与外部系统接口部分的描述更简单。
(10)更便于控制软件的复杂度。
面向对象方法学把分析、设计和实现很自然地联系在一起了。
虽然面向对象设计原则上不依赖于特定的实现环境,但是实现结果和实现成本却在很大程度上取决于实现环境。
因此,直接支持面向对象设计范式的面向对象程序语言、开发环境及类库,对于面向对象实现来说是非常重要的。
为了把面向对象设计结果顺利地转变成面向对象程序,首先应该选择一种适当的程序设计语言。
面向对象的程序设计语言适合用来实现面向对象设计结果。
事实上,具有方便的开发环境和丰富的类库的面向对象程序设计语言,是实现面向对象设计的最佳选择。
良好的程序设计风格对于面向对象实现来说格外重要。
它既包括传统的程序设计风格准则,也包括与面向对象方法的特点相适应的一些新准则。
面向对象方法学使用独特的概念和完成软件开发工作,因此,在测试面向对象程序的时候,除了继承传统的测试技术之外,还必须研究与面向对象程序特点相适应的新的测试技术。
在这方面需要做的研究工作还很多,目前已逐渐成为国内外软件工程界研究的一个新的热门课题。
面向过程的优缺点
“面向过程”(ProcedureOriented)是一种以过程为中心的编程思想。
“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向过程其实是最为实际的一种思考方式,就是算面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际的实现.一般的面向过程是从上往下步步求精.所以面向过程最重要的是模块化的思想方法.对比较面向对象,面向对象的方法主要是把事物给对象化,对象包括属性与行为.当程序规模不是很大时,面向过程的方法还会体现出一种优势,因为程序的流程很清楚,按着模块与函数的方法可以很好的组织.比如拿学生早上起来的事情来说说这种面向过程吧.粗略的可以将过程拟为。
(1)起床
(2)穿衣
(3)洗脸刷牙
(4)去学校
而这4步就是一步一步的完成,它的顺序很重要,你只须一个一个的实现就行了.而如果是用面向对象的方法的话,可能就只抽象出一个学生的类,它包括这四个方法,但是具体的顺序就不能体现出来。
1、面向对象相对面向过程的优点
(1)结构清晰。
使人们的编程与实际的世界更加接近,所有的对象被赋予属性和方法,结果编程就更加富有人性化。
(2)封装性。
减小外部对内部的影响。
封装将对象有关的数据和行为封装成整体来处理,使得对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。
(3)容易扩展,代码重用率高。
容易扩展,在大框架不变的情况下很容易就开发出适合自己的功能,实现简单,可有效地减少程序的维护工作量,软件开发效率高。
2、面向对象相对面向过程的缺点
(1)增加工作量。
如果一味地强调封装,当进行修改对象内部时,对象的任何属性都不允许外部直接存取,则要增加许多没有其他意义、只负责读或写的行为。
这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。
(2)性能低。
由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小的都开销很大。
3、举例
(1)面向对象的优点举例:
如象棋程序,比如我要加入悔棋的功能,如果面向过程设计的话,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。
如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了红黑双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
(2)面向对象的缺点举例:
如技术类开放问题2的留言板系统,当设计一个留言板系统,要求满足记录数每日新增10万条和查询量100万,如果每一个数据交换过程都是一个对象,那么总的性能损失将是天文数字。
泛型编程思想
什么是泛型编程思想:
泛型编程(GenericProgramming)最初提出时的动机很简单直接:
发明一种语言机制,能够帮助实现一个通用的标准容器库。
所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象这样的事;
泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。
泛型即是指具有在多种数据类型上皆可操作的含意,与模板有些相似。
STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。
概述
泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。
STL以迭代器(Iterators)和容器(Containers)为基础,是一种泛型算法(GenericAlgorithms)库,容器的存在使这些算法有东西可以操作。
STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(functionobjects)。
STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。
泛型的第一个好处是编译时的严格类型检查。
这是集合框架最重要的特点。
此外,泛型消除了绝大多数的类型转换。
如果没有泛型,当你使用集合框架时,你不得不进行类型转换。
关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。
所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象,这样的事情;
熟悉一些其它面向对象的语言的人应该知道,如Java里面这是通过在List里面存放Object引用来实现的。
Java的单根继承在这里起到了关键的作用。
然而单根继承对C++这样的处在语言链底层的语言却是不能承受之重。
此外使用单根继承来实现通用容器也会带来效率和类型安全方面的问题,两者都与C++的理念不相吻合。
由来
泛型编程最初诞生于C++中,由AlexanderStepanov[2]和DavidMusser[3]创立。
目的是为了实现C++的STL(标准模板库)。
其语言支持机制就是模板(Templates)。
模板的精神其实很简单:
参数化类型。
换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。
比如qsort泛化之后就变成了:
template<
classRandomAccessIterator,classCompare>
voidsort(RandomAccessIteratorfirst,RandomAccessIteratorlast,
Comparecomp);
其中first,last这一对迭代器代表一个前闭后开区间,迭代器和前闭后开区间都是STL的核心概念。
迭代器建模的是内建指针的接口(解引用、递增、递减等)、前闭后开区间是一个简单的数学概念,表示从first(含first)到last(不含last)的区间内的所有元素。
此外,comp是一个仿函数(functor)。
仿函数也是STL的核心概念,仿函数是建模的内建函数的接口,一个仿函数可以是一个内建的函数,也可以是一个重载了operator()的类对象,只要是支持函数调用的语法形式就可成为一个仿函数。
通过操作符重载,C++允许了自定义类型具有跟内建类型同样的使用接口;
又通过模板这样的参数化类型机制,C++允许了一个算法或类定义,能够利用这样的接口一致性来对自身进行泛化。
例如,一个原本操作内建指针的算法,被泛化为操纵一切迭代器的算法。
一个原本使用内建函数指针的算法,被泛化为能够接受一切重载了函数调用操作符(operator())的类对象的算法。
编辑本段
泛型的机制
编译机制
1.第一轮编译时,编译器只为Stack<
T>
(栈算法)类型产生“泛型版”的IL代码与元数据-----并不进行泛型类型的实例化,T在中间只充当占位符
2.JIT编译时,当JIT编译器第一次遇到Stack<
int>
时,将用int替换“泛型版”IL代码与元数据中的T---进行泛型类型的实例化。
CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;
但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。
泛型编程的优点:
(1)使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能;
(2)使用泛型可以创建集合类;
.NETFramework类库在System.Collections.Generic命名空间中包含几个新的泛型集合类,应尽可能地使用这些类来代替普通的类,如System.Collections命名空间中的ArrayList;
(3)可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托;
(4)可以对泛型类进行约束以访问特定数据类型的方法;
(5)关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。
(1)在性能上没有数组快。
(2)虽然泛型程序设计方法与面向对象程序设计方法相比具有极大的优越性,并已成功地用于一大批通用程序库的开发。
然而,在实际运用中面向对象程序设计依然具备泛型程序设计尚未具备的一个很大优势,由于面向对象程序设计采用的对象类表示简单、易于理解,并且基于对象类的继承机制语义清晰、便于实现。
面向对象程序设计的抽象、封装、继承性、多态性等特点能够得到语言一级的支持。
对于泛型程序设计,目前尚没有任何一个主流程序设计语言能够直接定义或表示泛型程序设计方法。
无论是早期的Ada泛型编程,还是目前流行的c++模板编程,或者正在计划推出的c#withGenerics,所采用的泛型编程方法,都不是真正意义上的“基于需求”的泛型程序设计。
它们所采用的泛型程序设计方法,主要是通过人工的约定来遵循和运用,并要求编程者具备很高的素质和长期的经验。
与当前面向对象程序设计方法已被众多语言支持相比,这是泛型程序设计一个很不理想的薄弱环节。
泛型程序设计的优越性也必须在实现了泛型程序设计的基本方法的直接程序语言支持之下,才能充分展示出来。
泛型程序设计不能被程序设计语言直接支持有多种原因,其中最主要的原因是:
泛型程序设计方法中的概念包含太多,过于庞杂,或内容含混,使得现有的程序设计语言编译技术无法有效地处理,不能保证或验证出类型需求是否确实被类型参数满足。
导致了泛型程序设计目前还属于程序设计中的高阶技术,有碍于其广泛运用和普及。
.
如下例子:
//Declarethegenericclass
publicclassGenericList<
{voidAdd(Tinput){}}
classTestGenericList
{
privateclassExampleClass{}
staticvoidMain()
{
GenericList<
list1=newGenericList<
();
string>
list2=newGenericList<
ExampleClass>
list3=newGenericList<
}
}
面向对象与面向过程程序设计有如下不同:
(1)面向过程程序设计方法采用函数(或过程)来描述对数据的操作,但又将函数与其操作的数据分离开来;
面向对象程序设计方法将数据和对数据的操作封装在一起,作为一个整体来处理。
函数与数据是否分离。
(2)面向过程程序设计方法以功能为中心来设计功能模块,难于维护;
而面向对象程序设计方法以数据为中心来描述系统,数据相对于功能而言具有较强的稳定性,因此更易于维护。
以功能为中心;
以数据为中心。
(3)面向过程程序的控制流程由程序中预定顺序来决定;
面向对象程序的控制流程由运行时各种事件的实际发生来触发,而不再由预定顺序来决定,更符合实际需要。
预定顺序;
由运行时各种事件的实际发生来触发(4)面向对象程序设计方法可以利用框架产品(如MFC,MicrosoftFoundationClasses)进行编程。
面向对象可利用框架面向对象和面向过程的根本差别,在于封装之后,面向对象提供了面向过程不具备的各种特性,最主要的,就是继承和多态。
面向对象程序设计与泛型程序设计的比较:
泛型程序设计比面向对象程序设计具有更高的抽象能力。
面向对象程序设计与泛型程序设计的抽象机制的区别是十分明显的。
由于面向对象程序设计以共同的基类为共性抽象,而泛型程序设计是以共同的需求条件为共性抽象。
因此,泛型程序设计比面向对象程序设计具有更高的抽象能力,并且包含了面向对象程序设计的核心内容。
一般来讲,直接以对象类为概念进行抽象,抽象的程度并不高,而直接以对象类满足的需求条件进行分类和抽象,则可以获得非常高级别的抽象,并会带来更大的通用性和运行效率。
泛型程序设计比面向对象程序设计更具有通用性。
面向对象程序设计的通JFfj性是建立在类继承机制上,这导致了面向对象的算法只能被用在有限的类型上,而泛型程序设计的算法是建在结构一致性上。
简单说,结构一致性是指语法结构上的一致性。
泛型程序设计假定某个特定的语法跟其语义能够对应起来。
譬如说,在C++中,std:
:
sort()算法的一个版本只要求其操作数支持operator<
,基本上这就是说只要对于其操作数来说“a<
b”能够通过编译,该算法就能成功。
而面向对象程序设计,利用面向对象方法设计完成的通用算法要求其操作数要继承自某个特定的基类。
所以说,泛型程序设汁算法能够运用到的类型集是无限的/非绑定的。
结束语
面向对象程序设计方法与泛型程序设计方法各有千秋。
在某些情况下,良好的泛型程序设计规则可能违背良好的面向对象的程序设计方法的规则,反之亦然。
但这两种程序设计方法并不是水火不容,而是相得益彰。
将这两种方法巧妙地结合,便形成了程序设计的新思维,可以更有效地解决应用领域的实际问题。
参考文献
[1]孙斌.扩展面向对象编程(XOOP)的理论和方法[J].汁算机学报,2001,24(3):
266—280.
[2]郑莉,董渊,张瑞丰编.C++语言程序设计(第3版)[M],北京:
清华大学出版社出版,2003
[3]MatlewHAustern.泛型编程与STL[M],北京:
中国电力出版社,2003,