新書推薦:
《
干戈之影:商代的战争观念、武装者与武器装备
》
售價:NT$
340.0
《
镶嵌之美:古希腊罗马的马赛克艺术
》
售價:NT$
1390.0
《
后希腊化哲学:从斯多亚学派到奥利金的发展研究
》
售價:NT$
349.0
《
别纠结啦:不被情绪牵着走的通透生活指南(“当代一休”小池龙之介治愈新作!附赠精美书签!)
》
售價:NT$
295.0
《
第二人生:找到重新定义人生的智慧
》
售價:NT$
440.0
《
唐朝三百年
》
售價:NT$
490.0
《
反操纵心理学:夺回人生主导权 拒绝被操纵
》
售價:NT$
249.0
《
同工异曲:跨文化阅读的启示(修订版)(师承钱锺书先生,比较文学入门,体量小但内容丰,案例文笔皆精彩)
》
售價:NT$
199.0
編輯推薦:
本书是一本介绍用函数式编程方式编写更好、更整洁代码的实用指南。在本书中,著名软件工程师Robert C. Martin(Bob大叔)解释了为何使用函数式编程,以及如何做才能为客户构建更好的系统。Bob大叔将Java中传统的面向对象的编程结构与函数式语言所支持的编程结构进行了对比,确定了每种结构的作用,并展示了如何明智地在合理上下文中使用两者来构建更好的系统。
作风务实的Bob大叔能用最少的理论讲清并解决“真刀真枪”的实战问题。通过易于理解的示例,开发人员能发现易于学习且语义丰富的Clojure语言如何帮助他们提高代码的整洁性、设计性、纪律性和成效性。Bob大叔还从函数式的视角研究了著名的SOLID原则和GOF设计模式,揭示了模式对于函数式程序员仍极具价值的原因,以及使用它们来实现卓越成效的方法。
通过阅读本书,你将能够:
?理解函数式编程基础:不变性、持久性数据、递归、迭代、惰性和状态性;
?通过精心设计的案例研究对比函数式方法和面向对象方法;
?探索数据流的函数式设计技术;
?使用经典的SOLID原则编写更好的Clojure代码;?
?掌握实现函数式测试、GUI和并发性
內容簡介:
在本书中,著名软件工程师罗伯特·C. 马丁(Robert C. Martin,”鲍勃大叔”)解释了如何以及为什么使用函数式编程为真实客户构建更好的系统。作者将 Java 中传统的面向对象编码结构与函数式语言所支持的编码结构进行了比较,确定了每种结构的最佳作用,并展示了如何在特定环境中明智地使用这些结构来构建更好的系统。
關於作者:
Robert C. Martin(Bob大叔),世界著名编程大师,敏捷开发和设计模式先驱,从事软件开发相关工作超过50年。他是“SOLID五大原则”的奠基人、“敏捷宣言”联合签署人、“敏捷联盟”首任主席、C Report杂志前主编。他发表了大量有影响力的文章,并经常受邀在许多国际软件大会上发表演讲。他创立了Uncle Bob Consulting有限责任公司,并与儿子Micah Martin共同创立了Clean Coders有限责任公司。他还是Clean Code、Clean Architecture和The Clean Coder等多本畅销书籍的作者,本书是他最新的作品。
目錄 :
目 录
题 献
推荐序
译者序
序
前 言
致 谢
作者简介
第一部分 函数式基础
第1章 不变性 2
1.1 什么是函数式编程 3
1.2 赋值的问题 5
1.3 为什么叫它“函数式” 7
1.4 没有状态改变吗 8
1.5 不变性概念 11
第2章 持久性数据 12
2.1 关于瞒天过海 14
2.2 制作副本 14
2.3 结构共享 16
第3章 迭代和递归 19
3.1 迭代 20
3.1.1 极简Clojure教程 20
3.1.2 迭代概述 22
3.1.3 TCO、Clojure和JVM 22
3.2 递归 23
第4章 惰性 26
4.1 惰性累积 28
4.2 为何需要惰性 28
4.3 尾声 29
第5章 状态性 30
5.1 何时必须“可变” 33
5.2 软件事务内存 34
5.3 生活不易,软件更难 36
第二部分 比较性分析
第6章 质因数练习 39
6.1 Java版 40
6.2 Clojure版 43
6.3 总结 45
第7章 保龄球练习 46
7.1 Java版 47
7.2 Clojure版 51
7.3 总结 54
第8章 八卦公交司机练习 56
8.1 Java版 57
8.1.1 公交司机文件 62
8.1.2 行车线路文件 62
8.1.3 公交车站文件 63
8.1.4 八卦故事文件 64
8.1.5 模拟过程文件 64
8.2 Clojure版 65
8.3 总结 69
第9章 面向对象编程 70
9.1 函数式工资问题解决方案 72
9.2 命名空间与源文件 78
9.3 总结 78
第10章 类型 80
第三部分 函数式设计
第11章 数据流 86
第12章 SOLID 92
12.1 单一职责原则 93
12.2 开闭原则 96
12.2.1 函数 97
12.2.2 带虚表的对象 98
12.2.3 多重方法 98
12.2.4 独立部署 99
12.3 里氏替换原则 101
12.3.1 ISA原则 103
12.3.2 这不对 105
12.3.3 代表原则 106
12.4 接口隔离原则 106
12.4.1 不需要就别依赖 108
12.4.2 为什么 108
12.4.3 总结 109
12.5 依赖倒置原则 109
12.5.1 回忆杀 111
12.5.2 违背依赖倒置原则 119
12.5.3 总结 129
第四部分 函数式实用主义
第13章 测试 132
13.1 REPL 133
13.2 Mock 133
13.3 基于性质的测试 134
13.4 诊断技术 137
13.5 函数式 143
第14章 GUI 144
第15章 并发性 155
第五部分 设计模式
第16章 设计模式回顾 165
16.1 函数式编程中的模式 167
16.2 抽象服务器模式 168
16.3 适配器模式 170
16.4 命令模式 174
16.5 组合模式 178
16.6 装饰器模式 186
16.7 访问者模式 189
16.7.1 To Close or to Clojure 191
16.7.2 90°问题 193
16.8 抽象工厂模式 196
16.8.1 90°问题重现 199
16.8.2 类型安全吗 201
16.9 总结 201
16.10 补充:面向对象是毒药吗 201
第六部分 案 例 研 究
第17章 Wa-Tor小游戏 204
17.1 如鲠在喉 220
17.2 解决问题 222
17.3 让鱼疯狂繁殖 230
17.4 对于鲨鱼 231
17.5 总结 240
后记 242
內容試閱 :
前言
这是一本为每日编写代码的程序员所写的书,目的是帮助他们了解如何使用函数式编程语言来完成实际的任务。因此,我不会花太多时间去探讨函数式编程的理论,如Monads、Monoids、Functors、Categories等。这并不是说这些理论不正确、无价值或不相关,而是因为它们通常不会出现在程序员的日常工作中。这些理论已经与常见的语言、代码库和框架融为了一体。如果对函数式理论感兴趣,推荐阅读Mark Seemann的著作。
本书探讨的是如何(以及为何要)在日常工作中使用函数式编程为真实的客户构建真实的系统。接下来,我们将比较下面两种常见的代码结构—面向对象语言(如Java)和函数式语言(如Clojure)。
我之所以选择这两种语言,是因为Java使用得非常广泛,Clojure则极容易学习。
函数式编程和过程式编程简史
1936年,艾伦·图灵(Alan Turing)和阿隆佐·丘奇(Alonzo Church)这两位数学家独立解决了大卫·希尔伯特(David Hilbert)所提出的著名难题之一:可判定性问题。虽然由于前言的篇幅限制,我们无法详细描述这个问题,但只需知道这与寻找整数公式的通解有关即可。这与我们所讨论的主题相关,因为数字计算机中的每个程序其实都是一个整数公式。
这两位数学家独立地证明了这样的通解不存在。他们证明了存在这样的整数,它们永远不能由比该整数小的整数公式计算出来。另一种说法是,存在计算机程序无法计算的数字。实际上,这就是艾伦·图灵所使用的方法。在1936年所发表的著名论文中,图灵发明了一种数字计算机,并证明了即使给定无限的时间和空间,计算机也无法计算某些数字。
另外,丘奇通过他所发明的lambda演算(一种用于操作函数的数学形式化方法)得出了同样的结论。通过对形式化方法逻辑的操作,他证明了存在无法解决的逻辑问题。
图灵的发明是所有现代数字计算机的前身。所有数字计算机实际上都是一台(有限)图灵机。所有在数字计算机上执行的程序实际上都是一个图灵机程序。
丘奇和图灵后来合作证明了他们俩的方法是等价的。图灵机中的每一个程序都可以用lambda演算来表示。反之亦然。
所有的函数式编程实际上都是lambda演算。
这两种编程风格在数学上是等价的。任何程序都可以使用过程式风格(图灵)或函数式风格(丘奇)来编写。本书要探讨的不是这种等价性,而是如何使用函数式方法影响程序的结构和设计。我们将试图确定函数式方法产生的结构和设计是否优于或劣于使用过程式方法所产生的结构和设计。
关于Clojure
本书选择Clojure是因为学习新语言比较难,如果同时学习新范式的话,更是难上加难。因此,为了简化学习任务,我选择了一门既足够简单又能够让我们学习函数式编程和函数式设计的语言。
Clojure语义丰富且语法简单。语法简单意味着学习起来比较轻松。学习Clojure的难点都在语义方面。虽然代码库和习惯用法需要很大的努力去内化,但学习语言本身几乎不费力气。希望本书能提供一种学习和欣赏函数式编程的方法,其间不会让大家因新语言的语法而分心。
话虽如此,但本书并不是Clojure教程。在前几章中,我会解释一些Clojure的基础知识并使用一些解释性的脚注。同时,期望亲爱的读者去做功课并查找相关资料。有几个很好的网站可供查询,我最喜欢的网站是https://clojure.org/api/cheatsheet。
本书会使用speclj测试框架。随着内容的展开,测试代码会越来越多。它与其他受欢迎的测试框架非常相似,因此在阅读过程中,熟悉它的各种功能并不难。
关于架构和设计
本书的重点是描述用函数式方法构建的系统的设计和架构原则。为此,我将使用统一建模语言(Unif?ied Modeling Language,UML)图,并参考软件设计的SOLID原则、设计模式,以及整洁架构的概念。不用担心,书中会解释这些概念,并引用许多外部参考资料供你查阅。
关于面向对象
许多人都认为,面向对象编程和函数式编程互不兼容。本书应该能够证明事实并非如此。本书中的程序、设计和架构是函数式和面向对象概念的融合体。根据经验,我坚定地认为,这两种风格是完全兼容的。好的程序员可以并且应该将两者兼收并蓄,相互为用。
关于“函数式”
本书会使用“函数式”这个术语,并对其进行定义和阐述。随着内容的展开,我也会对这个概念做一些修正。有些例子虽然是用函数式语言和函数式风格编写的,但并不是纯粹的函数式。在大多数情况下,我会为“函数式”这个词加上引号,并使用脚注指出所做的修正。
为何要做修正?因为本书强调的是实用,而非理论。从函数式风格中获得好处(而不是严格遵循理论)会更有趣。正如我们将在第1章中看到的,接受用户提供的输入参数的“函数”并不是纯粹的函数式,但本书会在需要实用性的地方使用这样的“函数”。
本书所有示例的源代码都存放在一个GitHub仓库中,地址为https://github.com/unclebob/FunctionalDesign。