xxleyi / learning_list

聚集自己的学习笔记
10 stars 3 forks source link

我对函数式编程的最新观感-2019-12-22 | Sunday | No.356 | Week.50 #194

Open xxleyi opened 4 years ago

xxleyi commented 4 years ago

目前为止,我对函数式编程算是有了一个较为全面的肤浅认知:从不可变状态到闭包再到高阶函数最后到代数结构和代数数据类型。

那我最新的观感也出来了,一共有两句话。

第一句话:函数式编程本身是一种最基础、最核心也最易懂的编程范式。

🤔️🤔️基础?核心?易懂?拜托,有没有搞错?负责任的说一句:没有搞错。那些基础、核心、易懂的概念早已成为整个编程世界的基础和核心,只不过当大部分程序员直接接触和学习可变状态的面向过程或面向对象式编程后,其心智已经复杂化,极度依赖复杂的「技术性」手段,如继承、设计模式等,反倒不再能够轻易理解和接受不可变状态、闭包和高阶函数这类基础概念和技术。想想也是挺有意思的一件事。

要知道,如今世界,编程语言的两个王者依旧是 Java 和 C++,而这两个世界中的程序员大都如何认知闭包呢?不就是带有状态的对象吗?直接用类不就行了?为什么要用性能那么差,用起来还那么别扭的闭包呢?

真的是这个样子吗?殊不知,这种拿类鄙视闭包的做法,恰好是颠倒了历史事实:闭包的确是带有状态的对象,而这恰恰是面向对象核心基础,有了闭包,再加上可变状态,才有了对象,才有后面的面向对象。而那些 class 之类的不过是一种便于使用的「语法抽象」而已。

闭包 + 可变状态 => 对象式编程 对象式编程 + 继承 => 面向对象 继承是一种革命性「技术」,想要解决的是代码复用的问题,而不是类似「闭包」和「可变状态」这样的革命性概念。而解决代码复用不止「继承」这一种技术,且实践证明,「继承」并不是最佳的。

继承的威力很大,但局限性和破坏力也是巨大的,使用继承应该谨慎再谨慎。

基于对象进行编程,解决代码复用有很多技术可用,像继承、委托和转发,这种解决自上而下的复用,还有多态这种自下而上的复用。

函数式编程真的是基础、核心,面向对象其实比函数式更难,更复杂,只不过整个编程工业对其有着巨大的支撑,使得大部分程序员只需要复制粘贴,写写胶水代码,不停挖坑、填坑即可。

想要变得优秀,函数式编程必学,且要放下独尊「面向对象」的傲慢和轻浮。

第二句话:想要仅仅使用函数式编程,是非常困难,且基本不现实的一件事。

函数式编程本身不难,甚至是基础,且易于推理、维护,但其有一个致命弱点:缺乏编程工业支持,无法大规模使用。

这一点要认清并接受,然后在自己的面向过程或者面向对象的工业项目中,局部且灵活的使用「面向函数式」思维,简单问题简单处理,而不是一味的「面向对象」和滥用「可变状态」。

对于大部分要吃饭的程序员来说,我们就是打工的,所以依托编程工业是必然的,但是有「函数式编程」作为底子是一件非常棒的事。

嗯,就是这样。