JavaScript 函數式編程指南 Functional Programming in JavaScript

Luis Atencio

買這商品的人也買了...

商品描述

本書主要介紹如何通過ECMAScript 6將函數式編程技術應用於代碼,
以降低代碼的複雜性。

本書共三部分內容。
第一部分“函數式思想”是為第二部分的學習作鋪墊的,
這一部分引入了對函數式JavaScript的描述,
從一些核心的函數式概念入手,介紹了純函數、
副作用以及聲明式編程等函數式編程的主要支柱:
第二部分“函數式基礎”重點介紹函數式編程的核心技術,
如函數鏈、柯里化、組合、Monad等;
第三部分“函數式技能提升”則是介紹使用函數式編程解決現實問題的方法。

本書循序漸進地將函數式編程的相關知識鋪陳開來,以理論作鋪墊,
並鋪以實例,旨在幫助讀者更好地掌握這些內容。
如果讀者是對面向對象軟件有一定的瞭解,
且對現代Web應用程序挑戰有一定認識的JavaScript開發人員,
那麼可以從中提升函數式編程技能。
如果讀者是函數式編程的初學者,
那麼可以將本書作為入門書籍仔細閱讀,為今後的學習夯實基礎。

作者簡介

Luis Atencio(@luijar)
是美國佛羅里達州勞德代爾堡的Citrix Systems公司的一名軟件工程師。
他擁有計算機科學學士學位和碩士學位,
現在使用JavaScript、Java和PHP平台進行全職開發和構建應用程序。
Luis積極參與社區活動,並經常在當地的聚會和會議中發表演講。
他在luisatencio.net上發布關於軟件工程的博客,
並為雜誌和DZone撰寫文章,同時還是《RxJS in Action》的共同作者。

目錄大綱

第一部分函數式思想
第1章走近函數式3 
1.1函數式編程有用嗎?4 
1.2什麼是函數式編程?5 
1.2.1函數式編程是聲明式
編程7 
1.2.2副作用帶來的問題和
純函數8 
1.2.3引用透明和可置換性12 
1.2.4存儲不可變數據13 
1.3函數式編程的優點14 
1.3.1鼓勵複雜任務的分解15 
1.3.2使用流式鏈來處理數據16 
1.3.3複雜異步應用中的響應18 
1.4總結19 

第2章高階JavaScript 21 
2.1為什麼要使用
JavaScript?22 
2.2函數式與面向對象的程序設計22 
2.2.1管理JavaScript對象的
狀態28 
2.2.2將對象視為數值29 
2.2.3深凍結可變部分31
2.2.4使用Lenses定位並修改對像圖33 
2.3函數34 
2.3.1一等函數35 
2.3.2高階函數36 
2.3.3函數調用的類型38 
2.3. 4函數方法39 
2.4閉包和作用域40 
2.4.1全局作用域42 
2.4.2函數作用域43 
2.4.3偽塊作用域44 
2.4.4閉包的實際應用45 
2.5總結48 
第二部分函數式基礎

第3章輕數據結構,重操作51 
3.1理解程序的控制流52 
3.2鏈接方法53 
3.3函數鏈54 
3.3.1了解lambda表達式54 
3.3.2用_.map做數據變換56 
3.3.3用_.reduce收集結果57 
3.3.4用_.filter刪除不需要的
元素61 
3.4代碼推理62
3.4.1聲明式惰性計算函數鏈63 
3.4.2類SQL的數據:函數即
數據66 
3.5學會遞歸地思考68 
3.5.1什麼是遞歸?68 
3.5.2學會遞歸地思考68 
3.5.3遞歸定義的數據結構70 
3.6總結73 

第4章模塊化且可重用的
代碼75 
4.1方法鏈與函數管道的
比較76 
4 .1.1方法鏈接77 
4.1.2函數的管道化78 
4.2管道函數的兼容條件78 
4.2.1函數的類型兼容條件78 
4.2.2函數與元數:元組的
應用79 
4.3柯里化的函數求值82 
4.3.1仿真函數工廠85 
4.3.2創建可重用的函數模板86 
4.4部分應用和函數綁定87 
4.4.1核心語言擴展89 
4.4.2延遲函數綁定89
4.5組合函數管道90 
4.5.1 HTML部件的組合91 
4.5.2函數組合:描述與求值
分離92 
4.5.3函數式庫的組合95 
4.5.4應對純的代碼和不純的
代碼96 
4.5.5 point-free編程98 
4.6使用函數組合子來管理
程序的控制流99 
4.6.1 identity(I-combinator) 99 
4.6.2 tap( K-組合子) 99 
4.6.3 alt(OR-組合子) 100 
4.6.4 seq(S-組合子) 101 
4.6.5 fork(join)組合子101 
4.7總結102 

第5章針對複雜應用的設計
模式103 
5.1命令式錯誤處理的
不足104 
5.1.1用try-catch處理錯誤104 
5.1.2函數式程序不應拋出
異常105
5.1.3空值(null)檢查問題106 
5.2一種更好的解決方案
——Functor 106 
5.2.1包裹不安全的值107 
5.2.2 Functor定義108 
5.3使用Monad函數式地處理錯誤111 
5.3.1 Monad:從控制流到
數據流111 
5.3.2使用Maybe Monad和Either Monad來處理異常115 
5.3.3使用IO Monad與外部資源交互123 
5 .4 Monadic鍊式調用及
組合126 
5.5總結131 
第三部分函數式技能提升

第6章堅不可摧的代碼135 
6.1函數式編程對單元測試的影響136 
6.2測試命令式代碼的
困難137 
6.2.1難以識別和分解任務137 
6.2.2對共享資源的依賴會導致結果不一致138 
6.2.3按預定義順序執行139 
6.3測試函數式代碼140
6.3.1把函數當作黑盒子140 
6.3.2專注於業務邏輯,而不是控制流141 
6.3.3使用Monadic式從不純的代碼中分離出純函數142 
6.3. 4 mock外部依賴144 
6.4通過屬性測試制定規格
說明146 
6.5通過代碼覆蓋率衡量有
效性152 
6.5.1衡量函數式代碼測試的
有效性152 
6.5.2衡量函數式代碼的
複雜性155 
6.6總結158 

第7章函數式優化159 
7.1函數執行機制160 
7.1.1柯里化與函數上下文
堆棧161 
7.1.2遞歸的弱點164 
7.2使用惰性求值推遲
執行165 
7.2.1使用函數式組合子避免重複計算167 
7.2.2利用shortcut fusion 167 
7.3實現需要時調用的
策略168 
7.3.1理解記憶化169 
7.3.2記憶化計算密集型
函數169 
7.3.3有效利用柯里化與
記憶化172 
7.3.4通過分解來實現更大程度
的記憶化173 
7.3.5記憶化遞歸調用173 
7.4遞歸和尾遞歸優化175 
7.5總結178 

第8章管理異步事件以及
數據181 
8.1異步代碼的挑戰182 
8.1.1在函數之間創建時間依賴
關係182 
8.1.2陷入回調金字塔183 
8.1.3使用持續傳遞式樣186 
8.2一等公民Promise 188 
8.2.1鏈接將來的方法190 
8.2.2組合同步和異步行為195 
8.3生成惰性數據197 
8.3.1生成器與遞歸199 
8.3.2迭代器協議200
8.4使用RxJS進行函數式和響應式編程202 
8.4.1數據作為Observable 
序列202 
8.4.2函數式編程與響應式
編程203 
8.4.3 RxJS和Promise 205 
8.5總結206 
附錄本書中使用的
JavaScript庫207 
函數式JavaScript庫207 
使用的其他庫208