代碼整潔之道(第2版)

[美] 羅伯特·C. 馬丁(Robert C. Martin)

  • 出版商: 人民郵電
  • 出版日期: 2026-05-01
  • 定價: $779
  • 售價: $778
  • 語言: 簡體中文
  • 頁數: 460
  • ISBN: 7115697124
  • ISBN-13: 9787115697127
  • 相關分類: Refactoring
  • 下單後立即進貨 (約4週~6週)

  • 代碼整潔之道(第2版)-preview-1
代碼整潔之道(第2版)-preview-1

商品描述

本書系統闡述了編寫高質量軟件的核心原則與實踐。

全書分為“代碼”“設計”“架構”“匠藝”4個部分,從基礎命名、函數、測試準則,到設計的 SOLID原則、組件原則、並發編程、架構邊界,直至程序員的職業素養,構建了完整的軟件質量知識體系。本書融合了作者近年來的新思考,新增了對 AI 輔助編程的探討,強調在新時代下經典原則的持續價值。本書包含大量代碼示例與重構案例,旨在幫助讀者掌握構建易理解、易維護、易擴展代碼的具體方法,適合所有致力於提升代碼質量的軟件開發人員、架構師、技術負責人以及計算機相關專業學生閱讀參考。

作者簡介

作者:

羅伯特·C. 馬丁(Robert C. Martin),世界級軟件開發大師,設計模式和敏捷開發先驅,被後輩程序員尊稱為“鮑勃大叔”。他自1970年起從事軟件開發工作,是Uncle Bob Consulting公司的創始人,並與兒子邁卡·馬丁(Micah Martin)共同創立了Clean Coders公司。他在各類期刊和博客上發表了數百篇文章,並常受邀在國際會議上發表主題演講,著有《敏捷軟件開發》(Agile Software Development)、《代碼整潔之道》(Clean Code)、《代碼整潔之道:程序員的職業素養》(The Clean Coder)、《整潔架構之道》(Clean Architecture)、《敏捷整潔之道》(Clean Agile)、《匠藝整潔之道》(Clean Craftsmanship)、《函數式設計》(Functional Design)和《我們程序員》(We, Programmers)等多部經典著作。他曾擔任C++ Report主編3年,並且是敏捷聯盟的首任主席。

譯者:

韓磊,增強現實領域專家,新媒體和社區運營專家,技術圖書著譯者。曾任CSDN及《程序員》雜誌總編輯、原廣東二十一世紀傳媒股份有限公司新媒體事業部總經理、亮風臺(上海)信息科技有限公司產研副總裁等職。曾獨立翻譯《夢斷代碼》《C#編程風格》《代碼整潔之道》《Unix傳奇:歷史與回憶》《匠藝整潔之道》等多部技術著作,並合著《網絡媒體教程》,合譯《Beginning C# Objects:概念到代碼》《整潔代碼的藝術》。

目錄大綱

第 1 章 整潔的代碼 ........................................ 1

1.1 要有代碼 ........................................... 2

1.2 爛代碼 ............................................... 2

1.2.1 態度 ....................................... 3

1.2.2 難題 ....................................... 4

1.3 整潔代碼的藝術 ............................... 4

什麼是整潔的代碼 ........................... 5

1.4 綜述 ................................................... 6

1.4.1 代碼為什麼要整潔 ............... 6

1.4.2 生產力 .................................. 7

1.4.3 宜居性 .................................. 9

1.5 讀比寫多 ......................................... 10

1.6 童子軍軍規 ..................................... 11

 

第一部分 代 碼

第 2 章 清潔那些代碼! .............................. 13

2.1 清潔過程 ......................................... 21

2.2 小結 ................................................. 26

2.3 附記:未來的鮑勃體驗 Grok3 ...... 26

2.4 附記小結 ......................................... 28

第 3 章 首要原則 .......................................... 29

3.1 一切都要短小、命名得當、組織有序且排序合理 ............................. 29

