面向对象死了吗?

     本来打算写一篇介绍OOP的由来,优缺点和适用范围等的理论性的文章。但是读过OOP大师和反对者的一些言论之后,这种想法就没有了。我们从小就受到一种非黑即白的价值理念的教导,事物要嘛是好的,否则就是坏的。世界上没有一种放之四海而皆准原理和方法,只要你掌握了,就可以解决所有的问题。也是我们所说的万能钥匙,等同于现在电视购物里面包治百病的万能神药。相信做程序的都是理性的,对这种神药大多数人一笑了之,并不会相信。但是在自己的专业领域,就没有意识到,OOP也变成了你的万能神药,而且还那么让人痴迷。

     对一样事物,如果只有一种声音,必定是恐怖的,在社会人文以至于编程领域都是如此。Bjarne Stroustrup 这样说的OO面向对象--[ 什么是OO面向对象?当然,不会是所有的程序都是面向对象的,而且,也不是所有的面向对象程序就是好的。如果面向对象是好的,那么“Object- Oriented”应该成为“Good”的同义词,并且,OO概念只会成为一个假大空的口号,在你需要做出实际决定时只可能帮你那么一丁点。]

面向对象的编程OOP的历史

  面向对象程序设计的雏形,早在1960年的Simula语言中即可发现,当时的 程序设计领域正面临着一种危机:在软硬件环境逐渐复杂的情况下,软件如何得到良好的维护?面向对象程序设计在某种程度上通过强调 可重复性解决了这一问题。20世纪70年代的 Smalltalk语言在面向对象方面堪称经典——以至于30年后的今天依然将这一语言视为面向对象语言的基础。

OO狂热分子眼中的OO
http://www.csis.pace.edu/~bergin/patterns/ppoop.html

反对者对OO的看法
 卡内基梅隆大学教授Robert Harper在博客上称,该校计算机科学系从大一新生课程中删除了面向对象编程。他说,面向对象编程从入门课程中完全取消了,因为O-O的性质是 反模块化和反并行的,不适合进入现代计算机科学教学课程。原文地址: http://existentialtype.wordpress.com/2011/03/15/teaching-fp-to-freshmen/ . 
 那么如何理解OO是反模块和并行的呢?知乎上Rio是这么说的:【面向对象的核心是封装状态和相应的过程。通常面向对象是通过改变内部状态实现最终目的。调用对象过程的主要目的是产生改变其内部状态这个副作用(side effect)。这样封装的初衷是避免多个主体访问、修改同一状态造成混乱。在不少场合这样的封装确实也达到了目的,所以面向对象的方式才这么普及。但可变状态并不适合多核并行计算。如果多个并行进程需要用到同一状态,对这个状态的修改会导致一致性问题:由于访问、修改的先后顺序不同,各个进程也许会看到不同的结果。锁机制能部分的避免一致性问题,但并不解决多核并行的性能问题。不变状态则不存在这个问题,多个并行进程可以随意访问某个状态。因为状态是不变的,所以不存在一致性的问题。】

陈皓在《 如此理解面向对象编程》一文中认为 OOP的本质就是——对数据和与之关联的行为进行编程。便就算是这样也不完全对,因为  Sometimes data is just data and functions are just functions.

面向对象成功的地方

面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。

目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。 此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某 些领域对此予以否认。


面向对象的弊端

 OO的弊端就是:设计抽象和封装的时间远远超过你解决问题的时间。 对OO来说,最好只是把它看作一种语言工具,而不是模型工具。
另一弊端在于作为一种建模技术没有很好的 定义自己的适用范围。面向对象脱胎的环境有两个重要因素,一是基于 WIMP (Window, Icon, Menu, Pointer) 的图形化界面,二是早期提供图形界面接口的机器缺乏代码级别之外的组件管理方式 (比如 Unix 的进程和 IPC)。

面向对象在 WIMP 的环境中是很必要也是很成功的。原因是 WIMP 环境需要重量的实现继承提供的重用,WIMP 的对象种类能很好的被单继承模拟,WIMP 的属性和类别容易区分。而面向对象扩展到 WIMP 之外的环境中就失败了:
  1. 实际世界是多纬度的,属性和类别不好区分。红苹果是 color 属性为 red 的苹果,还是 Apple 的子类?
  2. 实际世界的工具是用来完成任务的。而不是象 WIMP 那样构建一个虚拟的空间化界面。
  3. 《人月神话》指出,编写 reusable code 比编写普通 code 至少要多花三倍的工作量。而面向对象的模糊了代码的重用和使用。使被重用的代码的依赖复杂化。导致很多不适合被重用的代码被重用。编写代码时要过分考虑重用的可能性。
  4. 其它管理复杂度的机制越来越流行。

