Atitit . 编程模型的变革总结
Atitit . 编程模型的变革总结
2.1. OO的弊端就是:设计抽象和封装的时间远远超过你解决问题的时间。 2
2.4. “面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。
2
3.2. 面向模块、库或者接口(module/package)也许是更好的选择 3
3.4. 函数式语言也许可能会取代面向对象技术成为主流方式 4
1. 面向对象与面向过程程序设计有如下不同:
1.1. 函数与数据是否分离....
(1)面向过程程序设计方法采用函数(或过程)来描述对数据的操作,但又将函数与其操作的数据分离开来;面向对象程序设计方法将数据和对数据的操作封装在一起,作为一个整体来处理。函数与数据是否分离。
1.2. 以功能为中心;以数据为中心.....
(2).面向过程程序设计方法以功能为中心来设计功能模块,难于维护;而面向对象程序设计方法以数据为中心来描述系统,数据相对于功能而言具有较强的稳定性,因此更易于维护。以功能为中心;以数据为中心。
1.3. 事件驱动
3)面向过程程序的控制流程由程序中预定顺序来决定;面向对象程序的控制流程由运行时各种事件的实际发生来触发,而不再由预定顺序来决定,更符合实际需要。预定顺序;由运行时各种事件的实际发生来触发
1.4. 继承和多态
4)(4)面向对象程序设计方法可以利用框架产品(如MFC,Microsoft Foundation Classes)进行编程。面向对象可利用框架面向对象和面向过程的根本差别,在于封装之后,面向对象提供了面向过程不具备的各种特性,最主要的,就是继承和多态。
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
2. 面向对象的弊端
2.1. OO的弊端就是:设计抽象和封装的时间远远超过你解决问题的时间。
2.2. 复杂的数据类型
2.3. 并发编程/并行计算/多核编程
2.4. “面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。
你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。” — Joe Armstrong(Erlang语言发明人)
2.5. 面向对象的可维护性::最强的耦合关系
面向对象从一开始就要求我们完全了解各个子类的不同,并将他们的“共性”提取到父类里,从而实现代码复用, 在这个过程中自然形成了一种最强的耦合关系
3. 解决之道::
3.1. 逻辑式语言结构
3.2. 面向模块、库或者接口(module/package)也许是更好的选择
在一个需求在不断变化,业务逻辑在不断增加的复杂系统中,面向模块、库或者接口(module/package)也许是更好的选择。
3.3. Aop /泛型程序设计 是个不错的模式
面向对象程序设计与泛型程序设计的比较:
泛型程序设计比面向对象程序设计具有更高的抽象能力。面向对象程序设计与泛型程序设计的抽象机制的区别是十分明显的。由于面向对象程序设计以共同的基类为共性抽象,而泛型程序设计是以共同的需求条件为共性抽象。因此,泛型程序设计比面向对象程序设计具有更高的抽象能力,并且包含了面向对象程序设计的核心内容。一般来讲,直接以对象类为概念进行抽象,抽象的程度并不高,而直接以对象类满足的需求条件进行分类和抽象,则可以获得非常高级别的抽象,并会带来更大的通用性和运行效率。
泛型程序设计比面向对象程序设计更具有通用性。面向对象程序设计的通JFfj性是建立在类继承机制上,这导致了面向对象的算法只能被用在有限的类型上,而泛型程序设计的算法是建 在结构一致性上。简单说,结构一致性是指语法结构上的一致性。泛型程序设计假定某个特定的语法跟其语义能够对应起来。譬如说,在C++中,std::sort()算法的一个版本只要求其操作数支持operator<,基本上这就是说只要对于其操作数来说“a<b”能够通过编译,该算法就能成功。而面向对象程序设计,利用面向对象方法设计完成的通用算法要求其操作数要继承自某个特定的基类。所以说,泛型程序设汁算法能够运用到的类型集是无限的/非绑定的。
结束语
面向对象程序设计方法与泛型程序设计方法各有千秋。在某些情况下,良好的泛型程序设计规则可能违背良好的面向对象的程序设计方法的规则,反之亦然。但这两种程序设计方法并不是水火不容,而是相得益彰。将这两种方法巧妙地结合,便形成了程序设计的新思维,可以更有效地解决应用领域的实际问题。
3.4. 函数式语言也许可能会取代面向对象技术成为主流方式
在计算机科学发展的早期,对于计算机的非数值计算应用的讨论,以及对于可计算性问题的研究和发展,大抵确立了几种的计算模型:递归函数类、图灵机、 Lambda演算、Horn子句、Post系统等等。其中递归函数类是可计算性问题的数学解释;Horn子句是prolog这类逻辑语言的理论基 础;lambda演算成为了函数式语言的理论基础;图灵机是图灵解决可计算问题的时候所设计的装置,其后成为计算机的装置模型,与图灵机相关的自动机以及 冯诺依曼结构,成为了命令式语言的理论基础
3.5. 不用构建复杂的数据类型,数据可由函数来表达
抽象数据类型(ADT,Abstract Data Type)为源起,发展出来的面向对象技术。也就是首先被C++所采用的面向对象技术。
C++作为“更好的C”,继承了C语言对于程序的看法,也就是数据抽象(Data Abstraction)和过程。面向对象技术在C++中,是作为一种更好的数据抽象的方式而存在的。
数据抽象在这类面向对象语言中是一种关键的抽象方式。所谓数据抽象,在计算机发展的早期是一种非常关键的技术。众所周知,计算机在装置模型上是一个 存储和一组指令集,而二进制的存储实际上是没有任何类型表示的。整数,浮点这些操作必须通过相应的约定,再以指令集的形式进行支持。而随着计算机的发展, 简单的数据类型显然已经不能满足应用的需要。这时候一种灵活且有效的类型系统,就成了一种自然的追求(直到80年代初,类型系统都是计算机科学研究的重要 方向之一)。
另一种对象技术出现的很早,大概在60年代末就出现了,直到80年代初还有发展。但是很长一段时间内并不是太主流的做法,反而并不太为人所知。
在函数式语言里,因为高阶函数(High Order Function)的存在,数据可由函数来表达。这就是函数语言里一个非常重要的观点:Data as Procedure。在函数语言中,可以构造一种非常类似于对象的高阶函数:
4. 并发编程/并行计算/多核编程
多核CPU作为一种新的事物,给计算机界带来了新的恐慌,大家觉得有必要使用一种新的编程模型以充分利用多核的优势。
虽然第一个著名的实现是Erlang的actor系统,但是由于消息传递风格和面向对象模型相去不远,很快就在各种面向对象语言中有了类库支持。虽然 利用当代函数语言的语法特性,actor可以实现得更简洁,但是对象对于副作用和状态的封装,更好地解决了在并发环境下对于共享状态的操作,反而有了更好 的发展。
5. 淋巴
不好说。。。结合起来,更好吧。。
6. 参考
对象已死?.htm
参考文献
[1]孙斌.扩展面向对象编程(XOOP)的理论和方法[J].汁算机学报,2001,24(3):266—280.
[2]郑莉,董渊,张瑞丰编.C++语言程序设计(第3版)[M],北京:清华大学出版社出版,2003
[3]Matlew H Austern.泛型编程与STL[M],北京:中国电力出版社,2003,
面向对象的优缺点_百度文库.htm
(佳)面向对象的缺点_mailrun_新浪博客.htm
他们为什么说面向对象有问题,探讨面向对象的一些缺陷 - OurJS.htm
Atitit . 编程模型的变革总结的更多相关文章
- Atitit.web三大编程模型 Web Page Web Forms 和 MVC
Atitit.web三大编程模型 Web Page Web Forms 和 MVC 1. 编程模型是 Web Forms 和 MVC (Model, View, Controller). 2. ...
- Atitit..组件化事件化的编程模型--(2)---------Web datagridview 服务器端控件的实现原理and总结
Atitit..组件化事件化的编程模型--(2)---------Web datagridview 服务器端控件的实现原理and总结 1. 服务端table控件的几个流程周期 1 1.1. 确认要显示 ...
- atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系
atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系 1. 服务器控件是可被服务器理解的标签.有三种类型的服务器控件: 1 1.1. HTML 服务器控件 ...
- Atitit.web三编程模型 Web Page Web Forms 和 MVC
Atitit.web三编程模型 Web Page Web Forms 和 MVC 1. 编程模型是 Web Forms 和 MVC (Model, View, Controller). 2. W ...
- atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系
atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系 1. server控件是要server了解了标签.种类型的server控件: 1 1. ...
- JS魔法堂:深究JS异步编程模型
前言 上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...
- 多线程之异步编程: 经典和最新的异步编程模型,async与await
经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...
- 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换
经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...
- jQuery插件编写及链式编程模型小结
JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...
随机推荐
- JOIN与EXISTS(子查询)的效率研究
使用MySQL提供的Sample数据库Sakila 现将profiling打开,用来一会查看sql执行时间 set profiling=1; exists 子查询与 join联接效率的对比,功能:查看 ...
- 9.线程通信wait、notify
线程之间通信 1.线程是操作系统的独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体. 2.使用wait.notify,方法实现线程通信(2个方法都是需要object方法) 3.wait(释放 ...
- datagridview 纵向 横向 合并单元格
datagridview 单元格合并:纵向以及横向合并参考了csdn上不知哪位的代码,具体哪位找不到连接了. 纵向合并: /// <summary> /// 纵向合并,即合并数据项的值 / ...
- 缩进与对齐——正确地使用Tab和空格
写代码时大家都会使用缩进(indentation)和对齐(alignment),这是两个相关而又不同的概念,两者都是为了提高代码的可读性.缩进出现在一行的最左边,目的是明显地区分开包含与被包含的代码: ...
- 使用SQL SERVER FOR XML PATH将多个结果集转换成一行并进行去重处理
在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样 --患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录 IF OBJECT ...
- winrar X64 win10 破解
破解方法, win10 64位 复制下面内容到 RarReg.key 文件 RAR registration datawncnUnlimited Company LicenseUID=1b064ef8 ...
- PostgreSQL流复制参数max_wal_senders详解
转自:http://my.oschina.net/Kenyon/blog/152234PostgreSQL 9.2.4 主机:192.25.10.76 从机:192.25.10.71 做postgre ...
- GDB高级使用方法
1.设置环境变量 用户可以在GDB的调试环境中定义自己需要的变量,用来保存一些调试程序中的运行数据.要定义一个GDB的变量很简单,只需使用GDB的set命令. GDB的环境变量和Linux一样,也是以 ...
- vue computed 可以使用getter和setter
var vm = new Vue({ data: { a: 1 }, computed: { // 仅读取 aDouble: function () { return this.a * 2 }, // ...
- HttpClient 解说 (1) 基础
前言 超文本传输协议(HTTP)或许是当今互联网上使用的最重要的协议了. Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web浏览器范畴.同一时候,也添 ...