函數 ................................................. 30

3.2 更明顯的例子 ................................. 31

獨立部署 ......................................... 48

3.3 最後的思考 ..................................... 49

第 4 章 有意義的名稱 .................................. 50

4.1 使用表意明確的名稱 ..................... 51

4.1.1 構建命名體系 ..................... 51

4.1.2 避免誤導 ............................. 53

4.1.3 做有意義的區分 ................. 53

4.1.4 使用讀得出來的名稱 ......... 54

4.1.5 使用可搜索的名稱 ............. 55

4.1.6 使用長度適宜的名稱 ......... 56

4.1.7 避免使用編碼..................... 57

4.1.8 使用恰當的詞性 ................. 58

4.1.9 考慮關鍵詞參數 ................. 59

4.1.10 別玩兒梗 .......................... 59

4.1.11 每個概念對應一個詞 ....... 60

4.1.12 使用源自解決方案領域的名稱 .................................. 60

4.1.13 使用源自所涉問題領域的名稱 .................................. 60

4.1.14 添加有意義的上下文 ....... 61

4.1.15 不要添加沒用的上下文 .................................. 62

4.2 小結 ................................................. 63

第 5 章 註釋 .................................................. 64

5.1 彌補失敗 ......................................... 64

5.1.1 隱藏或被遮掩的註釋 ......... 65

5.1.2 撒謊的註釋 ........................ 65

5.1.3 過於細節化的註釋 ............. 66

5.1.4 註釋不能美化爛代碼 ......... 66

5.1.5 用代碼闡釋意圖 ................. 66

5.2 好註釋 ............................................. 67

5.2.1 法律信息 ............................. 67

5.2.2 信息量充足的註釋 ............. 67

5.2.3 解釋意圖 ............................. 68

5.2.4 警示後果 ............................. 69

5.2.5 強調 ..................................... 70

5.2.6 公共 API中的Javadoc及同類文檔 ............................. 70

5.3 爛註釋 ............................................. 70

5.3.1 喃喃自語 ............................. 71

5.3.2 多余的註釋 ......................... 71

5.3.3 誤導性註釋 ......................... 72

5.3.4 冗余和不精確 ..................... 72

5.3.5 循規式註釋 ......................... 74

5.3.6 日誌式註釋 ......................... 75

5.3.7 噪聲註釋 ............................. 75

5.3.8 可怕的噪聲 ......................... 77

5.3.9 TODO 註釋 .......................... 77

5.3.10 能用函數或變量就不用註釋 ................................... 78

5.3.11 位置標記 ........................... 78

5.3.12 歸屬與署名 ....................... 78

5.3.13 被註釋掉的代碼 ............... 78

5.3.14 HTML 註釋 ....................... 79

5.3.15 非本地信息 ....................... 80

5.3.16 信息過多 ........................... 80

5.3.17 不明顯的關聯 ................... 80

5.3.18 函數頭部註釋 ................... 81

5.3.19 非公共代碼中的Javadoc .............................. 81

5.3.20 示例 ................................... 81

5.4 小結 ................................................. 84

第 6 章 規範代碼格式 .................................. 85

6.1 規範代碼格式的目的 ..................... 86

6.2 縱向格式 ......................................... 86

6.2.1 概念間的縱向留白 ............. 87

6.2.2 縱向緊密度 ........................ 88

6.2.3 縱向距離 ............................ 88

6.2.4 變量聲明 ............................ 89

6.2.5 相關函數 ............................ 90

6.2.6 概念關聯性 ........................ 92

6.3 橫向格式 ......................................... 92

6.3.1 橫向留白與緊密度 ............. 93

6.3.2 橫向對齊 ............................ 94

6.3.3 縮進 .................................... 95

6.3.4 違反縮進規則..................... 96

6.4 團隊規則 ......................................... 97

6.5 鮑勃大叔的代碼格式規則 ............. 97

第 7 章 整潔的函數 ...................................... 99

