文章目录
1.2. 为何使用函数式编程?Why use FP?
多年来,众多编程风格与潮流层出不穷。然而,函数式编程强大的适应性已经得到公认,并且在今天引起了广泛关注。我们为什么要使用函数式编程?或者拆开来问,先问问看:您想要的是什么?然后才应该是:函数式编程能满足这样的要求吗?后续章节将回答这些重要的问题。
1.2.1. 我们要的是什么 What we need
下列观点毫无疑问都是业内普遍认可的。良好的代码应该具备以下几个特征——
- 模块化设计(Modular):程序功能应该被设计成相互独立的模块,各个模块负责实现某个特定的功能点。一个模块或功能的变动不应该影响到其余模块代码;
- 易于理解(Understandable):写出的代码要让读到它的人毫不费力地辨别出组件(components)、功能(functions)及其相互关系(relationships)。这与代码本身的 可维护性(maintainability) 密切相关。无论是略作修改还是添加新功能,写好的代码今后都需要进行维护;
- 方便测试(Testable):单元测试(Unit tests) 旨在验证程序的一小部分功能,可以独立于其余代码对一些行为进行验证。所采用的编程风格,也应当有助于简化单元测试的编写。同时,单元测试也应该像文档那样设计,以便读到它的人明白代码的预期功能;
- 扩展自如(Extensible):其实只要是程序,就总归有需要维护的那一天,比如添加新功能。这些改动应该对原来的数据结构和数据流产生尽可能小的影响(如果有的话)。小打小闹不应该引发代码库的大规模重构;
- 复用性强(Reusable):代码复用为的是节省资源、时间与财力,能够通过复用之前写过的代码来减少重复劳动。一些特性有助于实现这一目标,例如 模块化(modularity)(上面已经提到了)、高内聚(high cohesion)(确保模块中的所有部分都属于该模块)、低耦合(low coupling)(模块间相互独立)、关注点分离(separation of concerns)(程序在功能层面要尽可能少的出现重叠)以及 信息隐藏(information hiding)(模块内部的更改不应影响系统的其余部分)
1.2.2 我们能学到什么 What we get
那么,函数式编程能否满足上面提到的五个要求呢?
- 函数式编程的目标,是分别编写相互独立的函数,再将这些函数联系到一起得出最终结果;
- 采用函数式风格编写的程序通常更简洁有力、更易于理解;
- 函数本身就是可测试的,函数式编程产出的代码在这方面具有天然优势;
- 由于相互独立,在不依赖系统其他部分的情况下,其他程序中的函数可被直接重用。大多数函数式程序共享通用函数,本书将从中挑选一些进行论述。
- 函数式的代码没有副作用(
side effects
),这意味着研究一个函数要实现的最终目的时无需考虑程序的其他部分。
最后,一旦习惯了函数式的编程风格,代码将变得更易于理解与扩展。如此看来,函数式编程完全具备上面提到的五个特征。
【小知识】为什么要使用函数式编程
为了全面了解使用函数式编程的原因,推荐阅读 约翰·休斯(John Hughes) 发表的文章 《为什么函数式编程很重要》(Why Functional Programming Matters);详见在线资源:www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf 1。这篇文章虽然不是基于
JavaScript
来进行介绍的,但相关参数很容易理解。
1.2.3 函数式编程并非完美无瑕 Not all is gold
不过还是要尽量一碗水端平,函数式编程并不是什么灵丹妙药,可以自动将代码变得更好。有些函数式的解决方案本来就很复杂,而某些开发人员偏偏又只热衷于写出代码,等到写完了估计才会冒一句:这一段是干啥的?稍不留神,代码就可能“仅仅只是写出来了”,根本无法维护;那些易于理解、便于扩展并且可重用的代码就这样被拒之门外了。
函数式编程的另一个不足在于,精通此道的开发人员寥寥无几(快问快答:您见过几个招聘广告只招熟悉函数式编程的程序员?)。当前绝大多数的网页代码都是命令式的、非函数式的,而且绝大多数程序员也都习惯了这种工作方式。对于某些人来说,强制换用新轮子、以另一种风格来编程可能是一个难以逾越的障碍。
最后,如果想在 JavaScript
中完全运用函数式编程思想,可能会举步维艰,原来简单的任务很可能会变得难以完成。正如前面提到过的,我们应该拥抱的是类函数式(SFP
)的方式,因此不会完全摒弃纯函数式编程以外的语言特性。毕竟,我们只想用函数式编程来简化代码,而不是把简单的事情复杂化!
因此,尽管笔者会努力演示函数式编程在代码实现过程中的诸多优势,但与任何变革一样,总会遇到一些困难。但我完全相信读者能够克服它们;也坚信您的组织在实践函数式编程后会开发出更好的代码。勇于改变吧!既然您已经承认函数式编程适用于您当下的应用场景,接下来要考虑另一个问题便是:将函数式编程风格引入 JavaScript
的日常使用,真的合适吗?
译注:本资源已上传到我的网盘,感兴趣的朋友也可以在这里下载:
https://pan.baidu.com/s/1zeihbUmfKIZYXt4kfvtDtA
,提取码:zgdt
。 ↩︎