關於本書
《Clojure高級編程》以簡潔的語言和豐富的示例闡述了Clojure的獨到之處,介紹了Clojure在實際開發中的套用。本書主要討論函式式編程和Clojure相關的特定內容,並從專業Clojure貢獻者的角度提出了諸多見解。
本書英文版( )由Wrox Press於2016年6月出版,中文版由清華大學出版社於2017年6月出版。
內容簡介
•探討函式式編程與面向對象編程之間的差異,以及Clojure如何解決這種差異
•討論快速反饋循環中聲明式編程所用的REPL流程
•演示ClojureScript在設計和開發反應式網頁中的套用 [3]
•介紹Clojure的特性、性能與功能,並討論使其成為一門基本程式語言的通用兼容性
•涵蓋Web服務、測試、Datomic資料庫等諸多內容
•從專業程式設計師和Clojure貢獻者的角度,提供實際開發所需的務實見解
目標讀者
《Clojure高級編程》是為有經驗的程式設計師準備的,旨在實現讀者從Clojure初學者向Clojure開發者的轉變。讀者應掌握至少一門程式語言,並了解Clojure的基本語法和概念,做好在更高層次上運用Clojure的準備。本書假定讀者已具備程式設計和Clojure的基礎知識,但尚未達到精通Clojure的程度。
本書架構
第1章
介紹Clojure在程式設計中的獨特視角。讀者將了解Clojure有別於其他語言的原因,如為何默認使用不可變性、Clojure為何也能用於面向對象編程等。
1.1 函式式思維
1.1.1 以值為導向
1.1.2 從遞歸的角度考慮問題
1.1.3 高階函式
1.1.4 擁抱惰性
1.1.5 當變動成為必需時
1.1.6 Nil雙關
1.1.7 函式式Web
1.2 改進面向對象編程
1.2.1 利用defmulti實現多態調度
1.2.2 使用deftype和defrecord定義類型
1.2.3 協定
1.2.4 reify
1.3 可持久化數據結構
1.4 塑造語言
1.5 小結
第2章
介紹精通REPL所需的各種知識,以及REPL與實際套用互動時的技巧和技術。讀者將學習如何從REPL運行代碼和測試,以及編寫便於從REPL重載而不需要重啟的代碼。
2.1 REPL驅動開發
2.1.1 REPL在Leiningen中的基本操作
2.1.2 通過nREPL實現遠程REPL
2.1.3 REPL在實際程式中的套用
2.1.4 REPL與編輯器的連線
2.2 代碼重載
2.2.1 從REPL重載代碼
2.2.2 自動重載代碼
2.2.3 編寫可重載的代碼
2.3 小結
第3章
討論採用Compojure創建Web服務,以及所涉及的相關概念(如路由、處理器、中間件等)。讀者將開發一個完整的Web服務,並學習與部署套用有關的各種技術。
3.1 項目總覽
3.2 構成Web服務的元素
3.2.1 庫,而非框架
3.2.2 HTTP
3.2.3 路由
3.2.4 JSON端點
3.3 示例服務
3.3.1 創建項目
3.3.2 其他命名空間
3.3.3 默認中間件
3.3.4 存儲協定
3.3.5 處理函式
3.3.6 中間件
3.3.7 路由
3.4 部署
3.4.1 使用Leiningen
3.4.2 編譯Uberjar或Uberwar
3.4.3 託管
3.5 小結
第4章
討論Clojure中的測試,並重點介紹clojure.test測試庫。讀者將學習在各種常見測試場景中採用的技術,以及評估代碼質量的工具。
4.1 clojure.test測試基礎
4.1.1 with-test宏
4.1.2 deftest庫
4.1.3 are
4.1.4 使用基境
4.2 測試策略
4.2.1 資料庫測試
4.2.2 Ring處理函式測試
4.2.3 採用with-redefs實現模擬/存根
4.2.4 重新定義動態var
4.2.5 採用vcr-clj實現錄製和重放
4.3 度量代碼質量
4.3.1 採用cloverage度量代碼覆蓋率
4.3.2 採用kibit和bikeshed進行靜態分析
4.3.3 將依賴置於掌控之中
4.4 其他測試框架
4.4.1 expectations
4.4.2 speclj
4.4.3 Cucumber
4.4.4 kerodon
4.5 小結
第5章
討論如何使用ClojureScript開發一個類似於Trello的任務管理系統,並介紹如何在伺服器端與客戶端套用之間實現函式共享。
5.1 ClojureScript與眾不同
5.2 ClojureScript初探
5.2.1 創建新的ClojureScript項目
5.2.2 採用Figwheel實現快速反饋
5.2.3 創建組件
5.2.4 數據建模
5.2.5 回響事件並處理狀態變更
5.2.6 理解錯誤和警告信息
5.2.7 命名空間布局
5.2.8 樣式
5.2.9 表單輸入與表單處理
5.2.10 導航和路由
5.2.11 HTTP調用:與伺服器進行通信
5.2.12 拖放
5.2.13 發布
5.3 Reagent進階
5.3.1 形式1:返回向量的函式
5.3.2 形式2:返回組件的函式
5.3.3 形式3:返回類的函式
5.3.4 序列與鍵
5.3.5 自定義標記
5.3.6 反應
5.3.7 對樣式的注釋
5.4 Devcards的測試組件
5.5 與JavaScript的互操作性
5.6 一種語言,一種慣用法,多個平台
5.7 Closure編譯器和Closure庫淺析
5.8 採用DataScript處理建模狀態
5.9 在瀏覽器中使用core.async
5.10 小結
第6章
介紹Datomic資料庫,並討論後者如何將不可變的概念套用到資料庫中。讀者將學習如何在Datomic中進行數據的建模和提取,並運用所學的知識創建一個能支持任務管理系統(在第5章開發)的資料庫。
6.1 Datomic基礎
6.1.1 為何選擇Datomic?
6.1.2 Datomic數據模型
6.1.3 查詢
6.1.4 事務
6.1.5 索引:將數據切實綁定在一起
6.1.6 Datomic的獨特架構
6.2 對套用數據建模
6.2.1 任務跟蹤器套用的示例模式
6.2.2 實體id和分區
6.3 Datomic的Clojure API
6.3.1 基本設定
6.3.2 在REPL中小試牛刀
6.4 採用Datomic構建套用
6.4.1 用戶函式
6.4.2 賬戶函式
6.4.3 任務函式
6.4.4 部署
6.4.5 局限性
6.5 小結
第7章
討論Clojure的性能,以及如何提高Clojure代碼的執行速度。利用某些技巧,可以讓Clojure代碼的執行速度與Java代碼一樣快。
7.1 何為性能?
7.2 性能最佳化的前提:選擇正確的數據結構
7.3 基準測試
7.3.1 測定低速模組的時間
7.3.2 採用Criterium測定高速模組的時間
7.3.3 採用測試選擇器進行性能測試
7.4 並行
7.5 記憶化
7.6 內聯
7.7 利用瞬態機制安全地處理變動
7.8 性能分析
7.9 利用類型提示避免反射
7.10 Java標誌
7.11 數值計算
7.12 小結