7.1 短小! ............................................100

7.1.1 好散文 ...............................100

7.1.2 每個函數一個抽象層級 ....101

7.2 自頂向下讀代碼:下梯規則 ........101

糾纏 ...............................................103

7.3 switch 語句 ................................103

7.4 深入探討整潔的函數 ....................104

7.4.1 上下文相關 .......................105

7.4.2 可命名 ...............................106

7.4.3 被隔離 ...............................108

7.4.4 同質 ................................... 110

7.4.5 純一 ................................... 111

7.4.6 部分純一性 ....................... 113

7.5 小結 ................................................114

第 8 章 關於函數的經驗之談 .....................115

8.1 函數參數 ........................................115

8.1.1 可變參數 ........................... 116

8.1.2 參數多於 3 個? ................ 116

8.1.3 關鍵字參數 ....................... 117

8.1.4 標識參數 ........................... 117

8.1.5 輸出參數 ........................... 118

8.1.6 錯誤碼 ............................... 119

8.2 命令-查詢分離 ............................. 119

8.3 使用異常替代返回錯誤碼 ........... 120

8.3.1 責任自負 ........................... 120

8.3.2 抽離try/cache代碼塊 .... 121

8.3.3 錯誤處理就是一件事 ....... 122

8.3.4 錯誤碼的依賴磁鐵 ........... 122

8.4 DRY:別重復自己 ....................... 123

8.4.1 簡單重復的代碼 ............... 123

8.4.2 相似代碼塊 ....................... 124

8.4.3 循環重復 ........................... 127

8.4.4 偶合重復與本質重復 ....... 129

8.5 副作用 ........................................... 130

8.5.1 力有未逮 ........................... 130

8.5.2 函數式編程語言 ............... 131

8.5.3 面向對象編程語言 ........... 132

8.6 結構化編程 ................................... 133

8.6.1 順序結構 ........................... 134

8.6.2 選擇結構 ........................... 134

8.6.3 循環結構 ........................... 134

8.7 太多應牢記的事 ........................... 135

8.8 小結 ............................................... 135

第 9 章 整潔的方法 .................................... 136

9.1 把它改好 ....................................... 137

9.2 示例 ............................................... 138

考慮設計與架構 ........................... 150

9.3 小結 ............................................... 155

第 10 章 只做一件事 .................................. 156

10.1 提取方法重構 ............................. 157

不應置疑 ..................................... 158

10.2 到底什麼是巨大函數 ................. 161

提取與類 ..................................... 174

10.3 小結 ............................................. 178

第 11 章 保持得體 ...................................... 179

11.1 報紙隱喻 ..................................... 180

保持得體 ......................................181

11.2 再談下梯規則 ..............................182

11.3 抽象過山車 ..................................183

11.4 這麼寫,但不想這麼讀 ..............183

第 12 章 對象與數據結構 ...........................184

12.1 何為對象 ......................................185

12.2 數據抽象 ......................................185

12.3 數據/對象的反對稱性 .................187

12.4 得墨忒耳律 ..................................189

12.4.1 火車失事 ........................189

12.4.2 混合結構 ........................190

12.4.3 隱藏結構 ........................190

12.5 數據傳輸對象 ..............................191

12.5.1 對象/關系“阻抗不匹配” ............................192

12.5.2 使用對象和數據結構 .....192

12.6 switch 語句 ..............................193

12.6.1 面向對象解決方案 ........195

12.6.2 別高興得太早 ................196

12.7 選擇面向對象還是選擇過程式 ..............................................196

12.8 性能怎麼辦 ..................................197

12.9 小結 ..............................................197

第 13 章 整潔的類 .......................................198

13.1 類和模塊與文件對比 ..................198

13.2 類應該包含什麼 ..........................199

13.2.1 類設計的特征 ................199

13.2.2 經驗與特征 ....................200

13.2.3 類什麼時候算過大 ........201

