零、前言

在计算机编程中,范例比比皆是。 一些例子包括命式编程、结构化(goto-less)编程、面向对象编程(面向对象)、面向方面编程和声明式编程。 最近,人们对一种特定的范式重新产生了兴趣,这种范式可以说比大多数(如果不是全部)被引用的范式还要古老——函数式编程(FP)。 FP 强调编写函数,并以简单的方式将它们连接起来,以生成更易于理解和更容易测试的代码。 因此,考虑到当今 web 应用日益复杂的情况,开发一种更安全、更干净的编程方式是合乎逻辑的。

这种对 FP 的兴趣是伴随着 JavaScript 的发展而来的。 尽管它的创建有些仓促(据说在 1995 年由网景的 Brendan Eich 在 10 天内就完成了),但今天它是一种标准化的、快速发展的语言,其功能比大多数类似的流行语言更先进。 这种语言的无处不在,现在可以在浏览器、服务器、移动电话等等中找到,也促使人们对更好的开发策略产生了兴趣。 此外,即使 JavaScript 本身没有被设想成函数式语言,但事实上它提供了以这种方式工作所需的所有特性,这是另一个优点。

它还必须说,《外交政策》还没有普遍应用于工业,可能是因为它有一定的困难的光环,它被认为是理论,而不是实用,甚至数学,并可能使用词汇和概念外国开发者例子,子吗? 单体? 折叠? 范畴理论? 虽然学习所有这些理论肯定会有帮助,但也可以认为,即使不了解前面的术语,您也可以理解 FP 的原则,并看看如何在自己的编程中应用它。

外交政策不是你必须独自完成的事情,不需要任何帮助。 有许多库和框架或多或少地结合了 FP 的概念。 从 jQuery(它确实包含一些 FP 概念)开始,通过下划线和它的近亲 Lodash,或其他库,如 Ramda,然后进入更完整的 web 开发工具,如 React 和 Redux, Angular,或 Elm(100%函数式语言,可编译成 JavaScript), 用于编写代码的功能辅助工具列表正在不断增长。

学习如何使用 FP 是一项有价值的投资,即使您可能不会使用它的所有方法和技术,只要开始应用其中的一些方法就会得到更好的代码。 您不需要尝试从一开始就应用所有的 FP,也不需要尝试放弃该语言中的所有非功能特性。 JavaScript 确实有一些不好的特性,但它也有一些非常好的和强大的特性。 这个想法并不是要抛弃你所学到的一切,并采用 100%的函数式方法; 相反,指导思想是进化,而不是革命。 从这个意义上说,我们要做的不是 FP,而是sort Functional Programming(SFP),目的是实现范式的融合。

关于本书代码风格的最后一点评论——确实有几个非常好的库为您提供了 FP 工具:Underscore、Lodash、Ramda 等等。 然而,我宁愿避免使用它们,因为我想展示事情是如何真正工作的。 从某个包或其他包中应用一个给定的函数很容易,但通过将所有内容都编码出来(如果你愿意,可以使用香草 FP),我相信你会更深入地理解事情。 此外,正如我将在某些地方评论的那样,由于箭头函数和其他特性的强大和清晰,纯 JavaScript版本可以更简单地理解!

这本书是给谁的

本书面向的是对 JavaScript 有良好工作知识的程序员,他们工作在客户端(浏览器)或服务器端(Node.js),他们有兴趣应用技术来编写更好的、可测试的、可理解的和可维护的代码。 一些计算机科学(包括,例如,数据结构)的背景和良好的编程实践也会很有用。

这本书的内容

在这本书中,我们将以实际的方式讨论 FP; 不过,我们有时也会提到一些理论观点:

第 1 章Becoming Functional - Several Questions,讨论了 FP,给出了使用它的原因,并列出了你将需要利用这本书的其余部分的工具。

第 2 章将提供第一个关于 FP 的例子,通过考虑一个常见的网络相关问题和几个解决方案,最后以一个功能解决方案为中心。

第 3 章从函数开始——一个核心概念,将介绍 FP 的核心概念,即函数,以及 JavaScript 中可用的不同选项。

第 4 章行为恰当-纯函数,将考虑纯函数和纯函数的概念,并演示它如何使编码更简单和更容易测试。

第 5 章declarative Programming - A Better Style将使用简单的数据结构来展示如何生成不是命令式的,而是声明式的结果。

第 6 章生成函数——高阶函数将处理高阶函数,它接收其他函数作为参数,生成新的函数作为结果。

第 7 章转换函数——curry 和局部应用将探索一些方法,从以前的函数中生成新的和专门的函数。

第 8 章连接函数—流水线和组合将展示如何通过连接之前定义的函数来构建新的函数的关键概念。

第 9 章将介绍 FP 中的一个关键概念——递归,如何应用于算法和函数的设计。

第 10 章确保纯度-不变性将提供一些工具,通过提供不可变的对象和数据结构,可以帮助您以纯粹的方式工作。

第 11 章,实现设计模式-功能方式,将展示几种流行的 OOP 设计模式是如何在 FP 方式编程时实现的(或不需要的!)

第 12 章Building Better Containers - Functional Data Types将探索一些更高级的功能模式,引入类型、容器、函子、单元和其他一些更高级的 FP 概念。

我尽量使本书中的示例简单而贴近实际,因为我想把重点放在功能方面,而不是这个或那个问题的复杂之处。 一些编程文本是为了学习,比如说,一个给定的框架,然后处理一个给定的问题,展示如何使用所选的工具完全解决它。 (事实上,在为这本书做计划的一开始,我就有开发一个应用的想法,它将使用我脑海中所有 FP 的东西,但没有办法把所有这些都放在一个项目中。 说得有点夸张,我觉得自己就像一个医学博士在找一个病人,把他所有的医学知识和治疗方法都用在他身上!) 因此,我选择展示大量的个人技巧,这些技巧可以在多种情况下使用。 与建造房子不同,我想向你展示如何把砖块拼在一起,如何把东西连接起来,等等,这样你就可以根据自己的需要应用任何东西。

