[程式碼整潔之道].(美)馬丁.掃描版pdf
阿新 • • 發佈:2019-01-04
第1章 整潔程式碼 1
1.1 要有程式碼 2
1.2 糟糕的程式碼 2
1.3 混亂的代價 3
1.3.1 華麗新設計 4
1.3.2 態度 4
1.3.3 迷題 5
1.3.4 整潔程式碼的藝術 5
1.3.5 什麼是整潔程式碼 6
1.4 思想流派 10
1.5 我們是作者 11
1.6 童子軍軍規 12
1.7 前傳與原則 12
1.8 小結 12
1.9 文獻 13
第2章 有意義的命名 15
2.1 介紹 15
2.2 名副其實 16
2.3 避免誤導 17
2.4 做有意義的區分 18
2.5 使用讀得出來的名稱 19
2.6 使用可搜尋的名稱 20
2.7 避免使用編碼 21
2.7.1 匈牙利語標記法 21
2.7.2 成員字首 21
2.7.3 介面和實現 22
2.8 避免思維對映 22
2.9 類名 23
2.10 方法名 23
2.11 別扮可愛 23
2.12 每個概念對應一個詞 24
2.13 別用雙關語 24
2.14 使用解決方案領域名稱 25
2.15 使用源自所涉問題領域的名稱 25
2.16 新增有意義的語境 25
2.17 不要新增沒用的語境 27
2.18 最後的話 27
第3章 函式 29
3.1 短小 32
3.2 只做一件事 33
3.3 每個函式一個抽象層級 34
3.4 switch語句 35
3.5 使用描述性的名稱 36
3.6 函式引數 37
3.6.1 一元函式的普遍形式 38
3.6.2 標識引數 38
3.6.3 二元函式 38
3.6.4 三元函式 39
3.6.5 引數物件 39
3.6.6 引數列表 40
3.6.7 動詞與關鍵字 40
3.7 無副作用 40
3.8 分隔指令與詢問 42
3.9 使用異常替代返回錯誤碼 42
3.9.1 抽離Try/Catch程式碼塊 43
3.9.2 錯誤處理就是一件事 44
3.9.3 Error.java依賴磁鐵 44
3.10 別重複自己 44
3.11 結構化程式設計 45
3.12 如何寫出這樣的函式 45
3.13 小結 45
3.14 SetupTeardownIncluder程式 46
3.15 文獻 48
第4章 註釋 49
4.1 註釋不能美化糟糕的程式碼 50
4.2 用程式碼來闡述 51
4.3 好註釋 51
4.3.1 法律資訊 51
4.3.2 提供資訊的註釋 51
4.3.3 對意圖的解釋 52
4.3.4 闡釋 53
4.3.5 警示 53
4.3.6 TODO註釋 54
4.3.7 放大 54
4.3.8 公共API中的Javadoc 55
4.4 壞註釋 55
4.4.1 喃喃自語 55
4.4.2 多餘的註釋 56
4.4.3 誤導性註釋 58
4.4.4 循規式註釋 58
4.4.5 日誌式註釋 59
4.4.6 廢話註釋 59
4.4.7 可怕的廢話 61
4.4.8 能用函式或變數時就別用註釋 62
4.4.9 位置標記 62
4.4.10 括號後面的註釋 62
4.4.11 歸屬與署名 63
4.4.12 註釋掉的程式碼 63
4.4.13 HTML註釋 64
4.4.14 非本地資訊 64
4.4.15 資訊過多 65
4.4.16 不明顯的聯絡 65
4.4.17 函式頭 66
4.4.18 非公共程式碼中的Javadoc 66
4.4.19 範例 66
4.5 文獻 69
第5章 格式 71
5.1 格式的目的 72
5.2 垂直格式 72
5.2.1 向報紙學習 73
5.2.2 概念間垂直方向上的區隔 73
5.2.3 垂直方向上的靠近 74
5.2.4 垂直距離 75
5.2.5 垂直順序 79
5.3 橫向格式 79
5.3.1 水平方向上的區隔與靠近 80
5.3.2 水平對齊 81
5.3.3 縮排 82
5.3.4 空範圍 84
5.4 團隊規則 84
5.5 鮑勃大叔的格式規則 85
第6章 物件和資料結構 87
6.1 資料抽象 87
6.2 資料、物件的反對稱性 89
6.3 得墨忒耳律 91
6.3.1 火車失事 91
6.3.2 混雜 92
6.3.3 隱藏結構 92
6.4 資料傳送物件 93
6.5 小結 94
6.6 文獻 94
第7章 錯誤處理 95
7.1 使用異常而非返回碼 96
7.2 先寫Try-Catch-Finally語句 97
7.3 使用不可控異常 98
7.4 給出異常發生的環境說明 99
7.5 依呼叫者需要定義異常類 99
7.6 定義常規流程 100
7.7 別返回null值 101
7.8 別傳遞null值 102
7.9 小結 103
7.10 文獻 104
第8章 邊界 105
8.1 使用第三方程式碼 106
8.2 瀏覽和學習邊界 107
8.3 學習log4j 108
8.4 學習性測試的好處不只是免費 110
8.5 使用尚不存在的程式碼 110
8.6 整潔的邊界 111
8.7 文獻 112
第9章 單元測試 113
9.1 TDD三定律 114
9.2 保持測試整潔 115
9.3 整潔的測試 116
9.3.1 面向特定領域的測試語言 118
9.3.2 雙重標準 119
9.4 每個測試一個斷言 121
9.5 F.I.R.S.T. 122
9.6 小結 123
9.7 文獻 124
第10章 類 125
10.1 類的組織 126
10.2 類應該短小 126
10.2.1 單一權責原則 128
10.2.2 內聚 129
10.2.3 保持內聚性就會得到許多短小的類 130
10.3 為了修改而組織 136
10.4 文獻 139
第11章 系統 141
11.1 如何建造一個城市 142
11.2 將系統的構造與使用分開 142
11.2.1 分解main 143
11.2.2 工廠 143
11.2.3 依賴注入 144
11.3 擴容 145
11.4 Java代理 148
11.5 純Java AOP框架 150
11.6 AspectJ的方面 152
11.7 測試驅動系統架構 153
11.8 優化決策 154
11.9 明智使用添加了可論證價值的標準 154
11.10 系統需要領域特定語言 154
11.11 小結 155
11.12 文獻 155
第12章 迭進 157
12.1 通過迭進設計達到整潔目的 157
12.2 簡單設計規則1:執行所有測試 158
12.3 簡單設計規則2~4:重構 158
12.4 不可重複 159
12.5 表達力 161
12.6 儘可能少的類和方法 162
12.7 小結 162
12.8 文獻 162
第13章 併發程式設計 163
13.1 為什麼要併發 164
13.2 挑戰 165
13.3 併發防禦原則 166
13.3.1 單一權責原則 166
13.3.2 推論:限制資料作用域 166
13.3.3 推論:使用資料複本 167
13.3.4 推論:執行緒應儘可能地獨立 167
13.4 瞭解Java庫 167
13.5 瞭解執行模型 168
13.5.1 生產者-消費者模型 169
13.5.2 讀者-作者模型 169
13.5.3 宴席哲學家 169
13.6 警惕同步方法之間的依賴 169
13.7 保持同步區域微小 170
13.8 很難編寫正確的關閉程式碼 170
13.9 測試執行緒程式碼 171
13.9.1 將偽失敗看作可能的執行緒問題 171
13.9.2 先使非執行緒程式碼可工作 171
13.9.3 編寫可插拔的執行緒程式碼 172
13.9.4 編寫可調整的執行緒程式碼 172
13.9.5 執行多於處理器數量的執行緒 172
13.9.6 在不同平臺上執行 172
13.9.7 裝置試錯程式碼 173
13.9.8 硬編碼 173
13.9.9 自動化 174
13.10 小結 175
13.11 文獻 175
第14章 逐步改進 176
14.1 Args的實現 177
14.2 Args:草稿 183
14.2.1 所以我暫停了 195
14.2.2 漸進 195
14.3 字串引數 197
14.4 小結 234
第15章 JUnit內幕 235
15.1 JUnit框架 236
15.2 小結 249
第16章 重構SerialDate 251
16.1 首先,讓它能工作 252
16.2 讓它做對 254
16.3 小結 266
16.4 文獻 267
第17章 味道與啟發 269
17.1 註釋 270
17.2 環境 271
17.3 函式 271
17.4 一般性問題 272
17.5 Java 288
17.6 名稱 291
17.7 測試 294
17.8 小結 295
17.9 文獻 296
附錄A 併發程式設計II 297
A.1 客戶端/伺服器的例子 297
A.1.1 伺服器 297
A.1.2 新增執行緒程式碼 298
A.1.3 觀察伺服器端 299
A.1.4 小結 301
A.2 執行的可能路徑 301
A.2.1 路徑數量 302
A.2.2 深入挖掘 303
A.2.3 小結 305
A.3 瞭解類庫 305
A.3.1 Executor框架 305
A.3.2 非鎖定的解決方案 306
A.3.3 非執行緒安全類 307
A.4 方法之間的依賴可能破壞併發程式碼 308
A.4.1 容忍錯誤 309
A.4.2 基於客戶程式碼的鎖定 309
A.4.3 基於服務端的鎖定 311
A.5 提升吞吐量 312
A.5.1 單執行緒條件下的吞吐量 313
A.5.2 多執行緒條件下的吞吐量 313
A.6 死鎖 314
A.6.1 互斥 315
A.6.2 上鎖及等待 315
A.6.3 無搶先機制 315
A.6.4 迴圈等待 315
A.6.5 不互斥 316
A.6.6 不上鎖及等待 316
A.6.7 滿足搶先機制 317
A.6.8 不做迴圈等待 317
A.7 測試多執行緒程式碼 317
A.8 測試執行緒程式碼的工具支援 320
A.9 小結 320
A.10 教程:完整程式碼範例 321
A.10.1 客戶端/伺服器非執行緒程式碼 321
A.10.2 使用執行緒的客戶端/伺服器程式碼 324
附錄B org.jfree.date.SerialDate 327
結束語 389
1.1 要有程式碼 2
1.2 糟糕的程式碼 2
1.3 混亂的代價 3
1.3.1 華麗新設計 4
1.3.2 態度 4
1.3.3 迷題 5
1.3.4 整潔程式碼的藝術 5
1.3.5 什麼是整潔程式碼 6
1.4 思想流派 10
1.5 我們是作者 11
1.6 童子軍軍規 12
1.7 前傳與原則 12
1.8 小結 12
1.9 文獻 13
第2章 有意義的命名 15
2.1 介紹 15
2.2 名副其實 16
2.3 避免誤導 17
2.4 做有意義的區分 18
2.5 使用讀得出來的名稱 19
2.6 使用可搜尋的名稱 20
2.7 避免使用編碼 21
2.7.1 匈牙利語標記法 21
2.7.2 成員字首 21
2.7.3 介面和實現 22
2.8 避免思維對映 22
2.9 類名 23
2.10 方法名 23
2.11 別扮可愛 23
2.12 每個概念對應一個詞 24
2.13 別用雙關語 24
2.14 使用解決方案領域名稱 25
2.15 使用源自所涉問題領域的名稱 25
2.16 新增有意義的語境 25
2.17 不要新增沒用的語境 27
2.18 最後的話 27
第3章 函式 29
3.1 短小 32
3.2 只做一件事 33
3.3 每個函式一個抽象層級 34
3.4 switch語句 35
3.5 使用描述性的名稱 36
3.6 函式引數 37
3.6.1 一元函式的普遍形式 38
3.6.2 標識引數 38
3.6.3 二元函式 38
3.6.4 三元函式 39
3.6.5 引數物件 39
3.6.6 引數列表 40
3.6.7 動詞與關鍵字 40
3.7 無副作用 40
3.8 分隔指令與詢問 42
3.9 使用異常替代返回錯誤碼 42
3.9.1 抽離Try/Catch程式碼塊 43
3.9.2 錯誤處理就是一件事 44
3.9.3 Error.java依賴磁鐵 44
3.10 別重複自己 44
3.11 結構化程式設計 45
3.12 如何寫出這樣的函式 45
3.13 小結 45
3.14 SetupTeardownIncluder程式 46
3.15 文獻 48
第4章 註釋 49
4.1 註釋不能美化糟糕的程式碼 50
4.2 用程式碼來闡述 51
4.3 好註釋 51
4.3.1 法律資訊 51
4.3.2 提供資訊的註釋 51
4.3.3 對意圖的解釋 52
4.3.4 闡釋 53
4.3.5 警示 53
4.3.6 TODO註釋 54
4.3.7 放大 54
4.3.8 公共API中的Javadoc 55
4.4 壞註釋 55
4.4.1 喃喃自語 55
4.4.2 多餘的註釋 56
4.4.3 誤導性註釋 58
4.4.4 循規式註釋 58
4.4.5 日誌式註釋 59
4.4.6 廢話註釋 59
4.4.7 可怕的廢話 61
4.4.8 能用函式或變數時就別用註釋 62
4.4.9 位置標記 62
4.4.10 括號後面的註釋 62
4.4.11 歸屬與署名 63
4.4.12 註釋掉的程式碼 63
4.4.13 HTML註釋 64
4.4.14 非本地資訊 64
4.4.15 資訊過多 65
4.4.16 不明顯的聯絡 65
4.4.17 函式頭 66
4.4.18 非公共程式碼中的Javadoc 66
4.4.19 範例 66
4.5 文獻 69
第5章 格式 71
5.1 格式的目的 72
5.2 垂直格式 72
5.2.1 向報紙學習 73
5.2.2 概念間垂直方向上的區隔 73
5.2.3 垂直方向上的靠近 74
5.2.4 垂直距離 75
5.2.5 垂直順序 79
5.3 橫向格式 79
5.3.1 水平方向上的區隔與靠近 80
5.3.2 水平對齊 81
5.3.3 縮排 82
5.3.4 空範圍 84
5.4 團隊規則 84
5.5 鮑勃大叔的格式規則 85
第6章 物件和資料結構 87
6.1 資料抽象 87
6.2 資料、物件的反對稱性 89
6.3 得墨忒耳律 91
6.3.1 火車失事 91
6.3.2 混雜 92
6.3.3 隱藏結構 92
6.4 資料傳送物件 93
6.5 小結 94
6.6 文獻 94
第7章 錯誤處理 95
7.1 使用異常而非返回碼 96
7.2 先寫Try-Catch-Finally語句 97
7.3 使用不可控異常 98
7.4 給出異常發生的環境說明 99
7.5 依呼叫者需要定義異常類 99
7.6 定義常規流程 100
7.7 別返回null值 101
7.8 別傳遞null值 102
7.9 小結 103
7.10 文獻 104
第8章 邊界 105
8.1 使用第三方程式碼 106
8.2 瀏覽和學習邊界 107
8.3 學習log4j 108
8.4 學習性測試的好處不只是免費 110
8.5 使用尚不存在的程式碼 110
8.6 整潔的邊界 111
8.7 文獻 112
第9章 單元測試 113
9.1 TDD三定律 114
9.2 保持測試整潔 115
9.3 整潔的測試 116
9.3.1 面向特定領域的測試語言 118
9.3.2 雙重標準 119
9.4 每個測試一個斷言 121
9.5 F.I.R.S.T. 122
9.6 小結 123
9.7 文獻 124
第10章 類 125
10.1 類的組織 126
10.2 類應該短小 126
10.2.1 單一權責原則 128
10.2.2 內聚 129
10.2.3 保持內聚性就會得到許多短小的類 130
10.3 為了修改而組織 136
10.4 文獻 139
第11章 系統 141
11.1 如何建造一個城市 142
11.2 將系統的構造與使用分開 142
11.2.1 分解main 143
11.2.2 工廠 143
11.2.3 依賴注入 144
11.3 擴容 145
11.4 Java代理 148
11.5 純Java AOP框架 150
11.6 AspectJ的方面 152
11.7 測試驅動系統架構 153
11.8 優化決策 154
11.9 明智使用添加了可論證價值的標準 154
11.10 系統需要領域特定語言 154
11.11 小結 155
11.12 文獻 155
第12章 迭進 157
12.1 通過迭進設計達到整潔目的 157
12.2 簡單設計規則1:執行所有測試 158
12.3 簡單設計規則2~4:重構 158
12.4 不可重複 159
12.5 表達力 161
12.6 儘可能少的類和方法 162
12.7 小結 162
12.8 文獻 162
第13章 併發程式設計 163
13.1 為什麼要併發 164
13.2 挑戰 165
13.3 併發防禦原則 166
13.3.1 單一權責原則 166
13.3.2 推論:限制資料作用域 166
13.3.3 推論:使用資料複本 167
13.3.4 推論:執行緒應儘可能地獨立 167
13.4 瞭解Java庫 167
13.5 瞭解執行模型 168
13.5.1 生產者-消費者模型 169
13.5.2 讀者-作者模型 169
13.5.3 宴席哲學家 169
13.6 警惕同步方法之間的依賴 169
13.7 保持同步區域微小 170
13.8 很難編寫正確的關閉程式碼 170
13.9 測試執行緒程式碼 171
13.9.1 將偽失敗看作可能的執行緒問題 171
13.9.2 先使非執行緒程式碼可工作 171
13.9.3 編寫可插拔的執行緒程式碼 172
13.9.4 編寫可調整的執行緒程式碼 172
13.9.5 執行多於處理器數量的執行緒 172
13.9.6 在不同平臺上執行 172
13.9.7 裝置試錯程式碼 173
13.9.8 硬編碼 173
13.9.9 自動化 174
13.10 小結 175
13.11 文獻 175
第14章 逐步改進 176
14.1 Args的實現 177
14.2 Args:草稿 183
14.2.1 所以我暫停了 195
14.2.2 漸進 195
14.3 字串引數 197
14.4 小結 234
第15章 JUnit內幕 235
15.1 JUnit框架 236
15.2 小結 249
第16章 重構SerialDate 251
16.1 首先,讓它能工作 252
16.2 讓它做對 254
16.3 小結 266
16.4 文獻 267
第17章 味道與啟發 269
17.1 註釋 270
17.2 環境 271
17.3 函式 271
17.4 一般性問題 272
17.5 Java 288
17.6 名稱 291
17.7 測試 294
17.8 小結 295
17.9 文獻 296
附錄A 併發程式設計II 297
A.1 客戶端/伺服器的例子 297
A.1.1 伺服器 297
A.1.2 新增執行緒程式碼 298
A.1.3 觀察伺服器端 299
A.1.4 小結 301
A.2 執行的可能路徑 301
A.2.1 路徑數量 302
A.2.2 深入挖掘 303
A.2.3 小結 305
A.3 瞭解類庫 305
A.3.1 Executor框架 305
A.3.2 非鎖定的解決方案 306
A.3.3 非執行緒安全類 307
A.4 方法之間的依賴可能破壞併發程式碼 308
A.4.1 容忍錯誤 309
A.4.2 基於客戶程式碼的鎖定 309
A.4.3 基於服務端的鎖定 311
A.5 提升吞吐量 312
A.5.1 單執行緒條件下的吞吐量 313
A.5.2 多執行緒條件下的吞吐量 313
A.6 死鎖 314
A.6.1 互斥 315
A.6.2 上鎖及等待 315
A.6.3 無搶先機制 315
A.6.4 迴圈等待 315
A.6.5 不互斥 316
A.6.6 不上鎖及等待 316
A.6.7 滿足搶先機制 317
A.6.8 不做迴圈等待 317
A.7 測試多執行緒程式碼 317
A.8 測試執行緒程式碼的工具支援 320
A.9 小結 320
A.10 教程:完整程式碼範例 321
A.10.1 客戶端/伺服器非執行緒程式碼 321
A.10.2 使用執行緒的客戶端/伺服器程式碼 324
附錄B org.jfree.date.SerialDate 327
結束語 389