《高效代碼:軟件編程實(shí)踐原則》是一本致力于提高軟件編程效率和優(yōu)化代碼質(zhì)量的技術(shù)書籍。本書探討了編程中常見的復(fù)雜性問題,并提供了一系列切實(shí)可行的實(shí)踐原則與方法。本書內(nèi)容涵蓋了從控制代碼復(fù)雜性、應(yīng)用設(shè)計原則,到模塊化編程、性能優(yōu)化等多個方面。書中不僅講解了如何編寫高效、可維護(hù)的代碼,還強(qiáng)調(diào)了遵循編程規(guī)范、優(yōu)化代碼結(jié)構(gòu)、實(shí)施測試驅(qū)動開發(fā)等最佳實(shí)踐,幫助開發(fā)者在保證代碼質(zhì)量的同時提高開發(fā)效率。 本書適合軟件開發(fā)者,尤其是中高級開發(fā)者。對于初級開發(fā)者,書中的設(shè)計原則和實(shí)踐經(jīng)驗(yàn)可助其打下扎實(shí)的編程基礎(chǔ),掌握管理代碼復(fù)雜性和編寫高質(zhì)量代碼的方法;對于有一定經(jīng)驗(yàn)的開發(fā)者,書中的深入分析提供了應(yīng)對項目中挑戰(zhàn)的思路,如提高代碼質(zhì)量、優(yōu)化架構(gòu)設(shè)計和加強(qiáng)團(tuán)隊協(xié)作等。書中的實(shí)用建議是每位開發(fā)者值得參考的編程指引。
獨(dú)道東,從事軟件架構(gòu)與研發(fā)工作14年。曾在東軟、IBM、百度等互聯(lián)網(wǎng)IT科技公司任職,積累了豐富的行業(yè)經(jīng)驗(yàn)。自2016年起,加入北京金山云科技有限公司,現(xiàn)擔(dān)任公有產(chǎn)品云研發(fā)中心研發(fā)專家,負(fù)責(zé)金山云計算與云存儲Web控制臺及資源管理業(yè)務(wù)中臺的架構(gòu)設(shè)計與研發(fā)工作。在此期間,我主導(dǎo)了多個項目的落地與實(shí)施,推動了云計算與存儲平臺的高效運(yùn)作。我熱衷于技術(shù)創(chuàng)新,個人擁有兩項軟件著作權(quán)和一項正在審批中的專利。此外,我積極參與開源社區(qū)的貢獻(xiàn),作為Go語言工具函數(shù)庫Lancet(GitHub中文排名第1)的作者,致力于通過開源項目推動技術(shù)的普及與應(yīng)用。通過持續(xù)的學(xué)習(xí)與實(shí)踐,我不斷提升自己的技術(shù)能力和架構(gòu)設(shè)計水平,始終保持對技術(shù)的熱情與追求。
第1章 直面軟件復(fù)雜性 ·······················.1
1.1 代碼為什么會越來越混亂 ···········.1
1.2 復(fù)雜性的真相 ··························.1
1.3 復(fù)雜性無處不在 ·······················.3
1.4 你的代碼正在失控 ····················.4
1.5 為什么簡單的代碼會變復(fù)雜 ········.6
1.6 控制復(fù)雜性的策略 ····················.7
1.7 小結(jié) ····································.10
第2章 遵循設(shè)計原則 ························.11
2.1 單一職責(zé)原則 ························.11
2.1.1 未遵循單一職責(zé)原則的代碼示例 ·····················.12
2.1.2 遵循單一職責(zé)原則的代碼示例 ···························.14
2.2 開放封閉原則 ························.17
2.2.1 未遵循開放封閉原則的代碼示例 ·····················.17
2.2.2 遵循開放封閉原則的代碼示例 ···························.18
2.3 里氏替換原則 ························.20
2.3.1 未遵循里氏替換原則的代碼示例 ·····················.21
2.3.2 遵循里氏替換原則的代碼示例 ···························.22
2.4 接口隔離原則 ························.23
2.4.1 未遵循接口隔離原則的代碼示例 ·····················.24
2.4.2 遵循接口隔離原則的代碼示例 ···························.25
2.5 依賴倒置原則 ························.27
2.5.1 未遵循依賴倒置原則的代碼示例 ·····················.28
2.5.2 遵循依賴倒置原則的代碼示例 ···························.29
2.6 迪米特法則 ···························.30
2.6.1 未遵循迪米特法則的代碼示例 ···························.32
2.6.2 遵循迪米特法則的代碼示例 ···························.33
2.7 設(shè)計原則并非教條 ......................... 36
2.8 小結(jié) ................................................. 36
第3章 遵守編程規(guī)范 ·························.38
3.1 編程規(guī)范的多維內(nèi)涵 ···············.38
3.2 編程規(guī)范的重要性 ··················.39
3.3 編程規(guī)范核心要素解析 ············.41
3.4 制定高效編程規(guī)范 ··················.43
3.5 規(guī)范執(zhí)行比規(guī)范本身更重要 ······.47
3.6 解讀業(yè)界優(yōu)秀編程規(guī)范 ············.49
3.7 小結(jié) ····································.50
第4章 編寫可維護(hù)性代碼 ···················.51
4.1 為什么“代碼可運(yùn)行”遠(yuǎn)遠(yuǎn)不夠 ··.51
4.2 什么是可維護(hù)性代碼 ···············.52
4.3 如何編寫可維護(hù)性代碼 ············.55
4.3.1 命名的藝術(shù):讓變量和函數(shù)自述身份 ·····················.55
4.3.2 掌控邏輯控制流程和數(shù)據(jù)流向 ···························.60
4.3.3 設(shè)計包結(jié)構(gòu) ··················.67
4.3.4 異常管理 ·····················.76
4.3.5 提高代碼的可測試性 ······.80
4.3.6 使用設(shè)計模式 ···············.85
4.4 代碼評審 ······························.86
4.5 小結(jié) ····································.89
第5章 模塊化編程 ···························.90
5.1 模塊:分而治之 ·····················.90
5.2 接口:連接的橋梁 ··················.91
5.3 抽象:提取共性,減少重復(fù) ······.95
5.4 深模塊和淺模塊 ·····················.96
5.4.1 深模塊 ························.96
5.4.2 淺模塊 ························.97
5.5 封裝和信息隱藏 ·····················.98
5.6 組合優(yōu)于繼承 ························.99
5.7 依賴注入和控制反轉(zhuǎn) ··············.103
5.8 小結(jié) ···································.108
第6章 代碼是數(shù)據(jù)的映射 ·················.109
6.1 以業(yè)務(wù)邏輯為核心的編程 ········.109
6.2 以數(shù)據(jù)結(jié)構(gòu)為核心的編程 ········.111
6.3 應(yīng)用數(shù)據(jù)結(jié)構(gòu)優(yōu)化代碼 ···········.114
6.3.1 基本數(shù)據(jù)結(jié)構(gòu) ··············.115
6.3.2 高效使用Map結(jié)構(gòu) ·······.119
6.3.3 使用結(jié)構(gòu)體優(yōu)化重復(fù)代碼 ··························.121
6.3.4 使用接口優(yōu)化代碼擴(kuò)展性 ·······················.122
6.4 業(yè)務(wù)邏輯驅(qū)動編程和數(shù)據(jù)結(jié)構(gòu)驅(qū)動編程 ·····························.124
6.5 小結(jié) ............................................... 124
第7章 選擇編程范式 ·······················.125
7.1 什么是編程范式 ····················.125
7.2 為什么要掌握編程范式 ···········.125
7.3 編程范式分類 ·······················.126
7.4 主流編程范式解析 ·················.128
7.4.1 過程式編程 ·················.128
7.4.2 面向?qū)ο缶幊?··············.132
7.4.3 函數(shù)式編程 ·················.137
7.4.4 邏輯式編程 ·················.142
7.4.5 編程范式對比 ··············.145
7.5 對編程范式的思考 ················.146
7.6 小結(jié) ··································.147
第8章 分離業(yè)務(wù)邏輯和技術(shù)實(shí)現(xiàn) ········. 148
8.1 業(yè)務(wù)邏輯和技術(shù)實(shí)現(xiàn) ·············.148
8.2 分離業(yè)務(wù)邏輯代碼和技術(shù)實(shí)現(xiàn)代碼 ··································.150
8.3 關(guān)注點(diǎn)分離 ·························.151
8.4 領(lǐng)域驅(qū)動設(shè)計:解耦業(yè)務(wù)邏輯的利器 ··································.153
8.4.1 什么是領(lǐng)域驅(qū)動設(shè)計 ····.153
8.4.2 領(lǐng)域驅(qū)動設(shè)計的關(guān)鍵概念 ·························.153
8.4.3 應(yīng)用領(lǐng)域驅(qū)動設(shè)計分離業(yè)務(wù)邏輯和技術(shù)實(shí)現(xiàn) ····.156
8.5 實(shí)踐中的挑戰(zhàn)和解決方案 ·······.162
8.6 小結(jié) ··································.163
第9章 測試驅(qū)動開發(fā) ·······················. 165
9.1 軟件測試概述 ······················.165
9.2 讓測試成為編碼的起點(diǎn) ··········.168
9.3 單元測試實(shí)踐 ······················.169
9.3.1 單元測試的優(yōu)勢 ··········.169
9.3.2 如何編寫單元測試 ·······.170
9.4 小結(jié) ··································.182
第10章 優(yōu)化代碼性能 ·····················.183
10.1 性能優(yōu)化時機(jī) ·····················. 183
10.2 數(shù)據(jù)驅(qū)動的優(yōu)化決策 ············. 184
10.3 性能優(yōu)化策略 ·····················. 186
10.4 性能優(yōu)化實(shí)踐 ·····················. 188
10.4.1 優(yōu)化計算效率············.189
10.4.2 優(yōu)化內(nèi)存資源············.193
10.4.3 優(yōu)化I/O操作 ············.197
10.5 代碼可維護(hù)性和性能的平衡 ···. 202
10.6 小結(jié) ·································. 202
第11章 持續(xù)重構(gòu)代碼 ·····················.204
11.1 重構(gòu)為代碼注入生命力 ·········. 204
11.2 為什么重構(gòu)不可忽視 ············. 205
11.3 何時重構(gòu) ···························. 206
11.4 重構(gòu)實(shí)踐 ···························.209
11.5 識別代碼的“壞味道” ·········.211
11.5.1 重復(fù)代碼 ··················.211
11.5.2 長函數(shù) ·····················.214
11.5.3 過長的參數(shù)列表 ·········.216
11.5.4 過大的類 ··················.217
11.5.5 過長的消息鏈 ············.219
11.5.6 冗余類 ·····················.220
11.5.7 過度抽象 ··················.222
11.5.8 神秘命名 ··················.223
11.5.9 隱式依賴 ··················.224
11.6 重構(gòu)和重寫 ························.225
11.7 小結(jié) ·································.225
第12章 文檔、注釋和知識共享 ··········.226
12.1 讓文檔成為團(tuán)隊的知識庫 ······.226
12.1.1 文檔的必要性 ············.226
12.1.2 明確文檔類型 ············.227
12.1.3 文檔的結(jié)構(gòu)和組織······.234
12.1.4 文檔的維護(hù)和更新······.236
12.1.5 提高文檔的可訪問性和易用性·····················.236
12.2 讓注釋為代碼加分 ···············. 237
12.2.1 統(tǒng)一注釋格式············.238
12.2.2 注釋闡明代碼意圖,而非代碼內(nèi)容············.240
12.2.3 注釋描述代碼中不明顯的部分·····················.242
12.2.4 區(qū)分低級注釋和高級注釋························.244
12.2.5 同步更新注釋和代碼···.246
12.3 知識共享和團(tuán)隊協(xié)作 ············. 247
12.3.1 促進(jìn)知識共享············.247
12.3.2 提高團(tuán)隊協(xié)作效率······.249
12.4 小結(jié) ·································. 250