面向对象与函数式编程

JerryXia 发表于 , 阅读 (17)

面向对象编程和函数式编程有什么不同,或者你更倾向于哪一种。

type-1

何为面向对象

面向对象编程 以下统称 OOP

主要代表的语言有:C++、Java、C#、VB、.Net 等

基本特征是:封装、继承、多态。

何为函数式

函数式编程 以下统称 FP

主要代表的语言有:OCaml,Haskell、Scala 等

基本特征是:不可变数据、first class functions、尾递归优化。

我的看法

其实 FP 和 OOP 并不互相排斥,这两种编程范式一个抽象过程一个抽象数据,正好是相辅相成的。前者擅长描述是什么后者擅长描述如何做。FP 抽象出 Functor,OOP 聚合数据,很完美。JS也不是纯 FP,所以现代框架和库继承和运用 FP 思想来改进设计而已。FP也谈不上高大上,当你用forEach和map这样的API的时候你就在用 FP 了

因为 OOP 有时间维,所以出某些bug的时候需要从程序运行过程去找原因,查看一些变量的变化历史,逐步排查。而 FP 没有时间维,所以只需要一个局部一个局部,一块一块地找问题,OOP 的(bug)事件会随时间而扩散,最后crash了整个世界,而 FP 天然是隔离的,一块空间坏了,问题通常只会局限在一个小区域中。纯 FP 无共享状态,程序运行时不改变外部状态,函数无副作用,相同输入永远相同输出,调用顺序时序无关。也就是说已知输入和输出任何函数就可以用它的返回值代替它本身。OOP 要操作共享状态比如对象属性,所以是有时序的,先调用a方法再调用b方法,即使输入参数完全相同,结果也可能截然不同

OOP 就像创建了一些工人,他们有自己高度复用的能力(成员方法)。FP 就是一个业务流程,比如装配手机,相辅相成才是最好的。没有必选可选之分,如果硬要说占比,那肯定是业务流程占比多

FP 提升系统里函数的纯度,setup和teardown是有帮助,但还是增加了测试的难度,另外还有一些真实场景很难用 setup和 teardown 来描述。你可以不把 FP 当成整体,它实际是一整套大理论,但是也是有层次的,你要是不接受那些高级的部分,你就接受 map,reduce, throttle,debounce就好了嘛

从“自然”这一点来说 OOP 反而更自然,抽象能力越高的模型往往越不“自然”,因为高度抽象嘛。我的理解里,OOP 是真实世界到程序世界的自然映射,FP 是真实世界经过数学抽象后才到程序世界的,是数学的映射,数学是强大的抽象工具。

面向对象编程和函数式编程是相辅相成的,为什么这么说,面向对象抽象出共同属性形成一个新的数据类型,暂且就这么说吧,而函数式编程将函数也当成对象,可当变量,当参数,当返回值,简直就是全能神,哈哈,函数式编程当然得讲闭包,闭包是什么,闭包其实就是类,类抽象的是数据类型,而闭包抽象的是函数,闭包通过不同的输入参数实现返回不同的函数对象。

所以当你要抽象数据类型,请用 OOP,当你要抽象函数,请用 FP。