随着程序语言的发展,软件开发人员所熟知和使用的工具也在不断进化。以Java和C++为代表的面向对象编程的编程方式在20世纪企业级的软件开发中大放异彩,然而随着软件行业的不断发展,开发者们发现了面向对象范式的诸多不足。面向对象强调的是将与某数据类型相关的一系列操作都封装到该数据类型中去,因此,在数据类型中难免存在大量状态,以及相关的行为。虽然这很符合人类的逻辑直觉,但是当类型关系变得错综复杂时,类型中状态的改变和类型之间彼此的继承和依赖将使程序的复杂度呈几何级数上升。
避免使用程序状态和可变对象,是降低程序复杂度的有效方式之一,而这也正是函数式编程的精髓。函数式编程强调执行的结果,而非执行的过程。我们先构建一系列简单却具有一定功能的小函数,然后再将这些函数进行组装以实现完整的逻辑和复杂的运算,这是函数式编程的基本思想。
正如上面引言所述,Swift是一门有着合适的语言特性来适配函数式编程方法的优秀语言。这个世界上最纯粹的函数式编程语言非Haskell莫属,但是由于我国程序开发的起步和走热相对西方世界要晚一些,使用Haskell的开发者可谓寥寥无几,因此Haskell在国内的影响力也十分有限。对国内的不少开发者,特别是iOS/OSⅩ的开发者来说,Swift可能是我们第一次真正有机会去接触和使用的一门函数式特性语言。相比于很多已有的函数式编程语言,Swift在语法上更加优雅灵活,语言本身也遵循了函数式的设计模式。作为函数式编程的入门语言,可以说Swift是非常理想的选择。而本书正是一本引领你进入Swift函数式编程世界的优秀读物,让更多的中国开发者有机会接触并了解Swift语言函数式的一面,正是我们翻译本书的目的所在。
本书大致上可以分为两个部分。首先,在第1章至第9章中,我们会介绍Swift函数式编程特性的一些基本概念,包括高阶函数的使用方法、不可变量的必要性、可选值的存在价值、枚举在函数式编程中的意义,以及纯函数式数据结构的优势等内容。这些都是函数式编程中的基本概念,也构成了Swift函数式特性甚至是这门语言的基础。当然,在这些概念讲解中我们也穿插了不少研究案例,以帮助读者真正理解这些基本概念,并对在何时使用它们以及使用它们为程序设计带来的改善形成直观印象。第二部分从第10章开始,相比于前面的章节,这部分属于本书的进阶内容。我们将从构建最基本的生成器和序列开始,利用解析器组合算子构建一个解析器库,并最终实现一个相对复杂的公式解析器和函数式的表格应用。这部分内容环环相扣,因为内容抽象度较高,所以理解起来也可能比较困难。如果你在阅读第12章时遇到麻烦,则强烈建议你下载对应的完整源码进行研究,并且折回头去再次阅读第二部分的相关章节。随着你对各个函数式算子的深入理解,函数式编程的概念和思想将自然而然进入你的血液,这将丰富你的知识体系,并会对之后的开发工作大有裨益。本书原版的三位作者都是富有经验的函数式编程方法的使用者或教师,他们将自己对于函数式编程的理解和Swift中的相关特性进行了对应和总结,并将这些联系揭示了出来。而中文版的三位译者花费了大量时间和精力,试图将这些规律以更易于理解的组织方式和语言,带给国内的开发者们。不过不论是原作者还是译者,其实和各位读者一样,都只不过是普通开发者中的一员,所以本书出现谬漏可能在所难免。如果您在阅读时发现了问题,可以给我们发邮件,或是在本书issue页面提出,我们将及时研究并加以改进。
事不宜迟,现在就让我们开始在函数式的世界中遨游一番吧!
陈聿菡
杜欣
王巍