Atitit 面向对象弊端与问题 坏处 缺点
Atitit 面向对象弊端与问题 坏处 缺点
1.1. 状态fsm,反模块化,又是反并行的,这是它的非常固有的特征, 1
1.2. 现时的OOP编程有可能不缓存友好(cache friendly), 1
1.3. 面向对象是一个很重量级的方法。你得设计类的继承关系。 3
1.5. ,毕竟很难一开始就做好规划,所谓的is-a,has-a 3
1.1. 状态fsm,反模块化,又是反并行的,这是它的非常固有的特征,
1.2. 现时的OOP编程有可能不缓存友好(cache friendly),
过度封装
使用OOP时,会把一些复杂的问题分拆抽象成较简单的独立对象,通过对象的互相调用去实现方案。但是,由于对象包含自己封装的数据,一个问题的数据集会被分散在不同的内存区域。互相调用时很可能会出现数据的cache miss的情况。
2. 多态
在C++的一般的多态实现中,会使用到虚函数表。虚函数表是通过加入一次间接层来实现动态派送。但在调用的时候需要读取虚函数表,增加cache miss的可能性。基本上要支持动态派送,无论用虚函数表、函数指针都会形成这个问题,但如果类的数目极多,把函数指针如果和数据放在一起有时候可放缓问题。
3. 数据布局
虽然OOP本身并无限制数据的布局方式,但基本上绝大部分OOP语言都是把成员变量连续包裹在一段内存中。甚至使用C去编程的时候,也通常会使用到OOP或Object-based的思考方式,把一些相关的数据放置于一个struct之内:
即使不使用多态,我们几乎不加思索地会使用这种数据布局方式。我们通常会以为,由于各个成员变量都紧凑地放置在一起,这种数据布局通常对缓存友好。然而,实际上,我们需要考虑数据的存取模式(access pattern)。
在OOP中,通过封装,一个类的各种功能会被实现为多个成员函数,而每个成员函数实际上可能只会存取少量的成员变量。这可能形式非常严重的问题,例如:
for (Particle* p = begin; p != end; ++p)
p->position += p->velocity * dt; // 或 p->SimulateMotion(dt);
在这种模式下,实阶上只存取了两个成员变量,但其他成员变量也会载入缓存造成浪费。当然,如果在迭代的时候能存取尽量多的成员变量,这个问题可能并不存在,但实际上是很困难的。
如果采用传统的OOP编程范式及实现方式,数据布局的问题几乎没有解决方案。所以在[1]里,作者提出,在某些情况下,应该放弃OOP方式,以数据的存取及布局为编程的考虑重中,称作面向数据编程(data-oriented programming, DOP)。
1.3. 面向对象是一个很重量级的方法。你得设计类的继承关系。
得写类的声明,得实现不同的虚方法;实现时要注意是否要调用父类的方法。调试的时候经常搞不清楚到底执行哪个类的虚方法了。而用一大堆switch case,语句执行顺序一目了然。
可能还是觉得代码层级过多?有很多办法可以整理得更干净。用了面向对象,省了switch case,却要写更多的virtual function的声明和实现
1.4. 继承的代价庞大的继承体系来获得代码的可重用性
。这并不是一个新颖的话题,自面向对象编程诞生之日起就饱受争议,我们经常要忍受着愈加繁杂和庞大的继承体系来获得代码的可重用性,而且随着继承层次的增加,代码的复杂性会加速增长,随之而来的bug也会越来越难以发现
面向对象之所以被很多人诟病的原因之一,是在框架和库的层次(如果这两个一起开发的话),他会形成巨型的继承树,一旦这颗树的设计出现问题,做细节的微调还可以,比如功能函数的上推下拉,局部重构等等,但是如果做大的调整很容易造成重大兼容性问题。
1.5. ,毕竟很难一开始就做好规划,所谓的is-a,has-a
特别是java,c++这种静态强类型系统,如果编码使用自顶向下的继承,代码的灵活性非常差,毕竟很难一开始就做好规划,所谓的is-a,has-a,在现实世界里碰到特例会死的很惨。
面向对象之所以被很多人诟病的原因之二,是在写功能的层次,很多程序员都试图做出更大更深层次的抽象,不停的做抽象类和接口,在代码中生成大量的粘合层,而这些内容应该放到框架和库的层次去做,而不是在做功能开发时为了未来可能有的功能埋下大量的代码接口而忽略了开发功能的本质工
参考资料
浅谈面向对象的坏处 - fishmai的专栏 - 博客频道 - CSDN.NET.html
面向对象编程已死?_知识库_博客园.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit 面向对象弊端与问题 坏处 缺点的更多相关文章
- Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...
- Atitit 面向对象 封装的实现原理
Atitit 面向对象 封装的实现原理 1.1. 动态对象的模拟使用map+函数接口可以实现1 1.2. 在用结构体 + 函数指针 模拟 对象 1 1.3. This指针..1 1.4. " ...
- Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat
Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 ...
- KCF的弊端
一.前情提要 如果你对目标跟踪和KCF是什么东西还不了解的话欢迎你看前一篇博文KCF入门详解:https://www.cnblogs.com/jins-note/p/10215511.html ...
- 面试题---->线程的入门,读完可以应付一般的面试(管理员不要移除我的随笔啊)
这个都是入门和一般的常规知识,大佬轻喷 ①.继承Thread类 ②.实现Runnable接口(常用,优点多) ③.实现Callable接口 实现Runnable和Callable接口的类只能当作一个可 ...
- 从零开始学Python第0周:Python基本介绍(部分内容来源于网络)
Python入门介绍 一,Python的基本介绍 (1)概要 Python是一种解释型,面向对象,动态数据类型的高级程序设计语言.常被广泛用于处理系统管理任务和web编程.现如今Python已经成为了 ...
- Head First设计模式之策略模式
这是学习的第一个设计模式,而书中写的实例相对比较复杂,参考了网上的文章进行总结 一.定义 策略模式(strategy pattern): 定义了算法族, 分别封闭起来, 让它们之间可以互相替换, 此模 ...
- AutoCAD开发选择----ObjectARX还是.net API(转载)
本文基于AutoCAD 2006新推出的.NET API为工具,介绍了在.NET平台下对AutoCAD进行二次开发的技术,并与目前常用的VBA.ObjectARX作了对比.同时讨论了如何弥补.NET ...
- T-SQL动态查询(3)——静态SQL
接上文:T-SQL动态查询(2)--关键字查询 本文讲述关于静态SQL的一些知识和基础技巧. 简介: 什么是静态SQL?静态SQL是和动态SQL相对而言的,其实我们没必要过于纠结精确定义,只要大概 ...
随机推荐
- JS-随机函数
// alert( Math.round(3.4) );// 0~1 : Math.round(Math.random());// 0~10// alert( Math.round(Math.rand ...
- 广义Euler常数
对于区间(a,b)内f''(x)>0 那么在该区间内函数的一阶导数对应切线在该区间内只与f(x)在切点相交 1. f''(x)>0那么可知 f'(x)在该区间内是单调增的 以下图为例,过( ...
- Freemarker常用指令使用范例
我的開發環境 框架: springmvc+freemarker 開發工具: springsource-tool-suite-2.9.0 JDK版本: 1.6.0_29 ...
- MySQL入门手册
本文内容摘自MySQL5.6官方文档,主要选取了在实践过程中所用到的部分文字解释,力求只摘录重点,快速学会使用MySQL,本文所贴代码地方就是我亲自练习过的代码,凡本文没有练习过的代码都没有贴在此处, ...
- 总有一项适合你:联想 Miix2 8寸版触摸屏失灵的各项解决方案
今天试着自己拆开后盖重新拆了一下排线,果然这个方法才是王道.在搜索攻略的时候看到了下面的帖子,觉得总结的不错,特此转载过来: 白色石头 2015-05-22 10:07● 使用评测 总有一 ...
- Python基于pandas的数据处理(二)
14 抽样 df.sample(10, replace = True) df.sample(3) df.sample(frac = 0.5) # 按比例抽样 df.sample(frac = 10, ...
- iOS-三方框架AFNetworking基本使用
AFNetworking 是基于NSURLConnection, NSOperation开发的一款三方框架,主要用于处理一些关于网络请求上的业务,下文会简单介绍框架中经常使用的功能,如文件的上传,下载 ...
- 转:如何调试PHP的Core之获取基本信息
其实一直想写这个系列, 但是一想到这个话题的宽泛性, 我就有点感觉无法组织. 今天我也不打算全部讲如何调试一个PHP的Core文件, 也不会介绍什么是Coredump, 选择一个相对比较简单的方向来介 ...
- mysql大数据表改表结构方案
有一个表有上千W数据, 用什么方法给这个表加一个字段最快?1. alert2. 建一个表和第一个表一样,只是多了要加的字段,然后用多个INSERT INTO SELECT语句limit写入3. 就是导 ...
- weui 问题
1.阻止checkbox 被 checked 方法1: $('.weui-check').on('click', function(e){ $(this).attr('disabled', true) ...