面向对象的编程是思想和理论吗?

在陈昊的《对象已死》一文中,作者认为 【在这个年代,大家有一种神圣化面向对象技术的倾向,很多人都把对象技术奉为高深的思想和理论。但实际上,面向对象技术仅仅一种 工程实践而已,它是依托于其他技术而存在的一种实践,本身并不是一种完备的计算模型。 对于可计算性问题的研究和发展,大抵确立了几种的计算模型:递归函数类、图灵机、Lambda演算、Horn子句、Post系统等等。但是面向对象始终没有一个自己的计算模型。 作者认为有两种不同的“面向对象”技术。其中一种是用来解决如何构造更好的类型系统的,它是以抽象数据类型( ADT,Abstract Data Type)为源起。另一种是用来对函数和副作用进行有效模块化和局部化的数据抽象。静态类型的函数语言未来可能成为主流。】
 对OO来说,最好只是把它看作一种语言工具,而不是模型工具。

 

那么我们怎么来解决SOA的接口复杂度问题?其实,Unix早就给出了答案——数据驱动编程(详见:《Unix 编程艺术》的第9.1章),在我离开Amazon的时候,美国总部的Principle SDE们在吐槽今天Amazon的SOA架构,更好的架构应该是数据驱动式的。(今天还在Amazon的同学可以上内网boardcast上看看相关的 Principle Talk视频)

面向对象要解决的问题

 面向对象始于模拟应用,后来被视为面向过程编程无法向巨型项目扩展绝症的解药。再以后被『发挥』到极致,不管适不适合都要用面向对象的方式去解决,应了那 句老话『 锤子眼里全是钉子』。基本上代码里面出现诸如 Executor.execute() 类似表达时,它在面向对象这条歧途上就已经走得太远了。



设计模式和面向对象的关系

 那23个经典的设计模式和OO半毛钱关系没有,只不过人家用OO来实现罢了。设计模式就三个准则:1)中意于组合而不是继承,2)依赖于接口而不是实现,3)高内聚,低耦合。你看,这完全就是Unix的设计准则。

 即使是在面向对象热潮达到顶峰的时候,我就坚称,并不是任何东西都可以成为对象,各种模式的混合使用在过去,在将来,都是正确之道。即使现在函数式编程正 趋于流行、使用量增加的情况下仍然会是这种情况。那些古老的编程模式会完全的消失吗?我不这么认为。以后大家都不用对象了吗?不可能的。我想,那些大学, 特别是声称“提供教育而培训”的大学其实是对学生的一种伤害,他们没有看到当今这个领域的真实情况。不祥之兆不断显现,函数式编程日显重要。但忽略面向对象编程不会给任何人带来好处。只是我的个人意见。

总结

面向对象的编程只是一种 编程范式[paradigm  describes distinct concepts or thought patterns.  ],也是一种程序开发方式。编程范式在维基百科中如下解释-- 编程范型编程范式即模范之意,范式即模式、方法),是一类典型的 编程风格,是指从事 软件工程的一类典型的风格(可以对照 方法学)。如: 函数式编程、 程序编程、 面向对象编程、 指令式编程等等为不同的编程范型。当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于 面向对象系统分析和 面向对象设计(Object Oriented Design,简称OOD)方面的知识。

面向对象的编程仅仅是一个工程实践

而不是一种原理(principle),和Model也不是同样的概念。Model是为了对复杂的事物做出抽象而建立的原型,面向对象的分析和设计中可能需要建模。而建模在各种泛型的编程中都存在。

编程的目的,是为了解决人们的问题,或者实现一个功能,解决问题的实体叫做软件。对于软件的构建方式,面向对象的编程范型和其他编程范型一样,只是一种方法而已。解决复杂问题靠的是抽象和建模,这对任何编程范型都是需要的。没有必要把面向对象编程神化,作为解决所有问题的办法,并不是任何东西都可以成为对象,各种模式的混合使用在过去,在将来,都是正确之道。






参考:
http://coolshell.cn/articles/8745.html
面向对象是一个骗局
http://coolshell.cn/articles/3036.html
设计模式和面向对象的关系
http://coolshell.cn/articles/8961.html
对象已死
http://www.infoq.com/cn/articles/object-have-dead
面向对象的编程已死
http://www.aqee.net/object-oriented-programming-is-dead/ 
原文:http://blogs.msdn.com/b/alfredth/archive/2011/03/22/object-oriented-programming-is-dead.aspx

怎样理解或评价面向对象的编程技术?

http://www.zhihu.com/question/19582024






你可能感兴趣的:(编程语言)