13.2.4 代碼中的策略 ................203

13.2.5 變更理由隱藏之處 ........203

13.2.6 修正問題 ........................204

13.2.7 一種過度開放的實現 ....206

13.2.8 該做點什麼嗎 ................207

13.2.9 現在怎麼辦 ....................207

13.2.10 閉合、高內聚、單一職責的類 ..................... 210

13.2.11 策略改變時 .................. 211

13.2.12 這算過度工程化嗎 ...... 212

13.2.13 更簡單的測試 ............. 212

13.2.14 接入 AI ........................ 213

13.2.15 它會犯錯 ..................... 214

第 14 章 測試準則 ...................................... 215

14.1 準則 1:測試驅動的開發(TDD) ....................................... 216

TDD三法則 ................................ 216

14.2 準則 2:測試&&提交||回退(TCR) ........................................ 217

14.3 準則 3:小規模增量開發 .......... 218

14.4 設計 ............................................. 218

14.5 準則 ............................................. 219

14.5.1 枯燥、煩瑣且低效........ 219

14.5.2 調試 ............................... 219

14.5.3 文檔 ............................... 219

14.5.4 可靠性 ........................... 220

14.5.5 設計 ............................... 221

14.5.6 總結回顧 ....................... 221

14.5.7 天使與惡魔 ................... 221

14.5.8 馴服心魔 ....................... 222

14.5.9 復雜情況與漏洞 ........... 222

14.5.10 代價與影響 ................. 223

14.6 保持測試整潔 ............................. 223

14.7 測試賦能 ......................................224

第 15 章 整潔的測試 ...................................225

15.1 用於測試的領域特定語言 ..........228

15.1.1 組合斷言 ........................228

15.1.2 組合測試結果 ................228

15.1.3 雙重標準 ........................229

15.1.4 單一斷言規則 ................230

15.1.5 單一執行規則 ................230

15.2 F.I.R.S.T. ......................................230

15.2.1 快速 ................................230

15.2.2 獨立 ................................231

15.2.3 可重復 ............................231

15.2.4 自驗證 ............................231

15.2.5 及時 ................................231

15.3 測試設計 ......................................231

15.4 小結 ..............................................232

第 16 章 驗收測試 .......................................233

16.1 驗收測試準則 ..............................233

16.1.1 準則 ................................235

16.1.2 持續構建 ........................235

16.2 小結 ..............................................235

第 17 章 AI、LLM 和天知道還有啥東西 ................................................236

17.1 用提示詞編程 ..............................237

17.1.1 起步階段 ........................241

17.1.2 鬥膽盲猜 ........................241

17.2 小結 ..............................................244

 

第二部分 設 計

第 18 章 簡單設計 ...................................... 246

18.1 YAGNI ......................................... 247

18.2 測試覆蓋 ..................................... 247

18.2.1 漸進目標 ....................... 248

18.2.2 設計? ........................... 248

18.3 揭示意圖 ..................................... 248

18.3.1 底層抽象 ........................250

18.3.2 測試:問題的後半部分 ...250

18.4 最小化重復 ..................................251

偶合重復 ......................................251

18.5 最小化規模 ..................................252

簡單設計 ......................................252

第 19 章 SOLID 原則 ................................. 253

19.1 SRP:單一職責原則 .................. 254

19.1.1 偶合重復 ....................... 255

19.1.2 解決方案 ....................... 256

19.1.3 更高層級 ....................... 257

19.2 OCP:開放-閉合原則 ................ 257

19.2.1 思想實驗 ....................... 257

19.2.2 方向控制 ....................... 260

19.2.3 信息隱藏 ....................... 260

19.2.4 小結 ............................... 260

19.3 LSP:裏氏替換原則 .................. 260

19.3.1 LSP 與設計 .................... 261

19.3.2 出租車調度聚合平臺 ..... 262

19.4 ISP:接口分離原則 .................... 263

19.4.1 ISP 與編程語言 ............. 263

