代碼整潔之道(第2版)
[美] 羅伯特·C. 馬丁(Robert C. Martin)
- 出版商: 人民郵電
- 出版日期: 2026-05-01
- 定價: $779
- 售價: $778
- 語言: 簡體中文
- 頁數: 460
- ISBN: 7115697124
- ISBN-13: 9787115697127
-
相關分類:
Refactoring
下單後立即進貨 (約4週~6週)
商品描述
本書系統闡述了編寫高質量軟件的核心原則與實踐。
全書分為“代碼”“設計”“架構”“匠藝”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

