前言
我经常参加开发者大会。从这些会议中,我观察到函数式编程(functional programming,FP)的讨论热度似乎一年高过一年。许多会议都有一个专门讨论函数式编程的分论坛,并且其他演讲中多少也会提到这个主题。
函数式编程的重要性正在稳步上升,这背后有哪些原因呢?
原因在于,函数式编程是软件开发史上最伟大的创新之一。它不仅很酷,还充满了乐趣。
随着容器化和无服务器应用等概念的兴起,函数式编程不再只是开发者的业余爱好,也不是那种几年后就被人遗忘的短暂热潮,而是成为一个能为利益相关者带来实质性好处的重要概念。
此外,在 .NET 生态系统中,函数式编程的推广还得益于一些关键因素。例如C# 语言的首席设计师马德斯·托格森,他是函数式编程的忠实拥趸,同时也是将函数式编程引入 .NET 的主要推动者之一。另外,作为 .NET 家族中的函数式编程语言,F# 语言的影响也不容忽视。F# 与 C# 共享同一个运行时环境,所以F# 团队开发的许多函数式特性往往也会以某种形式集成到 C# 语言中。
然而,一个重要的问题仍然存在:函数式编程究竟是什么?我是不是需要学习一门全新的编程语言才能使用它?好消息是,如果你是一名 .NET 开发者,那就不需要为了紧跟潮流而花费大量业余时间来学习新技术,也不需要引入新的第三方库来增加应用程序的依赖:有了开箱即用(out-of-the-box)的 C# 代码,即可实现函数式编程,为此,我们只需要做一些小小的调整。
本书介绍函数式编程的基本概念、展现其优势并说明如何在 C# 语言中实现它们—学习这些知识不仅能满足你的个人编程爱好,而且能为你的工作带来立竿见影的好处。具体有以下几个好处:
● 代码更加清晰、整洁且易于理解;
● 代码库更容易维护;
● 减少应用程序中未处理的异常,避免它们所带来的不可预测的后果;
● 能更轻松地为代码库编写自动化单元测试。
除此之外,还有其他很多的好处,此处不再赘述。
谁应该阅读本书
无论是专业开发人员、学生还是编程爱好者,只要已经掌握 C# 语言的基础知识,就适合阅读这本书。虽然不要求你达到专家水平,但最好熟悉 C# 语言的基础知识,并且至少能够独立编写简单的 C# 应用程序。
因为书中涵盖了一些更高级的 .NET 知识,所以在谈到这些知识时,我会对它们进行详细说明。
本书尤其针对以下几类读者提供了相应的内容:
● 如果你已经掌握 C# 语言的基础知识,但为了编写出更好、更健壮的代码而想通过学习更高级的技术来进一步实现自我提升,就可以从本书中找到实用的,有价值的内容;
● 如果你是 .NET 开发者,听说过函数式编程甚至对它有一定的了解,并且想知道如何在 C# 语言中采用这样的编码风格,就可以通过本书开启新的征程;
● 如果你是 F# 开发者,希望继续使用熟悉的函数式编程工具,就可以通过本书了解相关细节;
● 如果你是从其他支持函数式编程的语言(如 Java 语言)转向 .NET 平台的开发者,就可以发现这本书是一个宝贵的资源;
● 如果你是真心热爱编程的人,在办公室里写了一天代码回到家后还会出于兴趣写一写自己的应用,就可以发现本书相当适合你。
本书写作动机
我从小就对编程有浓厚的兴趣。小的时候,我家里有一台 ZX Spectrum,这是一款 Sinclair Research 在 20 世纪 80 年代初开发的家用电脑。熟悉 Commodore 64的人,或许觉得 ZX Spectrum 似曾相识,但相比之下,它更古老。ZX Spectrum只支持 15 种颜色和 256×192 的屏幕分辨率。(它有 8 种基本颜色,每种颜色都有一个亮色版本。不过,其中一个颜色是黑色,而它并不存在亮色版本。所以,总共是 15 种颜色。)我用的是有 48 kB 内存的高级型号,而我父亲用的是更老的 ZX81 型号,内存仅有 1 kB,键盘则是橡胶材质。它甚至无法显示彩色的游戏角色,只有屏幕上的色块,因此游戏中的人物角色会根据背景的颜色而改变颜色。总而言之,在当时,它们真的很酷!
最让人兴奋的是,它的操作系统实际上是一个文本编程界面。我需要输入代码来加载游戏(使用 LOAD "" 命令从磁盘加载)。当时市面上有一些专门针对孩子的包含游戏代码的杂志和书籍,正是这些资料培育了我对计算机代码的热爱。
在此,我要特别向 Usborne Publishing 表示感谢!
在我大约 14 岁的时候,学校电脑上的一个就业指导程序建议我考虑软件开发作为职业。那时我才第一次意识到,这个不太正经的爱好原来可以转为谋生的手段!
大学毕业后,我决定找一份正式的工作,当时是我第一次接触 C# 语言。就这样,我顺理成章地设定了下一个目标:找到恰当的编写代码的方式。这听起来很简单,对吧?但老实说,在差不多 20 年之后,我在努力,还没有实现这个目标。
我个人编程生涯的关键转折来自在挪威召开的一次开发者大会。那次大会后,我终于理解了我所熟悉的函数式编程究竟是什么。函数式编程的代码非常优雅和简洁,而且容易理解,这是其他编程风格难以企及的。虽然和其他类型的编程风格一样,采用函数式编程仍然可能编写出结构欠佳的代码,但函数式编程给我带来了一种前所未有的体验,让我觉得自己终于找到了一种“恰当”的编程方式。希望你在阅读这本书后,不仅认同我这个观点,而且还会被这个充满无限可能的编程世界深深吸引。
本书导航
本书的结构如下。
● 第 1 章是绪论,介绍如何立即开始使用 C# 语言进行函数式编程,不需要我们导入任何新的 NuGet 包、使用第三方库或者对 C# 语言进行特殊处理。这一章的所有示例几乎都适用于 C# 3.0 及以后的版本。完成第 1 章的学习,你将迈出第一步,开始你的函数式编程之旅,这一章的所有代码都相对简单,是本书后续内容的基础。
● 第 I 部分“我们已经在做的事”(第 2 章到第 4 章),探讨如何将函数式编程的一些理念自然融入 C# 编程中,不需要进行任何根本性的改变。在这一部分中,许多代码示例都直接使用标准 C# 语言来实现。
如果你之前从未听说过函数式编程而想要循序渐进地入门,那么这部分将是很好的起点。打个比方,这就像是游泳前轻轻地将脚浸入水中,看自己是否对下水游泳感兴趣。
● 第 II 部分“深入函数式编程”(第 5 章到第 10 章),标志着进入“深水区”,要介绍一些“真正”的函数式编程概念。不过别担心,我会一一拆解这些概念,由浅入深地进行讲解。
● 第 III 部分“走出迷雾”(第 11 章到第 14 章),总结并巩固前面所学的知识,并介绍其他一些值得钻研的领域。
随意挑选自己最感兴趣的部分开始阅读。这本书不是小说,(但是,假如把这本书比作小说,那么我保证它会是一部谋杀悬疑小说,而且凶手肯定是管家!)请按照自己觉得最合适的顺序阅读。
排版约定
本书使用的排版约定如下。
粗体
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
Constant width( 等宽字体 )
表示程序代码和段落内的程序元素,如变量名、函数名、数据库、数据类型、环境变量、语句和关键字等。
这个图标代表一般性的补充说明。
这个图标代表警告或需要注意的事项。
使用代码示例
本书的补充材料(包括代码示例、练习等)可以参见 https://oreil.ly/functional?programming-with-csharp-code。
如果在使用代码示例时遇到技术问题或有其他疑问,请通过以下电子邮件地址联系我们:bookquestions@oreilly.com。
这本书旨在帮助你学习。一般来说,除非计划大量复制或使用书中的代码,否则可以随意在自己的程序和文档中应用本书提供的示例代码,无需事先征得我们的同意。举例来说,编写一个包含书中多个代码片段的程序不需要特别许可。
但是,若要出售或分发 O'Reilly 书籍中的示例代码,则必须获得我们的正式许可。引用本书和书中的示例代码来回答问题不需要特别许可,但是,如果在你的产品文档中大量引用了本书的示例代码,就需要获得正式许可。
虽然不是强制性要求,但我们总是欢迎并感激任何对书籍归属的标注。书籍归属应包含书名、作者、出版社和 ISBN 号。例如:“Functional Programming with C# by Simon J. Painter (O'Reilly). Copyright 2023 Simon J. Painter, 978-1-492-09707-5.”。
如果认为自己使用代码示例的方式可能超出了合理使用范围或上述许可范围,请随时通过以下邮箱联系我们:permissions@oreilly.com。
O'Reilly 在线学习平台(O'Reilly Online Learning)
近 40 年来,O'Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly 的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及 O'Reilly和 200 多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
致谢
首先要感谢凯瑟琳·多拉德。几年前,她在奥斯陆举办的一次挪威开发者大会(NDC)上发表了一场演讲,题为“C# 语言的函数式编程技巧”,那是我第一次真正接触函数式编程,它为我打开了一扇通往美丽新世界的大门(https://oreil.ly/nBpWu)。
在这段探索之旅中,对我而言,恩里科·布奥南诺也是一名重要的导师。通过阅读他的著作《C# 函数式编程:写出更优质的 C# 代码》,我理解了一些复杂的函数式概念的运作方式。如果你对我的这本书感兴趣,那么我强烈推荐你同时再读一读他的那本。
感谢阅读本书早期草稿并提供宝贵反馈的人,包括伊恩·拉塞尔、马修·弗莱彻、利亚姆·莱利、马克斯·迪特泽、史蒂夫·柯林斯、赫拉尔多·李斯、马特·伊兰、拉胡尔·纳特、西瓦·古迪瓦达、克里斯蒂安·霍斯达尔、马丁·福斯、戴夫·麦克洛、塞巴斯蒂安·罗宾斯、大卫·谢弗、彼得·德·坦德、马克·西曼、杰拉尔德·弗斯鲁斯、亚历克斯·怀尔德、瓦拉迪斯·诺瓦科维茨、莱克纳·莱因哈德、埃里克·卢卡斯、克里斯托弗·斯特拉滕、凯瑟琳·多拉德以及斯科特·瓦斯欣。在此向大家一并致谢!
还要特别感谢我的编辑吉尔·伦纳德。在过去一年,她对我的包容始终犹如海纳百川,感谢她的耐心。
