在JS中实践函数式编程【1】 -- 前言

614 阅读8分钟

写在文章前

最近在了解函数式编程,菜狗如我,不总结就忘了自己学过啥。所以有了这个新坑。文中都是在看过文章以及书籍之后,增加了自己理解用通俗一点的方式讲出来。这篇文章是一篇不正经的劝学前言,如果喜欢这个文章劳烦各位点个赞。如果文章中有什么不恰当的地方,还请大佬在评论下方指出。感谢各位看官姥爷的阅读,祝大家有个快乐的周末~

JS中实践函数式编程 -- 前言

作为开发人员,或多或少都会听到过函数式编程这个概念。 很多人都对这个概念似懂非懂,或许也读过一些文章,也了解过一些概念。 我们都很想知道,这个函数式编程到底在有什么样的应用,他到底为啥用过的人都真香了。

作为一个前端搬砖工,日常最熟悉的语言就是javascript。但其实平心而论,js 绝对不是函数式编程的最佳实践语言。

因为当初领导的我不要你觉得我要我觉得,js在竭尽所能的模仿JAVA。不仅创造者在模仿,使用者也在模仿。曾经,js没有类,用function创造类也要上。如今ES6官宣个(假)类,使得OO的味道更浓了。

但,其实从某些方面来讲,js也不是不能实践函数式编程。前端小伙伴都知道,js中没有那些极其复杂的内置的数据结构。这使得FP的应用变得简单了些。

最最主要的原因,我就js用的6,你让我写别的语言,我也写不好啊。:)

那,如果你刚好对函数式编程有兴趣,也刚好除了听说用reduce不用foreach之外不知道其他实践的话,我们就一起来了解了解怎么用js实践函数式编程吧😉

函数式编程

函数式编程是一种编程思想,他的作用是让你的代码能够结构化。按照归类法,同类别的还有其他耳熟能详的编程思想,比如说面向对象编程,面向过程编程。

函数式编程英文是Functional programming , 业界简称FP。FP粉丝们说,FP好优秀,可读性高,可测试性高。当然,OO粉(OBJECT-ORIENTED)们也是这么说OO的. 如果说OO 的R技能是实例的话,FP的R技能就是函数了。通过组合函数就可以实现复杂的功能,同时还能避免共享状态和副作用。

给个学习的理由啊

两个爱豆如果定位类似,一定会有粉丝出来写我家爱豆比他家哪里哪里好。FP和OO的PK 也不例外,通稿满天飞。比如怎么更容易继承,比如测试方便,怎么好维护blablabla...

但我想给出几个我学习的理由,可能不是那么正经,也不是那么政治正确,但的确是我学习的缘由。

火啊

娱乐圈里面,粉丝们看自家爱豆都是自带滤镜的,经常能听到我家爱豆演技好,比上次进步了很多balabala。。。但吃瓜群众心里都明白的很,你说你家爱豆演技好,演的电视剧豆瓣评分平均2分,谁信啊。。 所以还是要用数据说话的。

在目前主流的框架或者库中,我们都能看到FP的影子.比如前端的主流框架中,REACT 和 Vue 都使用了可复用的组件和纯函数来实现他们的内部功能(当然, 框架中也使用了大量的面向对象思想,这不可否认)。再比如 那些年我们都用过的库 Underscore或者lodash等等。都有函数式编程的应用。

由此可见,你日常用的那些库那些框架都用了函数式编程的思想,那 你又有什么理由不试一试呢?

难啊

面向过程的思想,之所以用的人多,是因为他和我们日常思维的方式类似,说白了,就是闭着眼睛也能写出来的。 大家调侃业务逻辑是if else的堆砌, 也是因为他和我们的思维方式类似,不用认认真真思考,也不烧脑。

但是面向对象和函数式编程,大家会觉得应用起来略难,是因为他需要你仔细的思考,仔细的抽象,他和人类自然思考的方式不一样。过程虽然痛苦,虽然艰难,虽然你的大脑宕机了n次,但是这会使你的代码可读性高,可复用行高,可延伸性高,妈妈再也不担心产品加需求加功能了,仔细想一想还是美滋滋的呢,对吧。

新啊

维基百科中说, OO是在上个世纪70年代左右提出来的。这是什么概念,就是他是妈妈辈的思想。岁月沉淀了OO, 大牛们慢慢总结出了一些极佳的OO实践,以至于后人无需再探路即可用这个思想。

FP虽然他的数学相关历史渊源比OO要早的多得多,但是正式的书面标准却是在90年代左右才提出的,可以说FP是我们这一辈的。

学习FP,能让你也成为探路者之一,一不留神,也许你也是其他人心中的大牛了。自己开拓的路走起来的成就感比走柏油马路要高的多得多。

从个人角度来讲,学习新鲜事物的一个好处就是能让你更全面的看待你了解的事物。如果说阅读源码是在深度上进行知识的扩充,那么学习新语言新思想就是在广度上拓展认知。

两代爱豆的PK

函数式编程为啥大家都说难,比OO难?甲之蜜糖,乙之砒霜,OO和FP究竟有哪些差异?为啥大家现在都在学习FP? OO难道要退役了?鲁迅说,不做对比的通稿都是在耍流氓,看个哈利波特都在站队呢,现在我们也总结一下OO 和 FP。

实现方式

在OOP 语言中,对象Object是基本的实现方式。他是类Class的实例。 这和我们的现实生活很相似。大家都是东西,东西和东西之间存在着关系。类就是对东西的抽象,人是人类的一个实例,我家狗是犬类的一个实例。

黑格尔说“纯粹”的思想就是指摆脱了任何感性具体性和拘泥于外在对象的性质的思想。函数式编程就是这样的一种思想。逻辑与数据完全分离, 对象一旦创造出来就不可变,尽量的避免共享状态,以及纯函数的提倡,这些规范都是以纯粹为核心的。(如果说纯粹的定义是如此的话,人类就不是纯粹的,毕竟人是会变心的。)

思想

举个例子【1】,假设你是某部门主管,恰逢年终,是时候给各位小弟涨一波工资。如果用程序实现的话,要怎么实现?

如果使用OOP思想,你的程序会这么写:

  1. 有个员工类,内置name和工资属性,有个改变工资的方法来更改工资。
  2. 实例化你的员工们。
  3. 运行每个员工的改工资函数,完成加工资。

那如果使用FP思想有什么区别?

  1. 创造个员工群数组,每个员工是这个数组中的一员,他们都有名字和薪资这两个属性。
  2. 创建一个更改薪水的函数返回值是每个员工的更改后薪水的副本。
  3. 创建一个遍历员工数组的函数,使用上面更改某个员工薪水的函数进行更改薪水。
  4. 运行上面的这个函数,返回一个新的叫做快乐的小弟们的数组。

我们可以看到,这两种思维方式的不同。OOP中,更改的是原本的数据。但是FP中都是每次返回新的副本体现出不可更改性。

总结

我们从思想和实现方式上概述了一下OO和FP的区别,在后面更新的文章中,会详细的说明函数式编程以及在js的应用。当然,不存在不霸道的黄教主,也不存在某个单一思想就走天下的情况,OO 和 FP 都很有趣,选择合适的才是最好的。

另外,公司在招聘,有需要内推的小伙伴可以私戳我~

【1】www.codenewbie.org/blogs/objec…