19.4.2 ISP 與設計 ..................... 264

19.5 DIP:依賴倒置原則 ................... 264

19.5.1 穩定抽象 ....................... 266

19.5.2 工廠模式 ....................... 266

19.5.3 具體組件 ....................... 267

第 20 章 組件原則 ...................................... 268

20.1 組件 ............................................. 268

20.2 組件簡史 ..................................... 269

20.2.1 可重定位 ....................... 270

20.2.2 連接器 ........................... 271

20.3 組件內聚性 ................................. 272

20.3.1 REP:復用/發布等價原則 ............................... 272

20.3.2 CCP:共同封閉原則 ..... 273

20.3.3 CRP:共同復用原則 ..... 274

20.3.4 組件內聚性張力圖 ....... 275

20.3.5 小結 ............................... 276

20.4 組件耦合 ..................................... 276

20.4.1 ADP:無循環依賴原則 ............................... 276

20.4.2 SDP:穩定依賴原則 .....280

20.4.3 SAP:穩定抽象原則 .....284

20.5 小結 ..............................................287

第 21 章 持續設計 .......................................288

21.1 持續變更 ......................................289

21.2 持續設計 ......................................290

21.3 航行於持續設計的4C考量之上 ..............................................290

21.3.1 清晰性 ............................291

21.3.2 簡潔性 ............................295

21.3.3 可驗證性 ........................301

21.3.4 內聚性 ............................309

21.4 還需要在何時進行設計 ..............312

21.4.1 設計前置 ........................312

21.4.2 為工作做準備 ................312

21.4.3 開始工作 ........................313

21.4.4 做工作 ............................313

第 22 章 並發編程 .......................................314

22.1 為什麼要並發 ..............................315

22.1.1 傳言與誤解 ...................316

22.1.2 挑戰 ...............................316

22.2 並發防禦原則 ..............................317

22.2.1 單一職責原則 ...............317

22.2.2 推論:限制數據的作用域 ............................317

22.2.3 推論:使用數據副本 .....317

22.2.4 推論:線程應盡可能獨立 ................................318

22.3 了解你使用的語言和庫 ..............318

線程安全工具集 ..........................318

22.4 了解執行模型 ..............................319

22.4.1 生產者-消費者模型 .......319

22.4.2 讀者-寫者模型 .............320

22.4.3 哲學家進餐問題 ...........320

22.5 警惕同步方法之間的依賴 ..........320

22.6 保持同步區短小 ......................... 321

22.7 正確的啟動代碼和關閉代碼難以編寫 ..................................... 321

22.8 測試線程代碼 ............................. 321

22.8.1 將偶發失敗看作潛在的線程問題 ....................... 322

22.8.2 先讓非線程代碼工作 ............................... 322

22.8.3 編寫可插拔的線程代碼 ............................... 322

22.8.4 編寫可調優的線程代碼 ................................323

22.8.5 運行比處理器數量多的線程 ................................323

22.8.6 在不同平臺上運行 .......323

22.8.7 安插試錯代碼,嘗試並強制代碼失敗 ...............323

22.9 2025 年實戰更新及報告 .............325

數據完整性 ..................................325

22.10 小結 ............................................329

 

第三部分 架 構

第 23 章 軟件的兩大價值 .......................... 331

保留可能性 ............................................ 331

第 24 章 獨立性 .......................................... 333

24.1 用例 ............................................. 334

24.2 運行 ............................................. 334

24.3 開發 ............................................. 334

24.4 部署 ............................................. 335

24.5 保留可能性 ................................. 335

第 25 章 架構的邊界 .................................. 336

25.1 何時劃定邊界,劃定怎樣的邊界 ............................................. 337

25.2 插件架構 ..................................... 338

25.3 案例研究:FitNesse ................... 339

25.4 小結 ............................................. 340

第 26 章 整潔的邊界 .................................. 341

26.1 第三方物聯網框架:諸多邊界 ............................................. 341

