面向对象的优缺点.doc_第1页
面向对象的优缺点.doc_第2页
面向对象的优缺点.doc_第3页
面向对象的优缺点.doc_第4页
面向对象的优缺点.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象的优缺点什么是面向对象程序设计?面向对象程序设计(OOP)技术汲取了结构化程序设计中的好的思想,并将这些思想与一些新的,强大的理念相结合,从而给你的程序设计工作提供了一种全新的方法。通常,在面向对象的程序设计风格中,你会将一个问题分解为一些相互关联的子集,每个子集内部都包括了相关的数据和函数。同时,你会以某种方法将这些子集分为不同等级,而一个对象就是已定义的某个类型的变量。当你定义了一个对象,你就隐含的创建了一个新的数据类型。面向对象程序设计模式 发明面向对象程序设计方法的主要出发点是弥补面向过程程序设计方法中的一些缺点。OOP把数据看作程序开发中的基本元素,并且不允许它们在系统中自由流动。它将数据和操作这些数据的函数紧密的连结在一起,并保护数据不会被外界的函数意外的改变。OOP允许我们将问题分解为一系列实体这些实体被称为对象(object),然后围绕这些实体建立数据和函数。一、使用面向对象思想开发的优点:1、 易维护采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。2、质量高在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。3、效率高在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。4、易扩展由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。缺点:类和继承等特点使得程序会多很多指针操作来定位函数入口和自身要维护虚拟方法表等额外的工作,程序的处理效率相对要低(但程序开发效率高)。所以现在单纯的C语言还是大为用武之地的。 但随着科技的进步,CPU和内存的性能也突发猛进。由原来的1核到8核,内存16M和现在的16G,所以程序的效率多多少少会随着硬件的性能变得更好。你可以发现很多大的项目也开始由C转而变成让c+和JAVA等面向对象来写了。二、面向对象的特点和优缺点:1、特点 (1)利用特定软件直接从对象客体的描述到软件结构的转换。(2)解决了传统结构化方法中客观世界描述工具与软件结构的不一致性。(3)减少了从系统分析、设计到软件模块结构之间的多次转换映射的繁杂过程。2、OO方法优缺点 优点: (1)是一种全新的系统分析设计方法(对象、类、结构属性、方法)。 (2)适用于各类信息系统的开发。 (3)实现了对客观世界描述到软件结构的直接转换 ,大大减少后续软件开发量。 (4)开发工作的重用性、继承性高,降低重复工作量。 (5)缩短了开发周期。 缺点: (1)需要一定的软件支持环境。 (2)不太适宜大型的MIS开发,若缺乏整体系统设计划分,易造成系统结构不合理、各部分关系失调等问题。 (3)只能在现有业务基础上进行分类整理,不能从科学管理角度进行理顺和优化。 (4)初学者不易接受、难学。三、面向对象编程的优缺点:1、优点:(1)通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途。(2)我们可以在标准的模块上构建我们的程序,而不必一切从头开始。这可以减少软件开发时间并提高生产率。(3)数据隐藏的概念帮助程序员保护程序免受外部代码的侵袭。(4)容许一个对象的多个实现同时存在,而且彼此之间不会相互干扰。(5)容许将问题中的对象直接映射到程序中。(6)基于对象的工程可以很容易的分割为独立的部分。(7)以数据为中心的设计方法容许我们抓住可实现的更多细节。(8)面向对象程序的系统很容易从小到大逐步升级。(9)对象间通讯所使用的消息传递技术与外部系统接口部分的描述更简单。(10)更便于控制软件的复杂度。面向对象方法学把分析、设计和实现很自然地联系在一起了。虽然面向对象设计原则上不依赖于特定的实现环境,但是实现结果和实现成本却在很大程度上取决于实现环境。因此,直接支持面向对象设计范式的面向对象程序语言、开发环境及类库,对于面向对象实现来说是非常重要的。为了把面向对象设计结果顺利地转变成面向对象程序,首先应该选择一种适当的程序设计语言。面向对象的程序设计语言适合用来实现面向对象设计结果。事实上,具有方便的开发环境和丰富的类库的面向对象程序设计语言,是实现面向对象设计的最佳选择。良好的程序设计风格对于面向对象实现来说格外重要。它既包括传统的程序设计风格准则,也包括与面向对象方法的特点相适应的一些新准则。面向对象方法学使用独特的概念和完成软件开发工作,因此,在测试面向对象程序的时候,除了继承传统的测试技术之外,还必须研究与面向对象程序特点相适应的新的测试技术。在这方面需要做的研究工作还很多,目前已逐渐成为国内外软件工程界研究的一个新的热门课题。面向过程的优缺点“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向过程其实是最为实际的一种思考方式,就是算面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际的实现.一般的面向过程是从上往下步步求精.所以面向过程最重要的是模块化的思想方法.对比较面向对象,面向对象的方法主要是把事物给对象化,对象包括属性与行为.当程序规模不是很大时,面向过程的方法还会体现出一种优势,因为程序的流程很清楚,按着模块与函数的方法可以很好的组织.比如拿学生早上起来的事情来说说这种面向过程吧.粗略的可以将过程拟为。(1)起床(2)穿衣(3)洗脸刷牙(4)去学校而这4步就是一步一步的完成,它的顺序很重要,你只须一个一个的实现就行了.而如果是用面向对象的方法的话,可能就只抽象出一个学生的类,它包括这四个方法,但是具体的顺序就不能体现出来。1、 面向对象相对面向过程的优点 (1) 结构清晰。使人们的编程与实际的世界更加接近,所有的对象被赋予属性和方法,结果编程就更加富有人性化。 (2) 封装性。减小外部对内部的影响。封装将对象有关的数据和行为封装成整体来处理,使得对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。 (3) 容易扩展,代码重用率高。容易扩展,在大框架不变的情况下很容易就开发出适合自己的功能,实现简单,可有效地减少程序的维护工作量,软件开发效率高。 2、 面向对象相对面向过程的缺点 (1) 增加工作量。如果一味地强调封装,当进行修改对象内部时,对象的任何属性都不允许外部直接存取,则要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。 (2) 性能低。由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小的都开销很大。 3、举例 (1) 面向对象的优点举例:如象棋程序,比如我要加入悔棋的功能,如果面向过程设计的话,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了红黑双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。 (2) 面向对象的缺点举例:如技术类开放问题2的留言板系统,当设计一个留言板系统,要求满足记录数每日新增10万条和查询量100万,如果每一个数据交换过程都是一个对象,那么总的性能损失将是天文数字。 泛型编程思想什么是泛型编程思想:泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象这样的事;泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含意,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。概述泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。STL以迭代器 (Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(function objects)。STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象,这样的事情;熟悉一些其它面向对象的语言的人应该知道,如Java里面这是通过在List里面存放Object引用来实现的。Java的单根继承在这里起到了关键的作用。然而单根继承对C+这样的处在语言链底层的语言却是不能承受之重。此外使用单根继承来实现通用容器也会带来效率和类型安全方面的问题,两者都与C+的理念不相吻合。由来泛型编程最初诞生于C+中,由Alexander Stepanov2和David Musser3创立。目的是为了实现C+的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。比如qsort泛化之后就变成了:templatevoid sort(RandomAccessIterator first, RandomAccessIterator last,Compare comp);其中first,last这一对迭代器代表一个前闭后开区间,迭代器和前闭后开区间都是STL的核心概念。迭代器建模的是内建指针的接口(解引用、递增、递减等)、前闭后开区间是一个简单的数学概念,表示从first(含first)到last(不含last)的区间内的所有元素。此外,comp是一个仿函数(functor)。仿函数也是STL的核心概念,仿函数是建模的内建函数的接口,一个仿函数可以是一个内建的函数,也可以是一个重载了operator()的类对象,只要是支持函数调用的语法形式就可成为一个仿函数。通过操作符重载,C+允许了自定义类型具有跟内建类型同样的使用接口;又通过模板这样的参数化类型机制,C+允许了一个算法或类定义,能够利用这样的接口一致性来对自身进行泛化。例如,一个原本操作内建指针的算法,被泛化为操纵一切迭代器的算法。一个原本使用内建函数指针的算法,被泛化为能够接受一切重载了函数调用操作符(operator())的类对象的算法。编辑本段泛型的机制编译机制1. 第一轮编译时,编译器只为Stack(栈算法)类型产生“泛型版”的IL代码与元数据-并不进行泛型类型的实例化,T在中间只充当占位符2. JIT编译时,当JIT编译器第一次遇到Stack时,将用int替换“泛型版”IL代码与元数据中的T-进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。泛型编程的优点:(1)使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能;(2)使用泛型可以创建集合类;. NET Framework类库在System.Collections.Generic命名空间中包含几个新的泛型集合类,应尽可能地使用这些类来代替普通的类,如System.Collections命名空间中的 ArrayList;(3)可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托;(4)可以对泛型类进行约束以访问特定数据类型的方法;(5)关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。缺点:(1)在性能上没有数组快。(2)虽然泛型程序设计方法与面向对象程序设计方法相比具有极大的优越性,并已成功地用于一大批通用程序库的开发。然而,在实际运用中面向对象程序设计依然具备泛型程序设计尚未具备的一个很大优势,由于面向对象程序设计采用的对象类表示简单、易于理解,并且基于对象类的继承机制语义清晰、便于实现。面向对象程序设计的抽象、封装、继承性、多态性等特点能够得到语言一级的支持。对于泛型程序设计,目前尚没有任何一个主流程序设计语言能够直接定义或表示泛型程序设计方法。无论是早期的Ada泛型编程,还是目前流行的c+模板编程,或者正在计划推出的c#with Generics,所采用的泛型编程方法,都不是真正意义上的“基于需求”的泛型程序设计。它们所采用的泛型程序设计方法,主要是通过人工的约定来遵循和运用,并要求编程者具备很高的素质和长期的经验。与当前面向对象程序设计方法已被众多语言支持相比,这是泛型程序设计一个很不理想的薄弱环节。泛型程序设计的优越性也必须在实现了泛型程序设计的基本方法的直接程序语言支持之下,才能充分展示出来。 泛型程序设计不能被程序设计语言直接支持有多种原因,其中最主要的原因是:泛型程序设计方法中的概念包含太多,过于庞杂,或内容含混,使得现有的程序设计语言编译技术无法有效地处理,不能保证或验证出类型需求是否确实被类型参数满足。导致了泛型程序设计目前还属于程序设计中的高阶技术,有碍于其广泛运用和普及。如下例子:/ Declare the generic class public class GenericList void Add(T input) class TestGenericList private class ExampleClass static void Main() GenericList list1 = new GenericList(); GenericList list2 = new GenericList(); GenericList list3 = new GenericList(); 面向对象与面向过程程序设计有如下不同: (1)面向过程程序设计方法采用函数(或过程)来描述对数据的操作,但又将函数与其操作的数据分离开来;面向对象程序设计方法将数据和对数据的操作封装在一起,作为一个整体来处理。 函数与数据是否分离。(2)面向过程程序设计方法以功能为中心来设计功能模块,难于维护;而面向对象程序设计方法以数据为中心来描述系统,数据相对于功能而言具有较强的稳定性,因此更易于维护。 以功能为中心;以数据为中心。(3)面向过程程序的控制流程由程序中预定顺序来决定;面向对象程序的控制流程由运行时各种事件的实际发生来触发,而不再由预定顺序来决定,更符合实际需要。 预定顺序;由运行时各种事件的实际发生来触发 (4)面向对象程序设计方法可以利用框架产品(如MFC,Microsoft Foundation Classes)进行编程。 面向对象可利用框架 面向对象和面向过程的根本差别,在于封装之后,面向对象提供了面向过程不具备的各种特性,最主要的,就是继承和多态。面向对象程序设计与泛型程序设计的比较:泛型程序设计比面向对象程序设计具有更高的抽象能力。面向对象程序设计与泛型程序设计的抽象机制的区别是十分明显的。由于面向对象程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论