本書囊括了筆者多年編程經(jīng)驗(yàn)總結(jié)出的六項(xiàng)編輯密技:完美規(guī)約、完美視角、完美利用、完美改造、完美優(yōu)化、完美突破,這六項(xiàng)密技是完美編程的精髓,亦是完美編程的指導(dǎo)思想與靈魂。本書還包含77個(gè)經(jīng)典優(yōu)化案例及28種常用優(yōu)化技巧。
適讀人群 :軟件開發(fā)人員及相關(guān)專業(yè)師生
Java是目前的主流開發(fā)技術(shù),如何更好地發(fā)揮其技術(shù)優(yōu)勢實(shí)現(xiàn)資源配置和獲得更高商業(yè)價(jià)值,一直是Java技術(shù)發(fā)展的趨勢。然而Java體系龐大、技術(shù)精深,如何寫出優(yōu)質(zhì)代碼,如何設(shè)計(jì)與優(yōu)化系統(tǒng)架構(gòu),是高級(jí)開發(fā)者必須掌握的核心技術(shù)之一。本書所面向的讀者主要是那些想在技術(shù)領(lǐng)域成為佼佼者的朋友:
1.走在架構(gòu)師之路上的工程師。
2.希望提高自己代碼質(zhì)量水平的程序員。
3.追求完美的技術(shù)愛好者。
總之,無論是在校大學(xué)生還是剛剛走上工作崗位的新員工,無論是做編碼的程序員還是做測試的技術(shù)人員,無論是架構(gòu)師還是項(xiàng)目經(jīng)理,都可以從本書中獲得有益的收獲。
在武俠世界里,凡是頂尖的高手,要么是經(jīng)歷了一些奇遇偶得真?zhèn)鳎淳褪墙?jīng)過幾十年腳踏實(shí)地的修煉,才得以爐火純青。雖然路不同,但他們最核心的修煉內(nèi)容就是增強(qiáng)自己的內(nèi)力。內(nèi)功心法才是核心,因?yàn)閯Ψā⑷ㄖ悓?duì)聰明人來講看一遍就會(huì),而內(nèi)力卻很難速成。到達(dá)一定的境界后,武功就不分什么門派了,因?yàn)檫@都是融會(huì)貫通的。
現(xiàn)實(shí)科技世界與武俠科幻世界同理,Java程序世界里也不乏頂尖高手,比如Bruce Eckel (《Thinking In Java》作者)、Joshua Bloch(Google首席Java架構(gòu)師,《Effective Java》作者)、 Kent Beck(敏捷之父)、Martin Fowler(優(yōu)化之父)等等。這些人之所以如此成功,并讓追求者頂禮膜拜,并不是因?yàn)樗麄儗懥撕古3錀澋某绦虼a,而在于他們一出手就能展現(xiàn)絕頂高手的風(fēng)范,寫出令人拍案叫絕的高質(zhì)量代碼。因?yàn)檫@代表了他們的品牌與實(shí)力,他們會(huì)一直精益求精,不斷優(yōu)化,他們把自己的悟道——如何修煉內(nèi)功秘籍——寫成了書,就成了經(jīng)典。
程序員修煉內(nèi)功心法的終極目標(biāo)就是成為我們夢(mèng)寐以求的架構(gòu)師。眾所周知的《Java編程思想》《Java高效編程》《敏捷軟件開發(fā)》《設(shè)計(jì)模式》《優(yōu)化》《人月神話》等巨著的核心內(nèi)容之一就是教授這些內(nèi)功心法,本書也正是作者多年修煉的總結(jié)。品質(zhì)體現(xiàn)于細(xì)節(jié),本書不但從宏觀到細(xì)節(jié)進(jìn)行了全面系統(tǒng)的介紹,而且形成了代碼質(zhì)量優(yōu)化的理論與技巧體系,是進(jìn)行代碼優(yōu)化不可多得的寶典。
顏廷吉,山東臨沂人,畢業(yè)于北京大學(xué)軟件與微電子學(xué)院,碩士學(xué)位。上海頤凡軟件科技有限公司創(chuàng)始人兼首席架構(gòu)師,高級(jí)系統(tǒng)工程師,“頤凡Java應(yīng)用開發(fā)平臺(tái)”軟件著作權(quán)人,擁有PMP、OCP、LIP3等各種高級(jí)國際技術(shù)認(rèn)證證書,日本國家高度人才。
2007年就職于NTTDATA集團(tuán)公司,任研發(fā)部主任,從事一線軟件研發(fā)與設(shè)計(jì)近十年。曾經(jīng)主導(dǎo)與參與了日本厚生勞動(dòng)省HelloWork就職勞動(dòng)項(xiàng)目、
Taspo全國香煙自動(dòng)販賣項(xiàng)目、飲料自動(dòng)販賣機(jī)販賣信息采集項(xiàng)目等大型系統(tǒng)的設(shè)計(jì)與研發(fā),曾連續(xù)多年獲得公司社長獎(jiǎng),項(xiàng)目獎(jiǎng)等各種獎(jiǎng)項(xiàng)。
序
前言
第1章 代碼質(zhì)量 1
1.1 什么是代碼質(zhì)量 1
1.2 什么是軟件質(zhì)量 1
1.3 代碼質(zhì)量與軟件質(zhì)量 1
1.4 代碼質(zhì)量優(yōu)化理論 2
1.5 提高代碼質(zhì)量手段 3
小結(jié) 3
第2章 代碼質(zhì)量靜態(tài)檢查工具 4
2.1 靜態(tài)分析技術(shù)概述 4
2.2 靜態(tài)分析技術(shù)原理 4
2.3 靜態(tài)分析技術(shù)給我們帶來的好處 5
2.4 常用重要靜態(tài)分析工具 6
2.5 如何優(yōu)化靜態(tài)分析工具 6
小結(jié) 11
第3章 代碼質(zhì)量優(yōu)化通用準(zhǔn)則 12
3.1 避免使用空塊 12
3.2 避免使用空類 15
3.3 去掉多余的import 16
3.4 剪切無效代碼 17
3.5 制定命名體系規(guī)約 18
編程解密一:完美規(guī)約 20
優(yōu)化技巧01:按照命名規(guī)約賦予名稱 20
3.6 去掉重復(fù)代碼 21
3.7 如何優(yōu)雅使用switch語句 22
3.8 用大寫“L”代替小寫“l(fā)”定義long變量 24
3.9 避免在一條語句中聲明或賦值多個(gè)變量 25
3.10 去掉控制標(biāo)志的臨時(shí)變量 26
優(yōu)化技巧02:移除控制標(biāo)志臨時(shí)變量 27
3.11 避免賦予臨時(shí)變量過多的角色 28
優(yōu)化技巧03:賦予臨時(shí)變量單一職責(zé) 29
3.12 避免使用魔法數(shù)字 29
優(yōu)化技巧04:用常量取代魔法數(shù)字 30
3.13 在for循環(huán)內(nèi)修正增量因子有什么弊端 31
3.14 用Enum代替Integer類型碼常量 32
優(yōu)化技巧05:用枚舉取代類型碼 34
3.15 用BigDecimal類型進(jìn)行精確計(jì)算 35
3.16 避免混用“+” 36
3.17 避免混用復(fù)雜運(yùn)算符 37
3.18 避免使用復(fù)雜條件式或分支 38
優(yōu)化技巧06:用代碼片段拆分復(fù)雜表達(dá)式 41
優(yōu)化技巧07:用衛(wèi)語句代替嵌套條件表達(dá)式 42
優(yōu)化技巧08:用多態(tài)代替條件表達(dá)式 43
3.19 如何深入理解“= =”的真正含義 44
3.20 要習(xí)慣于用泛型代替原生類型 48
3.21 如何正確使用通配符的邊界 53
3.22 如何發(fā)揮正則表達(dá)式的威力 55
小結(jié) 58
第4章 方法優(yōu)化技巧 59
4.1 最小化原則 59
優(yōu)化技巧09:封裝類成員 60
4.2 hashCode()與equals()是個(gè)孿生兄弟 61
4.3 使用string.equals("String")帶來的弊端 66
4.4 避免命名不具有繼承關(guān)系的同名方法 67
4.5 檢查參數(shù)的有效性 68
4.6 避免使用可變參數(shù) 69
4.7 如何優(yōu)化過長參數(shù) 72
優(yōu)化技巧10:把參數(shù)提升成類成員變量 73
優(yōu)化技巧11:引入?yún)?shù)對(duì)象 74
4.8 為什么不要重寫靜態(tài)方法 75
4.9 避免使用過時(shí)的API 77
4.10 優(yōu)雅的集合運(yùn)算方法知多少 78
4.11 避免重復(fù)發(fā)明輪子 81
4.12 如何對(duì)臃腫的方法進(jìn)行瘦身 82
優(yōu)化技巧12:分解方法 84
優(yōu)化技巧13:合并方法 85
小結(jié) 85
第5章 如何保證多線程代碼質(zhì)量 86
5.1 為什么不要重寫start()方法 86
5.2 避免使用非線程安全的初始化方法 87
5.3 用final成員對(duì)象作為同期化對(duì)象鎖 90
5.4 在synchronized內(nèi)使用wait()方法 92
5.5 盡量縮小同期化代碼范圍 93
小結(jié) 94
第6章 如何優(yōu)化類與接口 95
6.1 避免創(chuàng)建不必要的對(duì)象 95
6.2 避免使用對(duì)象的淺拷貝 96
6.3 如何正確放置靜態(tài)區(qū)位置 100
6.4 為什么不要使用靜態(tài)引入 102
6.5 如何正確使用instanceof 103
6.6 避免實(shí)例化特有工具類 106
6.7 避免有深度耦合的類關(guān)系 107
優(yōu)化技巧14:移動(dòng)變量 110
優(yōu)化技巧15:移動(dòng)方法 112
6.8 如何為臃腫的類進(jìn)行手術(shù) 114
優(yōu)化技巧16:分解類 116
6.9 如何優(yōu)化冗贅類 117
優(yōu)化技巧17:合并類 118
6.10 避免在接口中出現(xiàn)實(shí)現(xiàn)代碼 119
小結(jié) 120
第7章 如何正確使用異常 121
7.1 避免定義繼承Error或Throwable子類 121
7.2 避免拋出RuntimeException或Exception 122
7.3 避免捕獲NullPointerException或Error 124
7.4 避免在finally塊中處理返回值 125
7.5 避免使失敗失去原子性 127
7.6 如何對(duì)異常進(jìn)行封裝 128
優(yōu)化技巧18:用異常代替錯(cuò)誤碼 129
7.7 將優(yōu)雅的異常信息反饋給用戶 130
7.8 避免亂用異常 131
小結(jié) 133
第8章 如何優(yōu)化代碼性能 134
8.1 避免在大量字符串拼接時(shí)用“+” 134
8.2 避免在循環(huán)體內(nèi)生成臨時(shí)對(duì)象 135
8.3 在頻繁插入與刪除時(shí)使用LinkedList 137
8.4 在文件操作后要進(jìn)行清理動(dòng)作 139
編程解密四:完美改造 140
8.5 避免顯示調(diào)用finalized()方法 142
小結(jié) 143
第9章 架構(gòu)優(yōu)化 144
9.1 單一職責(zé)原則 144
優(yōu)化技巧19:梳理并分解類職責(zé) 145
9.2 接口隔離原則 147
優(yōu)化技巧20:隔離接口 149
9.3 依賴倒置原則 151
優(yōu)化技巧21:提煉接口 152
9.4 里式替換原則 154
9.5 最少知道原則 155
9.6 如何擴(kuò)展外部類功能 159
優(yōu)化技巧22:引入本地?cái)U(kuò)展 160
9.7 如何梳理混雜的架構(gòu)體系 160
優(yōu)化技巧23:以委托代替繼承 165
優(yōu)化技巧24:封裝向下轉(zhuǎn)型 165
優(yōu)化技巧25:提煉繼承體系 167
優(yōu)化技巧26:折疊繼承體系 169
小結(jié) 170
第10章 包優(yōu)化 172
10.1 發(fā)布等價(jià)原則 172
10.2 共同重用原則 173
10.3 共同封閉原則 174
10.4 無環(huán)依賴原則 176
10.5 如何保持包的清晰 179
優(yōu)化技巧28:規(guī)整包中類位置 180
編程解密五:完美優(yōu)化 181
10.6 如何抽出框架層次 182
10.7 如何提取框架工程 183
小結(jié) 189
第11章 優(yōu)良代碼風(fēng)格 190
11.1 如何優(yōu)化代碼格式工具 190
11.2 如何統(tǒng)一標(biāo)準(zhǔn)的代碼格式 193
11.3 養(yǎng)成良好的代碼注釋習(xí)慣 194
編程解密六:完美突破 196
小結(jié) 198
結(jié)束語 199
附錄 200
參考文獻(xiàn) 229