26.2 用戶界面/應用邊界 .....................345

26.2.1 SOLID 原則與六邊形架構 ................................347

26.2.2 探索和學習邊界 ...........349

26.2.3 使用尚不存在的代碼 .....351

26.3 整潔的邊界 ..................................352

第 27 章 整潔的架構 ...................................353

27.1 依賴規則 ......................................354

27.1.1 實體層 ...........................355

27.1.2 用例層 ...........................355

27.1.3 接口適配層 ...................355

27.1.4 框架與驅動層 ...............355

27.1.5 只有4個圈層嗎 ...........356

27.1.6 跨越邊界 .......................356

27.1.7 什麼數據會跨越邊界 .....356

27.1.8 典型場景 .......................356

27.2 小結 ..............................................357

 

第四部分 匠 藝

“大量” .................................................. 359

80 多年 ................................................... 359

書呆子與救世主 ......................... 362

名聲 ............................................. 362

榜樣與惡棍 ..................................363

我們“主宰”世界 ......................364

災難 ..............................................365

程序員誓言 .............................................366

第 28 章 有害 .............................................. 367

28.1 對社會無害 ................................. 368

28.2 對功能無害 ................................. 369

28.3 對結構無害 ................................. 370

28.4 柔性 ............................................. 371

28.5 測試 ............................................. 372

第 29 章 不損害軟件行為或結構 .............. 373

29.1 把它改好 ..................................... 374

29.1.1 什麼是好結構 ............... 374

29.1.2 艾森豪威爾決策矩陣 ..... 375

29.2 程序員是利益相關者 ................. 376

29.3 盡己所能 ..................................... 377

第 30 章 可重復證據 .................................. 379

30.1 迪傑斯特拉 ................................. 379

證明正確性 ................................. 380

30.2 結構化編程 ................................. 381

30.3 功能分解 ..................................... 383

30.4 TDD 及同類準則 ........................ 383

第 31 章 小周期 .......................................... 385

31.1 源碼控制史 ................................. 385

31.1.1 打孔卡 ........................... 385

31.1.2 持續集成 ....................... 389

31.1.3 短周期 ........................... 389

31.2 持續集成 ..................................... 390

31.3 分支與功能開關 ......................... 390

31.4 持續部署 ..................................... 392

31.5 持續構建 ..................................... 393

第 32 章 持續打磨 ...................................... 394

32.1 測試覆蓋率 ................................. 394

32.2 變異測試 ..................................... 395

32.3 語義穩定性 ................................. 395

32.4 清潔 ............................................. 396

32.5 創作成果 ......................................396

第 33 章 保持高生產力 ...............................397

33.1 黏性 ..............................................397

33.1.1 構建 ...............................398

33.1.2 測試 ...............................398

33.1.3 調試 ...............................399

33.1.4 部署 ...............................399

33.2 幹擾管理 ......................................399

33.2.1 會議 ...............................399

33.2.2 音樂 ...............................400

33.2.3 心情 ...............................400

33.2.4 心流 ...............................401

33.3 時間管理 ......................................401

第 34 章 團隊協作 .......................................403

34.1 協同編程 ......................................403

34.2 開放式辦公室/虛擬辦公室 .........404

第 35 章 靠譜和合理地估算 .......................405

35.1 謊言 ..............................................405

35.2 靠譜、準確、精確 ......................406

35.3 我的教訓 ......................................406

35.3.1 故事 1:向量 ................406

35.3.2 故事 2:pCCU ..............408

35.3.3 教訓 ...............................408

35.4 準確性與精確性 ..........................409

35.5 匯總 ..............................................410

35.6 靠譜 ..............................................410

35.7 壓力 ..............................................411

第 36 章 尊重程序員同行 ...........................412

第 37 章 永不停止學習 ...............................413

後記 .................................................................415

附錄 A 激辯《代碼整潔之道》..................419

參考文獻 .........................................................460