By:
简介
如果你是一名 JavaScript 开发人员,那么你很可能会 已经看到过"函数式编程","函子","闭包"或"不变性"等概念了。你可能想知道这些东西到底是什么意思。也许你已经读过一些相关资料。或者你可能正在尝试将一些 FP (Functional Programming) 实践应用到你的代码中。
如果是这样,那么我想我们在同一条船上!
大约两年前,我开始在工作中使用JavaScript。从那时起,我一直在努力加深我对函数式编程的理解。
一开始,每当听到"柯里化(currying)"之类的东西,或者我的同事告诉我"请使用 map 而不是 forEach 并避免这些副作用"的时候,我感到很迷惑。
从那时开始到现在,我已经学到了很多。试图理解 FP 实践是一种非常激动人心的体验-- 到今天依然如此!
现在,我想把我到目前为止所学到的提炼成一系列文章--一些假如我现在从头开始学习 FP 的话自己希望能够读到的系列文章。我希望这能帮助到那些有跟我几年前类似程度和背景的人。
什么是函数式编程?
函数式编程是一种编程范式--- 一种思考和构造代码的方式。它是过程式编程或面向对象编程的替代方案。
FP 爱好者会说他们的目标是优化代码的可重用性,可读性和可测试性。他们工具箱中的常用工具是: 函数(functions),把函数 组合(compose) 起来构建更复杂的功能,以及 避免共享状态(avoiding shared state) 和 副作用(side effects)。
如果这些话听起来不知所云 -- 别担心,我们很快就会搞清楚的!
为什么要学习函数式编程?
互联网上有讨论为什么函数式编程比面向对象编程更好。如何用它生成更易读,更易于扩展,更易于测试和维护的代码; 什么是声明式(declarative)编程,等等。
我同意其中大部分内容。我不想再重复相同的论点,所以我希望你看一下上面的一些链接。
不过,我接下来要讲的是另外一些东西。我会告诉你为什么要考虑学习函数式编程。我会分享一下我的收获,那也可能将是你的收获。
1. 它正在成为主流
如果你看一下不断变化的 JS 生态,很明显可以看出来函数式编程实践已经日益普及。大量非常酷的新框架和库都受到了 FP 的重大影响, 例如:
- -- 可重用的组件和纯函数
- -- 强迫你不要使用可变状态
- -- 函数式方法和不变性
- -- 可以编译成 JavaScript 的函数式语言
- , 和 -- 这几个库都内置了 FP
你可能已经或者将要使用这些工具之一。如果你很好地理解了函数式编程的概念,那么你可以更快地掌握这些框架和库。否则你可能要多花一些时间。
2. 这很有挑战性
离开大学之后,你的大脑是不是再也没有像在学校时那样全速运转过了?
我肯定有过。我的意思是,我的工作充满了挑战。我花了很多时间思考:业务问题,系统架构,团队状态以及许多其他东西。
这并不是说跟上微积分课一样。学那个的时候我需要绞尽脑汁来理解所有的概念,以及它们之间如何相互关联。
嗯,学习函数式编程的感觉其实有点儿类似。这也不奇怪,毕竟函数式编程就是来源于数学。
学习过程中会有很多新的术语,理解这些知识可能会让你头晕眼花。但是在醍醐灌顶的时刻,你会体会到极大的满足。
我相信如果你在大学里喜欢数学,那你肯定也会喜欢学习这些东西的。
哦……这个说法可能不会让你爱上函数式编程的,对吧?
3. 这是一个新鲜的东西
我相信,即使你不打算在日常工作中切换到函数式编程,学习新的编程范式也是大有好处的。不仅仅是因为这是一个挑战 -- 更是因为它感觉 很不一样。
尝试新的编码风格可以让你接触到另一种截然不同的做事方法。也会迫使你从不同的角度思考问题。
你可能会认为多花一些时间在已经熟练掌握的工具上面更划算。我知道那样收效更快,更务实,可以让你的在那些你熟悉的技术上钻得更深。
但我相信,作为软件开发者,我们也需要拓宽我们的视野。它有助于我们更好地与其他开发人员沟通,特别是当他们跟我们背景不同的时候。从不同的角度来看问题,可以帮助我们做出更好的决策。
学习新的编程语言是拓宽专业知识的好方法。但是学习新的编程范式更好。
好的,但……为什么是 JavaScript?
如果你已经决定要学习FP,那么下一个问题就是:使用 JavaScript 是一个很好的方式吗?
首先我得说 JavaScript 可能不是学习函数式编程概念的最佳途径。原因大概有以下这些。
其他更加函数式的语言,内置了不可变数据结构. 而 JavaScript 没有,因此你需要额外使用一个库。这样以来,你的代码会比较冗长。
,例如它的 class
,new
,以及其他一些类似的东西。
JavaScript标准库很糟糕。它当然不是考虑到为 FP 概念而设计的。
关于 JS 是不是函数式编程的最佳选择,还有很多争论。
但是另一方面,JavaScript 也有很多特性有助于实现函数式编程:
- 函数在 JS 里是一等公民 (First-class functions)
- 闭包 (Closures)
- 对象和数组字面量 (Object and Array Literals) (译注:)
- 大量的 FP 库
此外,我认为最重要的一点是:JavaScript 非常流行,并且会越来越流行。
如果你打算使用 JavaScript,为什么不尝试学习一种非常有用的新范式呢?
让我们开始吧!
在本系列的下一部分中,我将介绍一些 FP 概念 - 从最基本的概念开始。我打算涵盖以下几个方面:
- 纯函数(pure function),一等公民的函数 (first-class functions),高阶函数 (Higher-order functions)
- 共享状态(shared state),不变性(Immutability),副作用(Side effects),引用透明(Referential transparency)
- 闭包(Closures)
- 局部调用(Partial application),柯里化(Currying)
- 递归(Recursion)
- 组合(Composition),Point-free 风格
- FP 库
- 涵子(Functors),Applicative Functors,Monads
我会假定你已经了解了 JavaScript 的基础知识,ES6 等等。对于理解FP概念来说,这并不是一个强制要求。但是,它可以让你更轻松地完成示例并自己做一些尝试。
准备好了吗,下一章是:“”。