函數(shù)式設(shè)計:原則、模式與實踐(英文版) [美]羅伯特·C.馬丁
定 價:129 元
當前圖書已被 2 所學校薦購過!
查看明細
- 作者:[美]羅伯特·C.馬丁
- 出版時間:2024/10/1
- ISBN:9787111760627
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP312.8JA
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:32開
本書是一本向程序員介紹如何有效使用函數(shù)式編程語言的實用指南。它側(cè)重于現(xiàn)實世界中的應(yīng)用,避免深入探討Monads、Monoids、Functors和Categories等理論方面的內(nèi)容,因為這些內(nèi)容已經(jīng)集成到常用語言、庫和框架中。相反,本書強調(diào)如何以及為什么要在日常軟件開發(fā)中使用函數(shù)式編程,書中比較了Java等面向?qū)ο笳Z言和Clojure等函數(shù)式語言的編碼結(jié)構(gòu)。之所以選擇這些語言,是因為它們使用廣泛(Java)且簡單(Clojure)。 本書還重點描述了用函數(shù)式方法構(gòu)建系統(tǒng)的設(shè)計和架構(gòu)原則,書中使用了統(tǒng)一建模語言(Unified Modeling Language,UML)圖,并參考了軟件設(shè)計的SOLID原則、設(shè)計模式,以及整潔架構(gòu)的概念。
在本書中,著名軟件工程師Bob大叔解釋了為何使用函數(shù)式編程,以及如何做才能為客戶構(gòu)建更好的系統(tǒng)。Bob大叔將Java中傳統(tǒng)的面向?qū)ο蟮木幊探Y(jié)構(gòu)與函數(shù)式語言所支持的編程結(jié)構(gòu)進行了對比,確定了每種結(jié)構(gòu)的作用,并展示了如何明智地在合理上下文中使用兩者來構(gòu)建更好的系統(tǒng)。作風務(wù)實的Bob大叔能用最少的理論講清并解決“真刀真槍”的實戰(zhàn)問題。通過易于理解的示例,開發(fā)人員能發(fā)現(xiàn)易于學習且語義豐富的Clojure語言如何幫助他們提高代碼的整潔性、設(shè)計性、紀律性和成效性。Bob大叔還從函數(shù)式的視角研究了著名的SOLID原則和GOF設(shè)計模式,揭示了模式對于函數(shù)式程序員仍極具價值的原因,以及使用它們來實現(xiàn)卓越成效的方法。通過閱讀本書,你將能夠:?理解函數(shù)式編程基礎(chǔ):不變性、持久性數(shù)據(jù)、遞歸、迭代、惰性和狀態(tài)性;?通過精心設(shè)計的案例研究對比函數(shù)式方法和面向?qū)ο蠓椒ǎ?探索數(shù)據(jù)流的函數(shù)式設(shè)計技術(shù);?使用經(jīng)典的SOLID原則編寫更好的Clojure代碼;? 掌握實現(xiàn)函數(shù)式測試、GUI和并發(fā)性的實用方法;?在函數(shù)式編程中充分利用設(shè)計模式;?逐步構(gòu)建企業(yè)級Clojure應(yīng)用程序。
前 言
這是一本為每日編寫代碼的程序員所寫的書,目的是幫助他們了解如何使用函數(shù)式編程語言來完成實際的任務(wù)。因此,我不會花太多時間去探討函數(shù)式編程的理論,如Monads、Monoids、Functors、Categories等。這并不是說這些理論不正確、無價值或不相關(guān),而是因為它們通常不會出現(xiàn)在程序員的日常工作中。這些理論已經(jīng)與常見的語言、代碼庫和框架融為了一體。如果對函數(shù)式理論感興趣,推薦閱讀Mark Seemann的著作。
本書探討的是如何(以及為何要)在日常工作中使用函數(shù)式編程為真實的客戶構(gòu)建真實的系統(tǒng)。接下來我們將比較下面兩種常見的代碼結(jié)構(gòu)——面向?qū)ο笳Z言(如Java)和函數(shù)式語言(如Clojure)。
我之所以選擇這兩種語言,是因為Java使用得非常廣泛,Clojure則極容易學習。
函數(shù)式編程和過程式編程簡史
1936年,艾倫·圖靈(Alan Turing)和阿隆佐·丘奇(Alonzo Church)這兩位數(shù)學家獨立解決了大衛(wèi)·希爾伯特(David Hilbert)所提出的著名難題之一:可判定性問題。雖然由于前言的篇幅限制,我們無法詳細描述這個問題,但只需知道這與尋找整數(shù)公式的通解有關(guān)即可。這與我們所討論的主題相關(guān),因為數(shù)字計算機中的每個程序其實都是一個整數(shù)公式。
這兩位數(shù)學家獨立地證明了這樣的通解不存在。他們證明了存在這樣的整數(shù),它們永遠不能由比該整數(shù)小的整數(shù)公式計算出來。另一種說法是,存在計算機程序無法計算的數(shù)字。實際上,這就是艾倫·圖靈所使用的方法。在1936年所發(fā)表的著名論文中,圖靈發(fā)明了一種數(shù)字計算機,并證明了即使給定無限的時間和空間,計算機也無法計算某些數(shù)字。
另外,丘奇通過他所發(fā)明的lambda演算(一種用于操作函數(shù)的數(shù)學形式化方法)得出了同樣的結(jié)論。通過對形式化方法邏輯的操作,他證明了存在無法解決的邏輯問題。
圖靈的發(fā)明是所有現(xiàn)代數(shù)字計算機的前身。所有數(shù)字計算機實際上都是一臺(有限)圖靈機。所有在數(shù)字計算機上執(zhí)行的程序?qū)嶋H上都是一個圖靈機程序。
丘奇和圖靈后來合作證明了他們倆的方法是等價的。圖靈機中的每一個程序都可以用lambda演算來表示。反之亦然。
所有的函數(shù)式編程實際上都是lambda演算。
這兩種編程風格在數(shù)學上是等價的。任何程序都可以使用過程式風格(圖靈)或函數(shù)式風格(丘奇)來編寫。本書要探討的不是這種等價性,而是如何使用函數(shù)式方法影響程序的結(jié)構(gòu)和設(shè)計。我們將試圖確定函數(shù)式方法產(chǎn)生的結(jié)構(gòu)和設(shè)計是否優(yōu)于或劣于使用過程式方法所產(chǎn)生的結(jié)構(gòu)和設(shè)計。
關(guān)于Clojure
本書選擇Clojure是因為學習新語言比較難,如果同時學習新范式的話,更是難上加難。因此,為了簡化學習任務(wù),我選擇了一門既足夠簡單又能夠讓我們學習函數(shù)式編程和函數(shù)式設(shè)計的語言。
Clojure語義豐富且語法簡單。語法簡單意味著學習起來比較輕松。學習Clojure的難點都在語義方面。雖然代碼庫和習慣用法需要很大的努力去內(nèi)化,但學習語言本身幾乎不費力氣。希望本書能提供一種學習和欣賞函數(shù)式編程的方法,其間不會讓大家因新語言的語法而分心。
話雖如此,但本書并不是Clojure教程。在前幾章中,我會解釋一些Clojure的基礎(chǔ)知識并使用一些解釋性的腳注。同時,也期望親愛的讀者去做功課并查找相關(guān)資料。有幾個很好的網(wǎng)站可供查詢,我最喜歡的網(wǎng)站是https://clojure.org/api/cheatsheet。
本書會使用speclj測試框架。隨著內(nèi)容的展開,測試代碼會越來越多。它與其他受歡迎的測試框架非常相似,因此在閱讀過程中,熟悉它的各種功能并不難。
關(guān)于架構(gòu)和設(shè)計
本書的重點是描述用函數(shù)式方法構(gòu)建的系統(tǒng)的設(shè)計和架構(gòu)原則。為此,我將使用統(tǒng)一建模語言(Unified Modeling Language,UML)圖,并參考軟件設(shè)計的SOLID原則、設(shè)計模式,以及整潔架構(gòu)的概念。不用擔心,書中會解釋這些概念,并引用許多外部參考資料供你查閱。
關(guān)于面向?qū)ο?br />許多人都認為,面向?qū)ο缶幊毯秃瘮?shù)式編程互不兼容。本書應(yīng)該能夠證明事實并非如此。本書中的程序、設(shè)計和架構(gòu)是函數(shù)式和面向?qū)ο蟾拍畹娜诤象w。根據(jù)經(jīng)驗,我堅定地認為,這兩種風格是完全兼容的。好的程序員可以并且應(yīng)該將兩者兼收并蓄,相互為用。
關(guān)于“函數(shù)式”
本書會使用“函數(shù)式”這個術(shù)語,并對其進行定義和闡述。隨著內(nèi)容的展開,我也會對這個概念做一些修正。有些例子雖然是用函數(shù)式語言和函數(shù)式風格編寫的,但并不是純粹的函數(shù)式。在大多數(shù)情況下,我會為“函數(shù)式”這個詞加上引號,并使用腳注指出所做的修正。
為何要做修正?因為本書強調(diào)的是實用,而非理論。從函數(shù)式風格中獲得好處(而不是嚴格遵循理論)會更有趣。正如我們將在第1章中看到的,接受用戶提供的輸入?yún)?shù)的“函數(shù)”并不是純粹的函數(shù)式,但本書會在需要實用性的地方使用這樣的“函數(shù)”。
本書所有示例的源代碼都存放在一個GitHub倉庫中,地址為https://github.com/unclebob/FunctionalDesign。
羅伯特·C. 馬。˙ob大叔)
世界著名編程大師,敏捷開發(fā)和設(shè)計模式先驅(qū),從事軟件開發(fā)相關(guān)工作超過50年。他是“SOLID五大原則”的奠基人、“敏捷宣言”聯(lián)合簽署人、“敏捷聯(lián)盟”首任主席、C++ Report雜志前主編。他發(fā)表了大量有影響力的文章,并經(jīng)常受邀在許多國際軟件大會上發(fā)表演講。他創(chuàng)立了Uncle Bob Consulting有限責任公司,并與兒子Micah Martin共同創(chuàng)立了Clean Coders有限責任公司。他還是Clean Code、Clean Architecture和The Clean Coder等多本暢銷書籍的作者。
目 錄
第一部分 函數(shù)式基礎(chǔ)
第1章 不變性3
什么是函數(shù)式編程4
賦值的問題7
為什么叫它“函數(shù)式”10
沒有狀態(tài)改變嗎12
不變性概念15
第2章 持久性數(shù)據(jù)17
關(guān)于瞞天過海19
制作副本20
結(jié)構(gòu)共享23
第3章 遞歸和迭代27
迭代28
極簡Clojure教程29
迭代概述32
TCO、Clojure和JVM32
遞歸32
第4章 惰性37
惰性累積40
為何需要惰性41
尾聲42
第5章 狀態(tài)性43
何時必須“可變”47
軟件事務(wù)內(nèi)存48
生活不易,軟件更難51
第二部分 比較性分析
第6章 質(zhì)因數(shù)練習55
Java版56
Clojure版60
總結(jié)63
第7章 保齡球練習65
Java版66
Clojure版71
總結(jié)75
第8章 八卦公交司機練習77
Java版78
公交司機文件84
行車線路文件85
公交車站文件85
八卦故事文件86
模擬過程文件87
Clojure版88
總結(jié)93
第9章 面向?qū)ο缶幊?5
函數(shù)式工資問題解決方案98
命名空間與源文件107
總結(jié)108
第10章 類型109
第三部分 函數(shù)式設(shè)計
第11章 數(shù)據(jù)流117
第12章 SOLID125
單一職責原則126
開閉原則131
函數(shù)133
帶虛表的對象134
多重方法135
獨立部署136
里氏替換原則138
ISA原則142
這不對145
代表原則146
接口隔離原則147
不需要就別依賴150
為什么151
總結(jié)151
依賴倒置原則152
回憶殺155
違背依賴倒置原則165
總結(jié)179
第四部分 函數(shù)式實用主義
第13章 測試183
REPL184
Mock184
基于性質(zhì)的測試186
診斷技術(shù)190
函數(shù)式197
第14章 GUI199
用Quil進行海龜繪圖200
第15章 并發(fā)性215
總結(jié)225
第五部分 設(shè)計模式
第16章 設(shè)計模式回顧229
函數(shù)式編程中的模式233
抽象服務(wù)器模式233
適配器模式236
那真的是適配器對象嗎241
命令模式242
撤銷245
組合模式249
函數(shù)式254
裝飾器模式260
訪問者模式264
To Close or to Clojure267
90°問題270
抽象工廠模式274
90°問題重現(xiàn)279
類型安全嗎281
總結(jié)281
補充:面向?qū)ο笫嵌舅巻?82
第六部分 案例研究
第17章 Wa-Tor小游戲287
如鯁在喉309
解決問題312
讓魚瘋狂繁殖322
對于鯊魚324
總結(jié)335
后記337
索引341