才能充分利用这本书

要理解本书中的概念和代码,您只需要一个 JavaScript 环境和一个文本编辑器。 老实说,我甚至开发了一些完全在线工作的例子,使用工具如 JSFiddle(在https://jsfiddle.net/)等,绝对没有其他。

在这本书中,我们将使用 ES2019, Node 13,代码将运行在任何操作系统,如 Linux, Mac OSX,或 Windows; 请检查技术要求部分,了解我们还将使用的其他工具。

最后,您将需要一些使用最新版本 JavaScript 的经验,因为它包含几个特性,可以帮助您编写更简洁和紧凑的代码。 我们将经常包括在线文档的指针,如文档可以在 Mozilla 开发网络(MDM)https://developer.mozilla.org/,来帮助你获得更深入的知识。

下载示例代码文件

你可以从你的账户www.packt.com下载这本书的示例代码文件。 如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册,直接通过电子邮件将文件发送给您。

您可以按照以下步骤下载代码文件:

  1. 登录或注册:www.packt.com
  2. 选择 Support 选项卡。
  3. 单击代码下载。
  4. 在搜索框中输入图书名称,并按照屏幕上的说明操作。

文件下载后,请确保使用最新版本的:

  • 解压缩的软件/ 7 - zip 窗口
  • Zipeg / iZip UnRarX Mac
  • 7 - zip / PeaZip Linux

本书的代码包也托管在 GitHub 上的https://github.com/PacktPublishing/Mastering-JavaScript-Functional-Programming-2nd-Edition-。 如果有对代码的更新,它将在现有的 GitHub 存储库中更新。

我们也有其他代码包从我们丰富的图书和视频目录,可在https://github.com/PacktPublishing/。 检查出来!

约定使用

本书中有许多文本约定。

CodeInText:文本码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 url、用户输入、Twitter 句柄。 下面是一个例子:“Let's review ouronce()function.”

代码块的设置如下:

function newCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  };
}

const nc = newCounter();
console.log(nc()); // *1*
console.log(nc()); // *2*
console.log(nc()); // *3*

当我们希望您注意代码块的特定部分时,相关的行或项以粗体显示:

function fact(n) {
  if (n === 0) {
    return 1;

  } else {
    return n * fact(n - 1);
  }
}

console.log(fact(5)); // *120*

加粗:表示新术语、重要单词或屏幕上看到的单词。 例如,菜单或对话框中的单词会像这样出现在文本中。 下面是一个示例:“选择 EXPERIMENTAL 选项以完全启用 ES10 支持。”

Warnings or important notes appear like this. Tips and tricks appear like this.

取得联系

我们欢迎读者的反馈。

:如果你对这本书的任何方面有疑问,在你的信息的主题中提到书名,并在customercare@packtpub.com给我们发邮件。

勘误表:虽然我们已经采取了每一个小心,以确保我们的内容的准确性,错误确实发生了。 如果您在本书中发现了错误,请向我们报告,我们将不胜感激。 请访问www.packtpub.com/support/errata,选择您的书,点击勘误表提交表格链接,并输入详细信息。

:如果您在互联网上发现任何形式的我们的作品的非法拷贝,请您提供我们的地址或网址,我们将不胜感激。 请通过copyright@packt.com与我们联系,并提供材料链接。

:如果你有兴趣成为一名作家,如果你对某一话题有专长,或者你有兴趣写一本书,请访问authors.packtpub.com

评论

请留下评论。 一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢? 潜在的读者可以看到并使用您的公正的意见来做出购买决定,我们在 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们的书的反馈。 谢谢你!

如需了解更多信息,请访问packt.com

技术要求

为了开发和测试本书中的代码,我使用了几个常用软件的版本,包括浏览器和 Node.js,以及一些其他包。

对于第二版,我的主机运行的是 OpenSUSE Linux 的Tumbleweed滚动发行版,从https://www.opensuse.org/#Tumbleweed开始,目前包含 5.3.5 内核。 (滚动意味着软件会持续更新,以不断获得所有软件包的最新版本。) 我还在不同的 Windows 7 和 Windows 10 电脑上测试了本书的部分代码。

至于浏览器,我通常使用 Chrome,从https://www.google.com/chrome/browser/到现在的 78 版本。 我也用火狐浏览器,从https://www.mozilla.org/en-US/firefox/开始,我的电脑里有 72 版。 我也使用在线 JSFiddle 环境运行代码,在https://jsfiddle.net/

在服务器端,我使用 Node.js,来自https://nodejs.org/,目前版本为 13.6。

对于转译,我使用了 Babel,从https://babeljs.io/:当前版本的babel-cli包是 7.7.7。

为了测试,我使用了 Jasmine,来自https://jasmine.github.io/,我的机器的最新版本是 3.5.0。

最后,对于代码格式,我使用了来自https://prettier.io/的 Prettier。 你可以在本地安装,也可以在https://prettier.io/playground/上在线运行; 我的版本是 1.19.1。

JavaScript 世界是非常动态的,可以肯定的是,当你读到这本书的时候,上面列出的所有软件都已经更新过好几次了。 当我写这本书的第一版时,我使用的每一个软件都在一段时间内收到了几次更新。 然而,考虑到 JavaScript 的标准化和向后兼容性的高度重要性,您应该不会遇到其他版本的问题。