《你真的會(huì)寫(xiě)代碼嗎》的核心思想是通過(guò)對(duì)各方面的代碼質(zhì)量進(jìn)行比較,使讀者了解經(jīng)驗(yàn)豐富的開(kāi)發(fā)者擁有的思維模式。為了展示軟件開(kāi)發(fā)最佳實(shí)踐,作者對(duì)一個(gè)水容器示例進(jìn)行多次重構(gòu),討論了18種實(shí)現(xiàn),分別從7個(gè)方面改進(jìn)代碼質(zhì)量:時(shí)間效率、空間效率、監(jiān)控與可靠性、測(cè)試與可靠性、可讀性、線(xiàn)程安全、可復(fù)用性。在此過(guò)程中,作者還探討了與計(jì)算機(jī)科學(xué)、Java編程以及軟件工程相關(guān)的專(zhuān)業(yè)話(huà)題,這些知識(shí)都有助于讀者寫(xiě)出更好的代碼。
1.一條主線(xiàn)串聯(lián)編程語(yǔ)言、算法與軟件工程
2.一個(gè)實(shí)例,七次重構(gòu),助力明辨代碼優(yōu)劣
3.附贈(zèng)在線(xiàn)代碼庫(kù),按章節(jié)組織免費(fèi)下載
4.Java開(kāi)發(fā)技巧助力應(yīng)對(duì)多樣化開(kāi)發(fā)需求
5.《Java核心技術(shù)》《寫(xiě)給大忙人看的Java核心技術(shù)》等書(shū)作者凱·霍思特曼作序推薦
【作者簡(jiǎn)介】
馬爾科·法埃拉(Marco Faella)
意大利那不勒斯費(fèi)德里克二世大學(xué)副教授,面向本科生和研究生講授高級(jí)編程、軟件工程、面向?qū)ο笤O(shè)計(jì)、編譯器與程序分析、游戲設(shè)計(jì)等課程,同時(shí)為信息技術(shù)從業(yè)者開(kāi)發(fā)和講授Java編程課。另外,他也是愛(ài)思唯爾、施普林格等旗下期刊的審稿人。
【譯者簡(jiǎn)介】
雷威
信公科技架構(gòu)師,曾在阿里巴巴中間件團(tuán)隊(duì)任職。沉浸軟件行業(yè)十余年,熱衷于軟件架構(gòu)、研發(fā)效能、分布式、云原生等領(lǐng)域,相信技術(shù)能改變世界。
李強(qiáng)
信公科技CTO,浙江中金黃金集團(tuán)前副總裁兼CTO,曾就職于美國(guó)道富銀行。技術(shù)涉獵廣泛,在產(chǎn)品設(shè)計(jì)開(kāi)發(fā)、架構(gòu)設(shè)計(jì)、技術(shù)團(tuán)隊(duì)管理等方面有豐富經(jīng)驗(yàn)。另譯有《監(jiān)控的藝術(shù)》《擴(kuò)展jQuery》等。
第 一部分 準(zhǔn)備工作
第 1章 軟件質(zhì)量和待解決問(wèn)題 2
1.1 軟件質(zhì)量 2
1.1.1 內(nèi)部質(zhì)量與外部質(zhì)量 3
1.1.2 功能性質(zhì)量與非功能性質(zhì)量 3
1.2 主要的外部軟件質(zhì)量 4
1.2.1 正確性 4
1.2.2 穩(wěn)健性 5
1.2.3 易用性 5
1.2.4 效率 5
1.3 主要的內(nèi)部軟件質(zhì)量 6
1.3.1 可讀性 6
1.3.2 可復(fù)用性 6
1.3.3 可測(cè)試性 6
1.3.4 可維護(hù)性 7
1.4 軟件質(zhì)量之間的關(guān)系 7
1.5 特殊的質(zhì)量 9
1.5.1 線(xiàn)程安全 9
1.5.2 簡(jiǎn)潔性 9
1.6 演進(jìn)示例:水容器系統(tǒng) 9
1.6.1 API 10
1.6.2 用例 11
1.7 數(shù)據(jù)的模型和表示 12
1.7.1 存儲(chǔ)水量 13
1.7.2 存儲(chǔ)連接 13
1.8 你好,容器(Novice) 15
1.8.1 字段和構(gòu)造函數(shù) 15
1.8.2 getAmount和addWater方法 17
1.8.3 connectTo方法 17
1.9 小結(jié) 19
1.10 擴(kuò)展閱讀 19
第 2 章 Reference 的實(shí)現(xiàn) 20
2.1 代碼(Reference) 21
2.1.1 內(nèi)存布局圖 22
2.1.2 方法 25
2.2 內(nèi)存需求 26
2.3 時(shí)間復(fù)雜度 30
2.4 學(xué)以致用 32
2.5 小結(jié) 33
2.6 小測(cè)驗(yàn)答案和練習(xí)答案 34
2.7 擴(kuò)展閱讀 36
第二部分 軟件質(zhì)量
第3章 速度的要求:時(shí)間效率 40
3.1 常數(shù)時(shí)間內(nèi)完成加水(Speed1) 41
3.2 常數(shù)時(shí)間內(nèi)添加連接(Speed2) 43
3.2.1 用循環(huán)鏈表來(lái)表示容器組 43
3.2.2 延遲更新 46
3.3 最好的平衡:并查集算法(Speed3) 49
3.3.2 連接容器樹(shù) 52
3.3.3 最壞情況時(shí)間復(fù)雜度 53
3.3.4 攤銷(xiāo)時(shí)間復(fù)雜度 55
3.3.5 可調(diào)整大小數(shù)組的攤銷(xiāo)分析 56
3.4 比較各種實(shí)現(xiàn) 59
3.4.1 實(shí)驗(yàn) 59
3.4.2 理論與實(shí)踐 60
3.5 來(lái)點(diǎn)兒新鮮的 61
3.5.1 快速插入 62
3.5.2 快速查詢(xún) 62
3.5.3 讓三個(gè)方法都變快 63
3.6 真實(shí)世界的用例 63
3.7 學(xué)以致用 64
3.8 小結(jié) 65
3.9 小測(cè)驗(yàn)答案和練習(xí)答案 65
3.10 擴(kuò)展閱讀 68
第4章 寶貴的內(nèi)存:空間效率 70
4.1 稍微擠一下(Memory1) 70
4.2 普通數(shù)組(Memory2) 75
4.3 棄用對(duì)象(Memory3) 78
4.3.1 無(wú)對(duì)象的API 79
4.3.2 字段和getAmount 方法 81
4.3.3 用一個(gè)工廠(chǎng)方法來(lái)創(chuàng)建容器 82
4.3.4 通過(guò)ID 連接容器 84
4.3.5 空間復(fù)雜度和時(shí)間復(fù)雜度 87
4.4 黑洞(Memory4) 87
4.5 空間和時(shí)間的權(quán)衡 90
4.6 來(lái)點(diǎn)兒新鮮的 92
4.6.1 重復(fù)對(duì)象少的情況 92
4.6.2 重復(fù)元素多的情況 93
4.7 真實(shí)世界的用例 94
4.8 學(xué)以致用 94
4.9 小結(jié) 96
4.10 小測(cè)驗(yàn)答案和練習(xí)答案 96
4.11 擴(kuò)展閱讀 100
第5章 有自我意識(shí)的代碼:通過(guò)監(jiān)控實(shí)現(xiàn)可靠性 102
5.1 契約式設(shè)計(jì) 102
5.1.1 前置條件和后置條件 102
5.1.2 不變式 104
5.1.3 正確性和穩(wěn)健性 105
5.1.4 檢查契約 106
5.1.5 更廣泛的情況 108
5.2 基于契約設(shè)計(jì)水容器 109
5.3 檢查契約的容器(Contracts) 111
5.3.1 檢查addWater方法的契約 114
5.4 檢查不變式的容器(Invariants) 117
5.4.1 檢查connectTo方法的不變式 118
5.4.2 檢查addWater方法的不變式 120
5.5 來(lái)點(diǎn)兒新鮮的 120
5.5.1 契約 121
5.5.2 一個(gè)基線(xiàn)版本實(shí)現(xiàn) 121
5.5.3 檢查契約 122
5.5.4 檢查不變式 123
5.6 真實(shí)世界的用例 124
5.7 學(xué)以致用 125
5.8 小結(jié) 126
5.9 小測(cè)驗(yàn)答案和練習(xí)答案 126
5.10 擴(kuò)展閱讀 131
第6章 別對(duì)我撒謊:通過(guò)測(cè)試保證可靠性 132
6.1 測(cè)試的基本概念 132
6.1.1 測(cè)試的覆蓋率 133
6.1.2 測(cè)試和契約式設(shè)計(jì) 133
6.1.3 JUnit 134
6.2 測(cè)試水容器(UnitTests) 136
6.2.1 初始化測(cè)試 136
6.2.2 測(cè)試addWater 138
6.2.3 測(cè)試connectTo方法 143
6.2.4 運(yùn)行測(cè)試 144
6.2.5 衡量代碼覆蓋率 145
6.3 可測(cè)試性(Testable) 146
6.3.1 可控性 146
6.3.2 可觀(guān)察性 147
6.3.3 隔離:切斷依賴(lài)關(guān)系 148
6.4 來(lái)點(diǎn)兒新鮮的 149
6.4.1 提高可測(cè)試性 150
6.4.2 一個(gè)測(cè)試套件 151
6.5 真實(shí)世界的用例 153
6.6 學(xué)以致用 154
6.7 小結(jié) 155
6.8 小測(cè)驗(yàn)答案和練習(xí)答案 155
6.9 擴(kuò)展閱讀 160
第7章 讓代碼說(shuō)話(huà):可讀性 161
7.1 關(guān)于可讀性的一些觀(guān)點(diǎn) 161
7.1.1 企業(yè)編碼風(fēng)格規(guī)范 162
7.1.2 可讀性因素 163
7.2 結(jié)構(gòu)性的可讀性特征 164
7.2.1 控制流語(yǔ)句 164
7.2.2 表達(dá)式和局部變量 166
7.3 外部可讀性特征 167
7.3.1 注釋 167
7.3.2 命名 168
7.3.3 空白及縮進(jìn) 169
7.4 可讀的容器(Readable) 169
7.4.1 用Javadoc描述類(lèi)的頭部 170
7.4.2 整理connectTo方法 173
7.4.3 整理addWater方法 177
7.5 可讀性的終極思考 178
7.6 來(lái)點(diǎn)兒新鮮的 179
7.7 真實(shí)世界的用例 181
7.8 學(xué)以致用 181
7.9 小結(jié) 183
7.10 小測(cè)驗(yàn)答案和練習(xí)答案 183
7.11 擴(kuò)展閱讀 186
第8章 多個(gè)廚師一鍋飯:線(xiàn)程安全 188
8.1 線(xiàn)程安全面臨的挑戰(zhàn) 188
8.1.1 并發(fā)級(jí)別 190
8.1.2 水容器的并發(fā)策略 192
8.2 處理死鎖 193
8.2.1 原子的鎖序列 194
8.2.2 有序的鎖序列 195
8.2.3 一個(gè)隱藏的競(jìng)爭(zhēng)條件 196
8.3 線(xiàn)程安全的水容器(ThreadSafe) 198
8.3.1 同步connectTo方法 198
8.3.2 同步addWater和getAmount方法 199
8.4 不可變性(Immutable) 201
8.4.1 API 202
8.4.2 實(shí)現(xiàn) 204
8.5 來(lái)點(diǎn)兒新鮮的 206
8.6 真實(shí)世界的用例 208
8.7 學(xué)以致用 209
8.8 小結(jié) 210
8.9 小測(cè)驗(yàn)答案和練習(xí)答案 211
8.10 擴(kuò)展閱讀 213
第9章 請(qǐng)重復(fù)利用:可復(fù)用性 215
9.1 確立邊界 215
9.2 通用框架 216
9.2.1 屬性API 219
9.2.2 可變收集器 220
9.2.3 將Attribute適配到函數(shù)接口 224
9.3 一個(gè)通用容器的實(shí)現(xiàn) 225
9.4 通用的考慮 227
9.5 復(fù)原水容器(Generic) 228
9.5.1 更新用例 228
9.5.2 設(shè)計(jì)具體的屬性 228
9.5.3 定義具體的水容器類(lèi) 230
9.6 社交網(wǎng)絡(luò)的帖子 230
9.7 來(lái)點(diǎn)兒新鮮的 231
9.7.1 參數(shù)函數(shù)的接口 233
9.7.2 一個(gè)通信模式 235
9.8 真實(shí)世界的用例 237
9.9 學(xué)以致用 238
9.10 總結(jié) 240
9.11 小測(cè)驗(yàn)答案和練習(xí)答案 240
9.12 擴(kuò)展閱讀 245
附錄A 代碼高爾夫:簡(jiǎn)潔性 246
附錄B 終極水容器類(lèi) 249
列表:每一章中主要的類(lèi) 252