Why OO Sucks

    读了Joe Armstrong的经典文章"Why OO Sucks": http://www.sics.se/~joe/bluetail/vol1/v1_oo.html

 

 

Objection 1 - Data structure and functions should not be bound together

 

Objection 2 - Everything has to be an object.

 

Objection 3 - In an OOPL data type definitions are spread out all over the place.

 

Objection 4 - Objects have private state.

 

Why OO was popular?

  • Reason 1 - It was thought to be easy to learn.

  • Reason 2 - It was thought to make code reuse easier.

  • Reason 3 - It was hyped.

  • Reason 4 - It created a new software industry.
    其实各自看问题的角度不同而已,各有利弊,而且两种语言设计宗旨和适用场景也是不一样的.

    这篇文章让我想起了以前看过的另一篇文章“How enterprises use functional languages, and why they don't”,举个例子,个人计算机发展起来的原因之一就是GUI的流行,对GUI编程而言,OOP是最好的选择,如Android,MFC,QT,而且历史已证明OOP是最适合GUI编程的,因为GUI中包含了太多的OO元素,如继承,大多widget都有着继承关系,如果用FP的数据方法分离去写的话,岂不是编程者需要维护管理无数个widget内部数据,此时OO的private state就有着不可替代的作用。(对FP而言private state就意味着side effect)

    Joe说的第一点“数据和方法应该分离”,我觉得这点在大型软件项目中有点争议,在大型软件系统开发和维护中往往比较重视扩展性,从设计模式上讲是开闭原则,往现有系统中加一个扩展的组件,这个组件包含了数据和方法(对接口的实现),又不能对已有模块产生影响,在此种场景下,很难做到数据和方法分离,如果一定要把数据和方法绑定的话,就改变了已有的数据结构,违反“扩展性”的原则,所以在极大型的软件项目开发中数据和方法有时是很难分离的。

    仔细发现Erlang OTP实现中也不完全是数据和方法分离(似乎Joe搬起石头砸了自己的脚:)),举个最经典的例子,mnesia,mnesia是otp使用比较广泛的数据库,底层存储是ets或dets,在mnesia的实现中,mnesia需要维护很多全局状态变量,它使用的是process dictionary来保存全局变量,这些变量从某种意义上讲已经是OO中的private state了,这点已经违背了Joe说的第四点,总的说来,mnesia本身就没有做到数据和方法的严格分离。 

   有意思的是Joe爷爷以前说过他很喜欢smalltalk,smalltalk可是比Java还OO呢!

你可能感兴趣的:(erlang)