
面向对象的优缺点.docx
7页面向对象的优缺点什么是面向对象程序设计?面向对象程序设计(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 Stepanov[2]和 David Musser[3]创立目的是为了实现 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 编译器第一次遇到 Sta。












