我们知道面向对象有三要素 封装、继承、多态
首先谈谈封装,我认为OOP有一个很大的创新,那就是它能够显式地封装状态,而封装状态这个概念在过去是没有的(无论是面向过程还是函数式)。
举个例子:有些编程语言有模块(Module)的概念,而模块本质上是一个绑定的集合(他被赋予名字,然后可以被模块外的代码引用)。如果你的语言不支持任何mutable操作则没问题。然而,一旦你引入了mutable,这个模块就不纯了。这时候你可能会想要两个模块,或者模块间通信之类玩意,于是模块就变成了类。。。
当然如果你能保证代码里完全没有mutable,那完全用模块就好了,但是你懂的。。。(mutable再怎么不好,它总是不可避免的存在,现实世界总是那么复杂)
所以类本质上就是模块,只是把绑定的时机从程序初始化延迟到了类的实例化。
接下来谈一下继承,相对于上面的封装来讲,继承的亮点确实少了很多,但仍然是不错的语言特性。利用继承,可以最大限度的复用已有的代码(通过开闭原则)。
值得一提的是:现代OOP语言(比如:Java)同时支持两种继承,普通继承和泛型继承。普通继承就不说了,泛型继承其实相当于Haskell类型类和ML函子,所以在代码复用这一点上OOP和FP大致打平,不过现代OOP语言还支持trait。
最后说一下多态,现代OOP语言(比如:Java)同样支持参数化多态和子类型多态。
以上从三个角度比较,我们会发现OOP其实并不弱于FP。
发现现在很多人无脑黑OOP,所以想为它说几句。
你们怎么看?想听听大家的看法。