原文地址:Functional-Light-JSjavascript
原文做者:Kyle Simpson - 《You-Dont-Know-JS》做者html
关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;分享,是 CSS 里最闪耀的一瞥;总结,是 JavaScript 中最严谨的逻辑。通过捶打磨练,成就了本书的中文版。本书包含了函数式编程之精髓,但愿能够帮助你们在学习函数式编程的道路上走的更顺畅。比心。前端
译者团队(排名不分前后):阿希、blueken、brucecham、cfanlife、dail、kyoko-df、l3ve、lilins、LittlePineapple、MatildaJin、冬青、pobusama、Cherry、萝卜、vavd317、vivaxy、萌萌、zhouyaojava
函数式编程人员: 没有任何一个函数式编程者会把变量命名为 x,函数命名为 f,模块代码命名为“zygohistomorphic prepromorphism”。git
James Iry @jamesiry 5/13/15程序员
函数式编程(FP),不是一个新的概念,它几乎贯穿了整个编程史。我不肯定这么说是否合理,可是很肯定的一点是:直到最近几年,函数式编程才成为整个开发界的主流观念。因此我以为函数式编程领域更像学者的领域。编程
然而一切都在变。不仅是从编程语言的角度,一些库和框架都对函数式编程的兴趣空前高涨。你极可能也在读相关内容,由于你终于意识到函数式编程是不容忽视的东西。或者你跟我同样,已经尝试不少次去学函数式编程,但却很难理解全部的术语或数学符号。segmentfault
不管你出于何目的翻阅本书,欢迎加入咱们!app
我有一个很是简单的前提,这是我做为软件开发老师(JavaScript)所作的一切基础:你不能信任的代码是你不明白的代码。此外,对你不信任或不明白的代码,你将不能肯定这些代码是否符合你的业务场景。代码运行时也只能祈求好运。
信任是什么意思?信任是指你经过读代码,不只是跑代码,就能理解这段代码能干什么事,而不仅是停留在它多是干什么的层面。也许咱们不该该总倾向于经过运行测试程序,来验证程序的正确性。我并非说测试很差,而是说咱们应该对代码了如指掌,这样咱们在运行测试代码以前就会知道它确定能跑通。
经过读代码就能对咱们的程序更有信心,我相信函数式编程技术的基础构成,是本着这种心态设计的。理解函数式编程并在程序中用心实践的人,得益于函数式编程已经被证明的原则,可以写出可读性高和可验证的代码,来达到他们想要的目的。
我但愿你能经过理解轻量级函数式编程的原则,对你编写的代码更有信心,而且能在以后的路上越走越好。
函数式编程为什么如此重要?为了回答这个问题,咱们退一万步先来讨论一下编程自己的重要性。
我认为代码不是电脑中的一堆指令,这么说你可能感到很奇怪。事实上,代码能指示电脑运行就是一个意外的惊喜。
我深信代码的主要做用是方便人与人交流。
根据以往经验你可能知道,有时候花不少时间“编程”其实只是读现有的代码。咱们的大部分时间其实都是在维护别人的代码(或本身的老代码),只有少部分时间是在敲新代码。
你知道研究过这个话题的专家给出了怎样的数据吗?咱们在维护代码过程当中 70% 的时间花在了阅读和理解代码上。 也难怪全球程序员天天的平均代码行数是 5 行。咱们一天花七个半小时用来读代码,而后找出这 5 行代码应该写在哪里。
我想咱们应该更多的关注一下代码的可读性。可能的话,不妨多花点时间在可读性上。顺便提一句,可读性并不意味着最少的代码量,对代码的熟悉程度也会影响代码的可读性(这一点也是被证明过的)。
所以,若是咱们要花费更多的时间来关注代码的可读性和可理解性,那么函数式编程为咱们提供了一种很是方便的模式。函数式编程的原则是完善的,通过了深刻的研究和审查,而且能够被验证。
若是咱们使用函数式编程原则,我相信咱们将写出更容易理解的代码。一旦咱们知道这些原则,它们将在代码中被识别和熟悉,这意味着当咱们读取一段代码时,咱们将花费更少的时间来进行定位。咱们的重点将在于如何组建全部已知的“乐高片断”,而不是这些“乐高片断”是什么意思。
函数式编程是编写可读代码的最有效工具之一(可能还有其余)。这就是为何函数式编程如此重要。
很重要的是,我先花点时间来说述一种多年来让我感到困惑和沮丧的现象,在写本书时该问题尤其尖锐。
这也多是许多开发人员会遇到的问题。亲爱的读者,当你读这篇文章的时候,你可能会发现本身也会遇到一样的情况。可是要振做起来,坚持下去,陡峭的学习曲线总会过去。
咱们将在下一章更深刻的讨论这个问题。可是你可能写过一些命令式的代码,像 if
语句和 for
循环这样的语句。这些语句旨在精确地指导计算机如何完成一件事情。声明式代码,以及咱们努力遵循函数式编程原则所写出的代码,更专一于描述最终的结果。
还有个残酷的问题摆在眼前,我在写本书时花费了不少时间在此问题上:我须要花费更多的精力和编写更多的代码来提升代码的可读性,尽可能减小乃至消除可能会引入程序错误的代码部分。
若是你指望用函数式编程重构过的代码可以马上变得更美观、优雅、智能和简洁的话,这个有点不太现实,这个变化是须要一个过程的。
函数式编程以另外一种方式来思考代码应该如何组织才能使数据流更加明显,并能让读者很快理解你的思想。这种努力是很是值得的,然而过程很艰辛,你可能须要花不少时间基于函数式编程来调整代码直到代码可读性变得好一些。
另外,个人经验是,转换为声明式的代码以前,大约须要作六次尝试。对我来讲,编写符合函数式编程的代码更像是一个过程,而不是从一个范例到另外一个范例的二进制转换。
我也会常常对写过的代码进行重构。就是说,写完一段代码,过几个小时或一天再看会有不同的感受。一般,重构以前的代码是比较混乱不堪,因此须要反复调整。
函数式编程的过程并无让我在艺术的画布上笔下生辉,让观众拍案叫好。相反,编程的过程很艰辛且历历在目,感受像坐在一辆不靠谱的马车穿过一片杂草丛生的灌木树林。
我并非试图打消你的激情,而是真切但愿你也可以在编程的道路上披荆斩棘。事后我终于看到可读性曲线向上延伸,全部付出都是值得的,我相信你也会有一样的感觉。
咱们要系统的学习函数式编程,探索发现最基本的原则,我相信规范的函数式编程编程者会遵循这些原则并把它们做为开发的框架。但在大多数状况下,咱们大都选择避开晦涩的术语或数学符号,不然很容易使学习者受挫。
我以为一项技术你怎么称呼它不重要,重要的是理解它是什么而且它是怎么工做的。这并非说共享术语不重要,它无疑能够简化经验丰富的专业人士之间的交流。但对学习者来讲,它有点分散人的注意力。
因此我但愿这本书能更多地关注基本概念而不是花哨的术语。这并非说没有术语,确定会有。但不要太沉迷于华丽的词藻,追寻其背后的含义,这正是本书的目的。
我把这种欠缺正式实践的编程思想称为“轻量级函数式编程”,由于我认为真正的函数式编程的形式主义在于, 由于我认为若是你还不习惯函数式编程主张的思想,你可能很难用它。这不只仅只是猜想,而是个人亲身经历。即便在传教函数式编程过程和完成这本书以后,我仍然能够说,函数式编程中术语和符号的形式化对于我来讲是很是很是困难的。我已经再三尝试,发现大部分都是很难掌握的。
我知道不少函数式编程编程者会认为形式主义自己有助于学习。但我认为这是一个坑,当你试图用形式主义得到某种安慰时,你就会踩坑。但若是碰巧你有数学背景,甚至还有一些 CS 经验,这些问题对你来讲就可能得心应手。可是咱们中的一些人不具有这些条件,无论咱们怎么努力,形式主义老是阻碍咱们前进。
所以,这本书介绍了一些我认为函数式编程会涉及到的概念,虽然不能直接让你受益但能够帮你逐步理解函数式编程整个过程。
若是你规划一个项目花了很长时间,那么别人必定会告诉你“YAGNI” —— “你不须要它”。这个原则主要来自极限编程,强调构建特性的高风险和成本,这个风险和成本源自于项目自己是否须要。
有时咱们考虑到未来可能会用到一个功能,而且认为如今构建它可以使得构建其余应用时更容易,后来意识到咱们猜错了,原来这个功能并不须要,或者须要的彻底是另一套。另一种情形是咱们预估的功能是正确的,但构建得太早的话,至关于占用了开发现有功能的时间。有点像赔了夫人又折兵。
YAGNI 挑战,告诉咱们:即便有的功能在某种状况下是反直觉的,咱们也经常应该推迟构建,直到当前须要这个功能。咱们倾向于夸大一个功能将来重构成本的心理估计,但每每这个重构是在未来须要时才会作。
上述状况对函数式编程也一样适用,不过我仍是要先敲个警钟: 本书包含了大量你想去尝试的有趣的开发模式,但这不意味着你的代码必定要使用这些模式。
我与不少函数式编程开发人员的不一样之处在于:你掌握了函数式编程并不意味着你必定得用它。此外,解决问题的方法不少,即便你掌握了更精炼的方法,能对维护和可扩展性更"经得起将来的考验",但更轻量的函数式编程模式可能更适合该场景。
通常来讲,我建议你在代码中寻求平衡,而且当你掌握函数式编程的诀窍时,在应用的过程当中也应保持谨慎。在决定某个模式或抽象概念是否能使得部分代码可读性提升,或是否只是引入更智能的库时,YAGNI 的原则一样适用。
提醒一句,一些不曾用过的扩展点不只浪费精力,并且可能妨碍你的工做。
Jeremy D. Miller @jeremydmiller 2/20/15
记住,你编写的每一行代码以后都要有人来维护,这我的多是你的团队成员,也多是将来的你。若是代码写的太过复杂,那么不管谁来维护都会对你炫技式的故做聪明的作法倍感压力。
最好的代码是可读性高的代码,由于它在正确的(理想主义)和必然的(正确的)之间寻求到了恰到好处的平衡。
我撰写这篇文章的过程参考了许多不一样的资源。我相信你也会从中受益,因此我想花点时间把它们列出来。
一些你务必要阅读的函数式编程 / JavaScript 书籍:
一些其余做者和相关内容供查阅:
本书中的代码段不使用库。咱们发现的每个操做,将派生出如何在独立的、普通的 JavaScript 中实现它。然而,当你开始使用函数式编程构建更多的真正代码时,你很快就会使用现有库中所提供的更可靠高效的通用功能。
顺便说一下,你要确保检查你所使用的库函数的文档,以确保你知道它们是如何工做的。它与本文中构建的代码有许多类似之处,但毫无疑问即使跟最流行的库相比仍是会存在一些差别。
下面是一些流行的 JavaScript 版本的函数式编程库,能够开启你的探索之路:
附录 C 展现了用到了本书中一些示例的库。
这就是 JavaScript 轻量级函数式编程。咱们的目标是学会与代码交流,而不是在符号或术语的大山下被压的喘不过气。但愿这本书能开启你的旅程!
【上一章】翻译连载 |《JavaScript 轻量级函数式编程》- 引言&前言
【下一章】翻译连载 |《JavaScript 轻量级函数式编程》- 第 2 章:函数基础
iKcamp原创新书《移动Web前端高效开发实战》已在亚马逊、京东、当当开售。