軟件質(zhì)量,不但依賴架構(gòu)及項(xiàng)目管理,而且與代碼質(zhì)量緊密相關(guān)。這一點(diǎn),無(wú)論是敏捷開(kāi)發(fā)流派還是傳統(tǒng)開(kāi)發(fā)流派,都不得不承認(rèn)。 本書(shū)提出一種觀點(diǎn):代碼質(zhì)量與其整潔度成正比。干凈的代碼,既在質(zhì)量上較為可靠,也為后期維護(hù)、升級(jí)奠定了良好基礎(chǔ)。作為編程領(lǐng)域的佼佼者,本書(shū)作者給出了一系列行之有效的整潔代碼操作實(shí)踐。這些實(shí)踐在本書(shū)中體現(xiàn)為一條條規(guī)則(或稱啟示),并輔以來(lái)自實(shí)際項(xiàng)目的正、反兩面的范例。只要遵循這些規(guī)則,就能編寫(xiě)出干凈的代碼,從而有效提升代碼質(zhì)量。 本書(shū)閱讀對(duì)象為一切有志于改善代碼質(zhì)量的程序員及技術(shù)經(jīng)理。書(shū)中介紹的規(guī)則均來(lái)自作者多年的實(shí)踐經(jīng)驗(yàn),涵蓋從命名到重構(gòu)的多個(gè)編程方面,雖為一家之言,然誠(chéng)有可資借鑒的價(jià)值。
閱讀這本書(shū)有兩種原因:*,你是個(gè)程序員;第二,你想成為更好的程序員。很好,IT行業(yè)需要更好的程序員!羅伯特·C. 馬丁(Robert C. Martin) 盡管糟糕的代碼也能運(yùn)行,但如果代碼不整潔,會(huì)使整個(gè)開(kāi)發(fā)團(tuán)隊(duì)泥足深陷,寫(xiě)得不好的代碼每年都要耗費(fèi)難以計(jì)數(shù)的時(shí)間和資源。但是,這種情況并非無(wú)法避免。 著名軟件專家羅伯特·C. 馬。≧obert C. Martin) 在本書(shū)中為你呈現(xiàn)了革命性的視野。他攜同Object Mentor公司的同事,從他們有關(guān)整潔代碼的*敏捷實(shí)踐中提煉出軟件技藝的價(jià)值觀,以饗讀者,讓你成為更優(yōu)秀的程序員只要你著手研讀本書(shū)。 閱讀本書(shū)需要你做些什么呢?你將閱讀代碼大量代碼。本書(shū)會(huì)促使你思考何謂正確的代碼,何謂錯(cuò)誤的代碼。更重要的是,本書(shū)將促使你重新評(píng)估自己的專業(yè)價(jià)值觀,以及對(duì)自己技藝的承諾。 書(shū)中的具體內(nèi)容包括: ·好代碼和糟糕的代碼之間的區(qū)別; ·如何編寫(xiě)好代碼,如何將糟糕的代碼轉(zhuǎn)化為好代碼; ·如何創(chuàng)建好名稱、好函數(shù)、好對(duì)象和好類; ·如何格式化代碼以實(shí)現(xiàn)其可讀性的*化; ·如何在不妨礙代碼邏輯的前提下充分實(shí)現(xiàn)錯(cuò)誤處理; ·如何進(jìn)行單元測(cè)試和測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。
作者簡(jiǎn)介 Robert C. Martin,世界級(jí)軟件開(kāi)發(fā)大師,設(shè)計(jì)模式和敏捷開(kāi)發(fā)先驅(qū),敏捷聯(lián)盟首任主席,C Report前主編,被后輩程序員尊稱為Bob大叔。20世紀(jì)70年代初成為職業(yè)程序員,后創(chuàng)辦Object Mentor公司并任總裁。Martin還是一名多產(chǎn)的作家,至今已發(fā)表數(shù)百篇文章、論文和博客文章。除本書(shū)外,還著有《代碼整潔之道:程序員的職業(yè)素養(yǎng)》《敏捷軟件開(kāi)發(fā):原則、模式和實(shí)踐》《UML:Java程序員指南》等。 譯者簡(jiǎn)介 韓磊,互聯(lián)網(wǎng)產(chǎn)品與社區(qū)運(yùn)營(yíng)專家,技術(shù)書(shū)籍著譯者。曾任CSDN及《程序員》雜志副總經(jīng)理、總編輯,廣東二十一世紀(jì)傳媒新媒體事業(yè)部總經(jīng)理等職,F(xiàn)任AR初創(chuàng)企業(yè)亮風(fēng)臺(tái)廣州公司總經(jīng)理。除本書(shū)外,還譯有《夢(mèng)斷代碼》《C#編程風(fēng)格》等書(shū)。與劉韌合著《網(wǎng)絡(luò)媒體教程》,與戴飛合譯《Beginning C# Objects中文版:概念到代碼》。
目 錄
第1章 整潔代碼 1
1.1 要有代碼 2
1.2 糟糕的代碼 2
1.3 混亂的代價(jià) 3
1.3.1 華麗新設(shè)計(jì) 4
1.3.2 態(tài)度 4
1.3.3 謎題 5
1.3.4 整潔代碼的藝術(shù) 5
1.3.5 什么是整潔代碼 6
1.4 思想流派 10
1.5 我們是作者 11
1.6 童子軍軍規(guī) 12
1.7 前傳與原則 12
1.8 小結(jié) 13
1.9 文獻(xiàn) 13
第2章 有意義的命名 14
2.1 介紹 14
2.2 名副其實(shí) 15
2.3 避免誤導(dǎo) 16
2.4 做有意義的區(qū)分 17
2.5 使用讀得出來(lái)的名稱 18
2.6 使用可搜索的名稱 19
2.7 避免使用編碼 20
2.7.1 匈牙利語(yǔ)標(biāo)記法 20
2.7.2 成員前綴 21
2.7.3 接口和實(shí)現(xiàn) 21
2.8 避免思維映射 21
2.9 類名 22
2.10 方法名 22
2.11 別抖機(jī)靈 22
2.12 每個(gè)概念對(duì)應(yīng)一個(gè)詞 23
2.13 別用雙關(guān)語(yǔ) 23
2.14 使用解決方案領(lǐng)域名稱 24
2.15 使用源自所涉問(wèn)題領(lǐng)域的名稱 24
2.16 添加有意義的語(yǔ)境 24
2.17 不要添加沒(méi)用的語(yǔ)境 26
2.18 最后的話 27
第3章 函數(shù) 28
3.1 短小 31
3.2 只做一件事 32
3.3 每個(gè)函數(shù)一個(gè)抽象層級(jí) 33
3.4 switch語(yǔ)句 34
3.5 使用具有描述性的名稱 35
3.6 函數(shù)參數(shù) 36
3.6.1 單參數(shù)函數(shù)的普遍形式 37
3.6.2 標(biāo)識(shí)參數(shù) 37
3.6.3 雙參數(shù)函數(shù) 38
3.6.4 三參數(shù)函數(shù) 38
3.6.5 參數(shù)對(duì)象 39
3.6.6 參數(shù)列表 39
3.6.7 動(dòng)詞與關(guān)鍵字 39
3.7 無(wú)副作用 40
3.8 分隔指令與詢問(wèn) 41
3.9 使用異常替代返回錯(cuò)誤碼 42
3.9.1 抽離try/catch代碼塊 42
3.9.2 錯(cuò)誤處理就是一件事 43
3.9.3 Error.java依賴磁鐵 43
3.10 別重復(fù)自己 44
3.11 結(jié)構(gòu)化編程 44
3.12 如何寫(xiě)出這樣的函數(shù) 45
3.13 小結(jié) 45
3.14 SetupTeardownIncluder程序 45
3.15 文獻(xiàn) 48
第4章 注釋 49
4.1 注釋不能美化糟糕的代碼 50
4.2 用代碼來(lái)闡述 51
4.3 好注釋 51
4.3.1 法律信息 51
4.3.2 提供信息的注釋 51
4.3.3 對(duì)意圖的解釋 52
4.3.4 闡釋 53
4.3.5 警示 53
4.3.6 TODO注釋 54
4.3.7 放大 55
4.3.8 公共API中的Javadoc 55
4.4 壞注釋 55
4.4.1 喃喃自語(yǔ) 55
4.4.2 多余的注釋 56
4.4.3 誤導(dǎo)性注釋 58
4.4.4 循規(guī)式注釋 59
4.4.5 日志式注釋 59
4.4.6 廢話注釋 60
4.4.7 可怕的廢話 62
4.4.8 能用函數(shù)或變量時(shí)就別用注釋 62
4.4.9 位置標(biāo)記 62
4.4.10 括號(hào)后面的注釋 63
4.4.11 歸屬與署名 63
4.4.12 注釋掉的代碼 64
4.4.13 HTML注釋 64
4.4.14 非本地信息 65
4.4.15 信息過(guò)多 65
4.4.16 不明顯的聯(lián)系 66
4.4.17 函數(shù)頭 66
4.4.18 非公共代碼中的Javadoc 66
4.4.19 范例 66
4.5 文獻(xiàn) 70
第5章 格式 71
5.1 格式的目的 72
5.2 垂直格式 72
5.2.1 向報(bào)紙學(xué)習(xí) 73
5.2.2 概念間垂直方向上的區(qū)隔 73
5.2.3 垂直方向上的靠近 74
5.2.4 垂直距離 75
5.2.5 垂直順序 79
5.3 橫向格式 80
5.3.1 水平方向上的區(qū)隔與靠近 81
5.3.2 水平對(duì)齊 82
5.3.3 縮進(jìn) 83
5.3.4 空范圍 84
5.4 團(tuán)隊(duì)規(guī)則 85
5.5 鮑勃大叔的格式規(guī)則 85
第6章 對(duì)象和數(shù)據(jù)結(jié)構(gòu) 88
6.1 數(shù)據(jù)抽象 88
6.2 數(shù)據(jù)、對(duì)象的反對(duì)稱性 90
6.3 得墨忒耳律 92
6.3.1 火車失事 92
6.3.2 混雜 93
6.3.3 隱藏結(jié)構(gòu) 93
6.4 數(shù)據(jù)傳送對(duì)象 94
6.5 小結(jié) 95
6.6 文獻(xiàn) 96
第7章 錯(cuò)誤處理 97
7.1 使用異常而非返回碼 98
7.2 先寫(xiě)try-catch-finally語(yǔ)句 99
7.3 使用未檢異常 100
7.4 給出異常發(fā)生的環(huán)境說(shuō)明 101
7.5 依調(diào)用者需要定義異常類 101
7.6 定義常規(guī)流程 103
7.7 別返回null值 104
7.8 別傳遞null值 105
7.9 小結(jié) 106
7.10 文獻(xiàn) 106
第8章 邊界 107
8.1 使用第三方代碼 108
8.2 瀏覽和學(xué)習(xí)邊界 109
8.3 學(xué)習(xí)log4j 110
8.4 學(xué)習(xí)性測(cè)試的好處不只是免費(fèi) 112
8.5 使用尚不存在的代碼 112
8.6 整潔的邊界 113
8.7 文獻(xiàn) 114
第9章 單元測(cè)試 115
9.1 TDD三定律 116
9.2 保持測(cè)試整潔 117
9.3 整潔的測(cè)試 118
9.3.1 面向特定領(lǐng)域的測(cè)試語(yǔ)言 120
9.3.2 雙重標(biāo)準(zhǔn) 121
9.4 每個(gè)測(cè)試一個(gè)斷言 123
9.5 F.I.R.S.T. 125
9.6 小結(jié) 125
9.7 文獻(xiàn) 126
第10章 類 127
10.1 類的組織 128
10.2 類應(yīng)該短小 128
10.2.1 單一權(quán)責(zé)原則 130
10.2.2 內(nèi)聚 131
10.2.3 保持內(nèi)聚性就會(huì)得到許多短小的類 132
10.3 為了修改而組織 138
10.4 文獻(xiàn) 141
第11章 系統(tǒng) 142
11.1 如何建造一個(gè)城市 143
11.2 將系統(tǒng)的構(gòu)造與使用分開(kāi) 143
11.2.1 分解main 144
11.2.2 工廠 145
11.2.3 依賴注入 145
11.3 擴(kuò)容 146
11.4 Java代理 149
11.5 純Java AOP框架 151
11.6 AspectJ的方面 154
11.7 測(cè)試驅(qū)動(dòng)系統(tǒng)架構(gòu) 154
11.8 優(yōu)化決策 155
11.9 明智使用添加了可論證價(jià)值的標(biāo)準(zhǔn) 155
11.10 系統(tǒng)需要領(lǐng)域特定語(yǔ)言 156
11.11 小結(jié) 156
11.12 文獻(xiàn) 156
第12章 迭進(jìn) 158
12.1 通過(guò)迭進(jìn)設(shè)計(jì)達(dá)到整潔目的 158
12.2 簡(jiǎn)單設(shè)計(jì)規(guī)則1:運(yùn)行所有測(cè)試 159
12.3 簡(jiǎn)單設(shè)計(jì)規(guī)則2~4:重構(gòu) 159
12.4 不可重復(fù) 160
12.5 表達(dá)力 162
12.6 盡可能少的類和方法 163
12.7 小結(jié) 163
12.8 文獻(xiàn) 163
第13章 并發(fā)編程 164
13.1 為什么要并發(fā) 165
13.2 挑戰(zhàn) 166
13.3 并發(fā)防御原則 167
13.3.1 單一權(quán)責(zé)原則 167
13.3.2 推論:限制數(shù)據(jù)作用域 167
13.3.3 推論:使用數(shù)據(jù)副本 168
13.3.4 推論:線程應(yīng)盡可能地獨(dú)立 168
13.4 了解Java庫(kù) 168
13.5 了解執(zhí)行模型 169
13.5.1 生產(chǎn)者-消費(fèi)者模型 170
13.5.2 讀者-作者模型 170
13.5.3 宴席哲學(xué)家 170
13.6 警惕同步方法之間的依賴 170
13.7 保持同步區(qū)域微小 171
13.8 很難編寫(xiě)正確的關(guān)閉代碼 171
13.9 測(cè)試線程代碼 172
13.9.1 將偽失敗看作可能的線程問(wèn)題 172
13.9.2 先使非線程代碼可工作 172
13.9.3 編寫(xiě)可插拔的線程代碼 173
13.9.4 編寫(xiě)可調(diào)整的線程代碼 173
13.9.5 運(yùn)行多于處理器數(shù)量的線程 173
13.9.6 在不同平臺(tái)上運(yùn)行 173
13.9.7 裝置試錯(cuò)代碼 174
13.9.8 硬編碼 174
13.9.9 自動(dòng)化 175
13.10 小結(jié) 176
13.11 文獻(xiàn) 176
第14章 逐步改進(jìn) 177
14.1 Args的實(shí)現(xiàn) 178
14.2 Args:草稿 185
14.2.1 所以我暫停了 196
14.2.2 漸進(jìn) 197
14.3 字符串類型參數(shù) 199
14.4 小結(jié) 236
第15章 JUnit內(nèi)幕 237
15.1 JUnit框架 238
15.2 小結(jié) 251
第16章 重構(gòu)SerialDate 252
16.1 首先,讓它能工作 253
16.2 讓它做對(duì) 255
16.3 小結(jié) 268
16.4 文獻(xiàn) 268
第17章 味道與啟發(fā) 269
17.1 注釋 270
17.2 環(huán)境 271
17.3 函數(shù) 271
17.4 一般性問(wèn)題 272
17.5 Java 288
17.6 名稱 291
17.7 測(cè)試 295
17.8 小結(jié) 296
17.9 文獻(xiàn) 296
附錄A 并發(fā)編程II 297
附錄B org.jfree.date.SerialDate 326
結(jié)束語(yǔ) 388