面向对象好好的,为什么函数式编程就火了?

我的理解是面向对象对数据处理的抽象不太好?才引入了函数式编程。。

阅读 4.6k
3 个回答

面向对象抽象是最好的,缺点是太复杂,有时候为了实现一点小功能就要写很多代码,就像原先最古老版本的java要调用一个回调函数得先定义一个类去实现回调的接口方法,后来java觉得太麻烦又搞了个匿名类,结果四不像既不方便又难以理解,后来java8引入lambda之后,才能优雅的实现回调。

所以函数式编程其实抽象不好,但很方便,很少的代码就能实现面向对象的繁杂的定义。

另外函数式编程起源于很久以前的人工智能研究,但真正火起来应该是在反应式编程流行之后,异步流式处理需要大量回调,如果用当时主流的面向对象去处理简直就是噩梦,然后大家才想起函数式编程。

函数式编程不是面向对象的对立面,二者不是一个层面上的东西。

函数式编程(如 Lisp、Haskell)是与命令/指令式编程(如 Basic、Fortran、C、C++、C#、Java、Perl、Python、Ruby、Smalltalk)和声明式编程(如 CSS、HTML、SQL)相对应的。

面向对象编程是和面向过程编程相对应。

比如 C / Fortran,它俩是面向过程的,但却和面向对象的 C++ 同属于命令式编程的范畴内。

但其实这种界限已经被慢慢打破了,很多命令式编程的语言也在慢慢加入函数式的特性,比如 C# 中的 Linq、Java 中的 Stream、Python 中的 Functools。基本可以说只要支持 Lambda 的语言就都有函数式的特性,只不过是以面向对象的方式引入的,如静态类或抽象类。

所以上面三种并不和下面两种有啥关系,分类方式不同而已。


P.S. Lisp 1960 年就有了,而第一个和第二个所谓面向对象语言,即 Simula 67 和 Smalltalk,都分别是 1967 年和 1971 年的事儿了。所以你说的函数式编程是后引入的,是不对的。

函数式编程一直在学术界都很火。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进