发表于2024-11-10
摆在读者面前的这本书并不厚,却凝结了业内多位专家的宝贵经验。作者尝试以简洁
的语言和丰富的示例阐述Clojure 的独到之处,并培养读者从函数式编程的角度思考问题。
不过,本书的目标群体是具有一定经验的开发人员,缺少相关背景的读者可先参阅其他资
料,以夯实基础。无论官方文档、论坛博客、主题演讲还是GitHub,都是很好的学习资源。
“一万小时定律”或许并非放之四海而皆准,但唯有不断实践,才能真正掌握一门语言。
作为一门现代Lisp方言,Clojure专为支持并发和Java兼容性而设计,能提供众多开发人员孜孜以求的解决方案。凭借通用性和诸多功能,Clojure日益受到企业级应用开发人员(尤其是那些希望远离命令式编程加速工作流程的开发人员)的青睐。本书条理清晰,紧贴实际介绍Clojure的用法,为职业程序员提供完备参考。本书首先介绍函数式编程基础知识,此后重点讲解与Clojure相关的特定主题,并从专业Clojure贡献者的角度提出诸多见解。资深Clojure人才日益紧俏,这本精品指南将助你迅速蜕变为Clojure专业开发人士。主要内容◆探讨函数式编程与面向对象编程之间的差异,分析Clojure如何消除这种差异◆讨论快速反馈循环中声明式编程所用的REPL流程◆演示如何使用ClojureScript来设计和开发反应式网页◆介绍Clojure的特性、性能与功能,并讨论使其成为一门重要语言的通用兼容性◆涵盖Web服务、测试和Datomic数据库等主题,是完备的专业指南和教程◆从专家程序员和Clojure贡献者的角度,提出应用开发的实用见解
JeremyAnderson就职于美国密歇根州的CodeAdept,这是一家提供高品质软件交付的咨询公司,业务涵盖软件开发、敏捷教导与培训服务。Jeremy是一名Clojure爱好者,对多种Clojure库的开发都有贡献。Jeremy对向用户提供编程培训极为热心,并作为志愿者在当地中学协助讲授计算机课程。
MichaelGaare就职于美国一家提供金融技术服务的初创公司NextAngles,担任平台技术负责人。从2012年起,Michael就采用Clojure开发专业的Web服务、数据处理系统与各种库(而非框架)。Michael爱好参加歌剧演出,大部分闲暇时间都与妻子和两个女儿度过。
JustinHolguín在美国波特兰的PuppetLabs担任软件工程师,负责Clojure后端服务的开发。Justin热爱函数式编程,对高级类型系统、基于属性的测试等能够提高软件稳定性的技术情有独钟。
NickBailey是一名Clojure爱好者,也负责Clojurejava.jmx库的维护。Nick在总部位于美国加州的DataStax担任软件架构师,使用Clojure开发用于管理分布式数据库的企业级软件。Nick从2010年起开始接触Clojure,并由此成为这门语言的拥护者。
TimothyPratley从2008年起开始使用Clojure,是这门语言的贡献者和倡导者。Timothy目前就职于美国旧金山的OutpaceSystems,负责开发基于Clojure、ClojureScript和ClojureAndroid的解决方案。Timothy已有15年的专业软件开发经验,接触过许多编程语言、框架和数据库,热爱Clojure、Datomic数据库、结对编程(pairprogramming),喜欢思考。
第1章 保持初学者的心态 1
1.1 函数式思维 2
1.1.1 以值为导向 2
1.1.2 从递归的角度考虑问题 4
1.1.3 高阶函数 7
1.1.4 拥抱惰性 11
1.1.5 当变动成为必需时 12
1.1.6 Nil双关 15
1.1.7 函数式Web 16
1.2 改进面向对象编程 17
1.2.1 利用defmulti实现
多态调度 18
1.2.2 使用deftype和defrecord
定义类型 20
1.2.3 协议 21
1.2.4 reify 22
1.3 可持久化数据结构 23
1.4 塑造语言 27
1.5 小结 29
第2章 Clojure的快速反馈循环 31
2.1 REPL驱动开发 31
2.1.1 REPL在Leiningen中的
基本操作 32
2.1.2 通过nREPL实现
远程REPL 34
2.1.3 REPL在实际程序中的
应用 36
2.1.4 REPL与编辑器的连接 40
2.2 代码重载 41
2.2.1 从REPL重载代码 41
2.2.2 自动重载代码 45
2.2.3 编写可重载的代码 52
2.3 小结 54
第3章 Web服务 55
3.1 项目总览 55
3.2 构成Web服务的元素 57
3.2.1 库,而非框架 57
3.2.2 HTTP 57
3.2.3 路由 66
3.2.4 JSON端点 73
3.3 示例服务 78
3.3.1 创建项目 78
3.3.2 其他命名空间 78
3.3.3 默认中间件 81
3.3.4 存储协议 82
3.3.5 处理函数 87
3.3.6 中间件 92
3.3.7 路由 94
3.4 部署 99
3.4.1 使用Leiningen 99
3.4.2 编译Uberjar或Uberwar 100
3.4.3 托管 101
3.5 小结 102
第4章 测试 105
4.1 clojure.test测试基础 106
4.1.1 with-test宏 106
4.1.2 deftest库 107
4.1.3 are 108
4.1.4 使用基境 109
4.2 测试策略 110
4.2.1 数据库测试 110
4.2.2 Ring处理函数测试 112
4.2.3 采用with-redefs实现
模拟/存根 115
4.2.4 重新定义动态var 117
4.2.5 采用vcr-clj实现录制和
重放 118
4.3 度量代码质量 119
4.3.1 采用cloverage度量
代码覆盖率 120
4.3.2 采用kibit和bikeshed
进行静态分析 122
4.3.3 将依赖置于掌控之中 124
4.4 其他测试框架 127
4.4.1 expectations 127
4.4.2 speclj 128
4.4.3 Cucumber 129
4.4.4 kerodon 136
4.5 小结 137
第5章 采用ClojureScript开发
反应式网页 139
5.1 ClojureScript与众不同 140
5.2 ClojureScript初探 142
5.2.1 创建新的ClojureScript
项目 142
5.2.2 采用Figwheel实现
快速反馈 143
5.2.3 创建组件 144
5.2.4 数据建模 145
5.2.5 响应事件并处理状态
变更 147
5.2.6 理解错误和警告信息 148
5.2.7 命名空间布局 151
5.2.8 样式 152
5.2.9 表单输入与表单处理 153
5.2.10 导航和路由 156
5.2.11 HTTP调用:与服务器
进行通信 157
5.2.12 拖放 160
5.2.13 发布 160
5.3 Reagent进阶 162
5.3.1 形式1:返回向量的
函数 162
5.3.2 形式2:返回组件的
函数 163
5.3.3 形式3:返回类的函数 164
5.3.4 序列与键 165
5.3.5 自定义标记 167
5.3.6 反应 168
5.3.7 对样式的注释 170
5.4 Devcards的测试组件 170
5.5 与JavaScript的互操作性 174
5.6 一种语言,一种惯用法,
多个平台 176
5.7 Closure编译器和Closure
库浅析 176
5.8 采用DataScript处理
建模状态 177
5.9 在浏览器中使用core.async 178
5.10 小结 179
第6章 Datomic数据库 181
6.1 Datomic基础 182
6.1.1 为何选择Datomic? 182
6.1.2 Datomic数据模型 184
6.1.3 查询 187
6.1.4 事务 192
6.1.5 索引:将数据切实绑定
在一起 195
6.1.6 Datomic的独特架构 198
6.2 对应用数据建模 200
6.2.1 任务跟踪器应用的
示例模式 200
6.2.2 实体id和分区 209
6.3 Datomic的Clojure API 209
6.3.1 基本设置 209
6.3.2 在REPL中小试牛刀 213
6.4 采用Datomic构建应用 219
6.4.1 用户函数 219
6.4.2 账户函数 222
6.4.3 任务函数 223
6.4.4 部署 227
6.4.5 局限性 227
6.5 小结 228
第7章 性能 231
7.1 何为性能? 233
7.2 性能优化的前提:选择
正确的数据结构 233
7.3 基准测试 235
7.3.1 测定低速模块的时间 235
7.3.2 采用Criterium测定高速
模块的时间 237
7.3.3 采用测试选择器进行
性能测试 239
7.4 并行 239
7.5 记忆化 240
7.6 内联 241
7.7 利用瞬态机制安全地
处理变动 243
7.8 性能分析 243
7.9 利用类型提示避免反射 244
7.10 Java标志 246
7.11 数值计算 246
7.12 小结 247
Clojure一瞥
Clojure是一种动态、通用的程序设计语言,既有脚本语言易于学习和交互开发的特点,又具备适合多线程编程的高效和强健的基础架构。虽然Clojure属于编译语言,却是完全动态的,所有特性都能在运行时得到支持。借助可选的类型提示和类型接口,Clojure可以方便地访问Java框架,确保在调用时不会出现Java反射。
Clojure是一种Lisp方言,继承了Lisp“代码即数据”的设计理念以及功能强大的宏系统。总体而言,Clojure属于函数式编程语言,包括丰富的不可变和可持久化数据结构。当需要处理可变状态时,Clojure通过软件事务内存与响应式Agent系统,确保实现清晰、正确、多线程的设计。
——RichHickey,Clojure作者
上述介绍来自Clojure的作者RichHickey,点出了这门语言的本质。许多人将Clojure等同于函数式编程,不过与其前身Lisp类似,Clojure实际是一门通用语言,能支持任何编程范式。
然而,Clojure的确具有浓郁的函数式特点。它侧重于不可变值和可持久化数据结构,为函数式编程提供有力支持。读者或许对Clojure也能用于面向对象编程表示惊讶,本书将对此进行讨论。
目标读者
本书是为有经验的程序员准备的。读者应掌握至少一门编程语言,并了解Clojure的基本语法和概念,做好在更高层次上运用Clojure的准备。本书旨在实现读者从Clojure初学者向Clojure开发者的蜕变。学习Clojure不仅涉及全新的语法,所用的工具和构造可能与读者之前的体验大相径庭。
程序源代码
读者可以从Wiley网站www.wiley.com/go/professionalclojure下载源代码,也可以访问GitHub上的Clojure项目:https://github.com/backstopmedia/clojurebook。
一门功能强大的程序设计语言不仅可以引导计算机执行既定的任务,也是一个能体现开发人员进程思路的框架。
——《计算机程序的构造和解释》(SICP)
本书假定读者已具备程序设计和Clojure的基础知识,但尚未达到精通Clojure的程度。本书涵盖的范围较广,包括改变读者的思考方式和编程习惯,如何将REPL集成到用户的开发程序中,以及采用Ring和ClojureScript构建实际的应用。
本书架构
本书将提供若干实际的示例,以帮助读者将所学的Clojure知识运用到日常的编程工作中,而非纸上谈兵式的空谈。
第1章
该章将介绍Clojure在程序设计中的独特视角。读者将了解Clojure有别于其他语言的原因,如为何默认使用不可变性、Clojure为何也能用于面向对象编程等。
第2章
该章将介绍精通REPL所需的各种知识,以及REPL与实际应用交互时的技巧和技术。读者将学习如何从REPL运行代码和测试,以及编写便于从REPL重载而不需要重启的代码。
第3章
该章将讨论采用Compojure创建Web服务,以及所涉及的相关概念(如路由、处理器、中间件等)。读者将开发一个完整的Web服务,并学习与部署应用有关的各种技术。
第4章
该章将讨论Clojure中的测试,并重点介绍clojure.test测试库。读者将学习在各种常见测试场景中采用的技术,以及评估代码质量的工具。
第5章
该章将讨论如何使用ClojureScript开发一个类似于Trello的任务管理系统,并介绍如何在服务器端与客户端应用之间实现函数共享。
第6章
该章将介绍Datomic数据库,并讨论后者如何将不可变的概念应用到数据库中。读者将学习如何在Datomic中进行数据的建模和提取,并运用所学的知识创建一个能支持任务管理系统(在第5章开发)的数据库。
第7章
该章将讨论Clojure的性能,以及如何提高Clojure代码的执行速度。利用某些技巧,可以让Clojure代码的执行速度与Java代码一样快。
所需工具
俗话说:“工欲善其事,必先利其器”。幸运的是,学习和使用本书示例仅需要Java、Leiningen以及一种优秀的文本编辑器。
Java
目前,大部分计算机都预装了Java。不过为运行本书中的示例,读者应确保安装Java的最新版本。书中的代码示例在JDK1.8.0_25下编写并测试通过。请浏览OracleJDK下载页面中的文档,以获得在不同平台下载和安装JDK的信息。
Leiningen
根据官网的描述,Leiningen是对Clojure贡献最大的项目。对具有Java背景的读者而言,Leiningen之于Clojure,如同Maven之于Java,只是少了各种XML。用户可以从容构建Clojure项目,避免陷入令自己心急火燎的窘境。Leiningen能管理项目依赖项,并声明性地描述项目和配置,还提供代码分析、自动化等大量实用的插件。Leiningen可以有效提高Clojure的使用体验。
幸运的是,配置和运行Leiningen相当简单。读者应安装Leiningen的最新版本,截至本书写作时,其最新版本为2.5.3。请访问Leiningen网站,以获得在不同编程环境下配置Leiningen的信息。
编辑器
完成Leiningen的安装后,应选择一种优秀的文本编辑器,以提高编写Clojure代码的效率。如果读者已有熟悉的编辑器,继续使用它们即可。但是,如果所用的编辑器不支持括号平衡、REPL集成、语法高亮、代码缩进等基本功能,应考虑换用以下编辑器。
Emacs
Emacs为众多资深程序员所青睐,它与Lisp的历史一样悠久。尽管上手不易,但Emacs被广泛认为是一种功能极强大的编辑器,其可扩展性无出其右。目前有许多有助于改善学习难度的自定义Emacs配置,如EmacsPrelude。后者合理的默认配置,可以用于包括Clojure在内的多种语言的开发。
LightTable
LightTable最初是Kickstarter上的一个项目,现已发展为一个集代码编辑器、REPL、文档浏览器于一身的IDE。LightTable功能强大,目前在Clojure社区备受推崇。
Cursive(IntelliJ)
如果读者熟悉某种JetBrainsIDE的使用,会很高兴看到这款名为Cursive的IntelliJ插件。Cursive不仅能很好地与nREPL进行集成,也提供强大的重构支持,以及调试和Java互操作性等功能。
Counterclockwise(Eclipse)
熟悉Eclipse的读者可以考虑使用Counterclockwise,后者既是一款Eclipse插件,也可以作为一个独立的编辑器使用。Counterclockwise具备与上述几种编辑器相同的特性,以及REPL集成、内联代码评估等功能。
本书约定
为帮助读者在阅读本书的过程中获取最多信息,并随时了解当前处理的事项,本书使用了许多约定。
注意:
列出注释、提示、暗示、技巧或对当前讨论的弦外之音。
本书通过两种方式来显示代码:
●对于大多数代码示例,使用没有突出显示的等宽字体来表示。
●对在当前上下文中特别重要的代码,用粗体字来强调显示。
勘误表
尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果你在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。
请给wkservice@vip.163.com发电子邮件,我们就会检查你的反馈信息,如果是正确的,我们将在本书的后续版本中采用。
要在网站上找到本书英文版的勘误表,可以登录http://www.wrox.com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击BookErrata链接。在这个页面上可以查看到Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是www.wrox.com/misc-pages/booklist.shtml。
p2p.wrox.com
要与作者和同行讨论,请加入p2p.wrox.com上的P2P论坛。这个论坛是一个基于Web的系统,便于你张贴与 Clojure高级编程(Web开发经典丛书) 下载 mobi epub pdf txt 电子书 格式
Clojure高级编程(Web开发经典丛书) 下载 mobi pdf epub txt 电子书 格式 2024
Clojure高级编程(Web开发经典丛书) 下载 mobi epub pdf 电子书Clojure高级编程(Web开发经典丛书) mobi epub pdf txt 电子书 格式下载 2024