大規(guī)模C++軟件開(kāi)發(fā) 卷1:過(guò)程與架構(gòu)
定 價(jià):149.8 元
- 作者:[美]約翰·拉科斯(John Lakos)
- 出版時(shí)間:2023/8/1
- ISBN:9787115609779
- 出 版 社:人民郵電出版社
- 中圖法分類:TP312.8
- 頁(yè)碼:540
- 紙張:
- 版次:01
- 開(kāi)本:16開(kāi)
本書(shū)通過(guò)具體示例演示大規(guī)模C++開(kāi)發(fā)的基本設(shè)計(jì)設(shè)想,為各種規(guī)模的項(xiàng)目奠定基礎(chǔ),并演示成功進(jìn)行大規(guī)模實(shí)際開(kāi)發(fā)所需的過(guò)程、方法、技術(shù)和工具。通過(guò)閱讀本書(shū),讀者可以逐步改變自己的設(shè)計(jì)和開(kāi)發(fā)方法。本書(shū)旨在使用軟件從業(yè)人員熟悉的C++構(gòu)件來(lái)解決現(xiàn)實(shí)問(wèn)題,同時(shí)確定(并激發(fā))現(xiàn)代C++替代方案。作者利用超過(guò)30年的構(gòu)建大規(guī)模、關(guān)鍵任務(wù)的企業(yè)系統(tǒng)的實(shí)踐經(jīng)驗(yàn),展示了如何創(chuàng)建和增長(zhǎng)軟件資本。
本書(shū)專為有經(jīng)驗(yàn)的C++軟件開(kāi)發(fā)者和系統(tǒng)設(shè)計(jì)師編寫(xiě),從事大型軟件開(kāi)發(fā)工作的架構(gòu)師或項(xiàng)目負(fù)責(zé)人等也可以通過(guò)閱讀本書(shū)解決實(shí)際工作中的問(wèn)題。
·熱銷圖書(shū)作者約翰·拉科斯(John Lakos)新作,將其在C++領(lǐng)域超過(guò)30年的經(jīng)驗(yàn)匯聚于此,幫助讀者學(xué)到實(shí)用的知識(shí)和技能。
·大規(guī)模C++編程全解,內(nèi)容豐富。從設(shè)計(jì)理念到開(kāi)發(fā)過(guò)程,從方法論到技術(shù)工具,無(wú)一不包,讓讀者深入了解大規(guī)模C++軟件開(kāi)發(fā)的各個(gè)方面。
·不僅介紹理論知識(shí),還通過(guò)具體示例展示了開(kāi)發(fā)實(shí)踐。在實(shí)際開(kāi)發(fā)應(yīng)用中,提高開(kāi)發(fā)效率和代碼質(zhì)量。
·系統(tǒng)介紹設(shè)計(jì)概念,為大規(guī)模的項(xiàng)目奠定基礎(chǔ)。無(wú)論你是C++初學(xué)者還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,都會(huì)受益匪淺。
約翰·拉科斯(John Lakos),《大規(guī)模C++程序設(shè)計(jì)》(Large-Scale C++ Software Design)一書(shū)的作者,任職于彭博有限合伙企業(yè),擔(dān)任高級(jí)架構(gòu)師,同時(shí)是全球C++軟件開(kāi)發(fā)顧問(wèn)。2001年他成立了彭博的BDE工作組,按照他的基于組件的方法論、過(guò)程和架構(gòu)來(lái)開(kāi)發(fā)細(xì)粒度的、可復(fù)用的C++軟件。他是ACCU、C++Now、CppCon和Meeting C++等業(yè)內(nèi)技術(shù)大會(huì)的?,經(jīng)常發(fā)表技術(shù)演講。他自2006年開(kāi)始任C++標(biāo)準(zhǔn)委員會(huì)的投票成員,新一代C++的成型有他的一份功勞,包括C++11的值語(yǔ)義、C++17的PMR分配器和C++20的模塊。他于1996年出版的《大規(guī)模C++程序設(shè)計(jì)》一書(shū)是用C++做大型系統(tǒng)設(shè)計(jì)的開(kāi)山之作,至今還是這個(gè)領(lǐng)域的常用參考書(shū)。
第0章 動(dòng)機(jī) 1
0.1 目標(biāo):進(jìn)度更快、產(chǎn)品更好、預(yù)算更低 1
0.2 應(yīng)用軟件與庫(kù)軟件 3
0.3 協(xié)作式軟件與可復(fù)用軟件 8
0.4 層次化可復(fù)用軟件 12
0.5 易延展軟件與穩(wěn)定軟件 16
0.6 物理設(shè)計(jì)的關(guān)鍵作用 24
0.7 物理形式統(tǒng)一的軟件:組件 25
0.8 對(duì)層次化復(fù)用的量化:一個(gè)類比 32
0.9 軟件資本 51
0.10 增大投入 57
0.11 保持警覺(jué) 62
0.12 小結(jié) 65
第 1章 編譯器、連接器和組件 70
1.1 知識(shí)就是力量:細(xì)節(jié)決定成敗 70
1.1.1 “Hello World!” 70
1.1.2 創(chuàng)建C++程序 71
1.1.3 頭文件的作用 72
1.2 C++程序的編譯和連接 73
1.2.1 構(gòu)建流程:編譯器和連接器的使用 73
1.2.2 目標(biāo)文件(.o)的經(jīng)典原子性 77
1.2.3 .o文件中的節(jié)和弱符號(hào) 79
1.2.4 靜態(tài)庫(kù) 79
1.2.5 “單例”注冊(cè)表的例子 81
1.2.6 庫(kù)間依賴 84
1.2.7 連接順序和構(gòu)建時(shí)行為 87
1.2.8 連接順序和運(yùn)行時(shí)行為 87
1.2.9 共享(動(dòng)態(tài)連接)庫(kù) 88
1.3 聲明、定義和連結(jié) 88
1.3.1 聲明與定義 88
1.3.2 (邏輯的)連結(jié)與(物理的)連接 92
1.3.3 需要了解連接工具 92
1.3.4 物理“連結(jié)”的另一種定義:綁結(jié) 92
1.3.5 連接器運(yùn)作的更多細(xì)節(jié) 93
1.3.6 對(duì)一些需要全程序范圍內(nèi)地址唯一的實(shí)體的介紹 94
1.3.7 客戶編譯器需要看到定義的源代碼的構(gòu)件 96
1.3.8 聲明并不一定要帶上定義才能起作用 97
1.3.9 客戶編譯器通常需要看到類定義 97
1.3.10 客戶編譯器必須看到定義的源代碼的其他實(shí)體 98
1.3.11 枚舉具有外連結(jié),但又會(huì)怎樣 98
1.3.12 內(nèi)聯(lián)函數(shù)略有特殊 99
1.3.13 函數(shù)模板和類模板 99
1.3.14 函數(shù)模板和顯式特化 100
1.3.15 類模板及其偏特化 104
1.3.16 extern模板 106
1.3.17 用工具來(lái)理解單一定義規(guī)則和綁結(jié) 108
1.3.18 命名空間 108
1.3.19 對(duì)const實(shí)體默認(rèn)連結(jié)的闡釋 109
1.3.20 本節(jié)小結(jié) 109
1.4 頭文件 111
1.5 包含指令和包含保護(hù)符 118
1.5.1 包含指令 118
1.5.2 內(nèi)置的包含保護(hù)符 119
1.5.3 外置的包含保護(hù)符(已廢棄) 121
1.6 從.h/.cpp文件對(duì)到組件 123
1.6.1 組件特性1 123
1.6.2 組件特性2 125
1.6.3 組件特性3 126
1.7 符號(hào)和術(shù)語(yǔ) 128
1.7.1 概要 128
1.7.2 Is-A邏輯關(guān)系 130
1.7.3 Uses-In-The-Interface邏輯關(guān)系 130
1.7.4 Uses-In-The-Implementation邏輯關(guān)系 131
1.7.5 Uses-In-Name-Only邏輯關(guān)系和協(xié)議類 133
1.7.6 In-Structure-Only(ISO)協(xié)作式邏輯關(guān)系 135
1.7.7 受約束模板和接口繼承的相似之處 136
1.7.8 受約束模板和接口繼承的不同之處 137
1.7.9 3種“繼承型”關(guān)系各有所長(zhǎng) 138
1.7.10 給模板的類型約束編寫(xiě)注釋 139
1.7.11 本節(jié)小結(jié) 140
1.8 Depends-On關(guān)系 141
1.9 隱含依賴 144
1.10 層級(jí)編號(hào) 149
1.11 抽取實(shí)際的依賴 151
組件特性4 152
1.12 小結(jié) 153
第 2章 打包和設(shè)計(jì)規(guī)則 159
2.1 觀全貌 159
2.2 物理聚合 161
2.2.1 物理聚合的一般定義 161
2.2.2 物理聚合譜的小端 162
2.2.3 物理聚合譜的大端 162
2.2.4 聚合的概念原子性 163
2.2.5 聚合依賴的廣義定義 163
2.2.6 架構(gòu)顯著性 164
2.2.7 一般發(fā)布單元的架構(gòu)顯著性 164
2.2.8 發(fā)布單元中具有架構(gòu)顯著性的部分 164
2.2.9 發(fā)布單元的什么部分不是架構(gòu)顯著的 164
2.2.10 組件“自然地”具有架構(gòu)顯著性 164
2.2.11 組件必須是一對(duì).h/.cpp文件嗎 165
2.2.12 何時(shí)不宜寫(xiě)成一對(duì).h/.cpp文件 165
2.2.13 對(duì).cpp文件的劃分僅是組織上的改變 165
2.2.14 實(shí)體清單和可容許依賴 165
2.2.15 對(duì)可容許依賴的包絡(luò)的表達(dá)需求 167
2.2.16 物理層次需平衡得當(dāng) 167
2.2.17 不僅要層次化,而且要講究平衡 168
2.2.18 物理聚合超過(guò)3級(jí)即算過(guò)多 169
2.2.19 即使是大型系統(tǒng),3級(jí)也已足夠 170
2.2.20 發(fā)布單元總有2級(jí)或3級(jí)的物理聚合 171
2.2.21 平衡得當(dāng)?shù)?級(jí)聚合就已足夠 171
2.2.22 發(fā)布單元應(yīng)該是最為架構(gòu)顯著的 171
2.2.23 架構(gòu)顯著的名稱必須唯一 171
2.2.24 不要出現(xiàn)循環(huán)物理依賴 172
2.2.25 本節(jié)小結(jié) 173
2.3 邏輯連貫和物理連貫 173
2.4 邏輯名稱銜接和物理名稱銜接 175
2.4.1 過(guò)去對(duì)命名空間污染的應(yīng)對(duì)措施 175
2.4.2 名稱務(wù)必唯一,銜接的命名有益于人 175
2.4.3 既不銜接又不有助記憶的命名荒謬至極 176
2.4.4 需要相互銜接的名稱 177
2.4.5 過(guò)去/現(xiàn)在對(duì)包的定義 177
2.4.6 使用點(diǎn)就應(yīng)足夠敲定位置 177
2.4.7 專有軟件須有企業(yè)級(jí)命名空間 182
2.4.8 邏輯構(gòu)件署名應(yīng)錨定于其組件 182
2.4.9 在包級(jí)命名空間的作用域中只有類、結(jié)構(gòu)體和自由運(yùn)算符 183
2.4.10 包的前綴命名不僅僅是編程風(fēng)格 189
2.4.11 包前綴即其所在包組名 192
2.4.12 using指令和聲明往往是壞主意 193
2.4.13 本節(jié)小結(jié) 196
2.5 組件源代碼的組織 196
2.6 組件設(shè)計(jì)規(guī)則 202
2.7 組件私有類和附屬組件 219
2.7.1 組件私有類 220
2.7.2 有幾種實(shí)現(xiàn)方案可待選擇 220
2.7.3 下劃線的約定用法 220
2.7.4 使用組件私有類的經(jīng)典案例 224
2.7.5 附屬組件 227
2.7.6 本節(jié)小結(jié) 229
2.8 包 229
2.8.1 用包來(lái)分解子系統(tǒng) 229
2.8.2 包間循環(huán)是不好的 234
2.8.3 布置、作用域和規(guī)模是首要考量 235
2.8.4 包前綴的唯一性對(duì)溝通大有裨益 236
2.8.5 本節(jié)小結(jié) 238
2.9 包組 238
2.9.1 物理聚合的第三層級(jí) 238
2.9.2 在部署時(shí)對(duì)包組的組織 245
2.9.3 在實(shí)踐中如何使用包組 245
2.9.4 去中心化的(自治的)包的創(chuàng)建 248
2.9.5 本節(jié)小結(jié) 249
2.10 包和包組的命名 249
2.10.1 平鋪直敘的包名不一定好 249
2.10.2 包組的名稱 250
2.10.3 包的名稱 250
2.10.4 本節(jié)小結(jié) 252
2.11 子包 252
2.12 遺留軟件、開(kāi)源軟件和第三方軟件 254
2.13 應(yīng)用 255
2.14 層次化可測(cè)試性的需求 258
2.14.1 將本書(shū)的方法論運(yùn)用于細(xì)粒度的單元測(cè)試中 258
2.14.2 本節(jié)安排(還有卷2及特別是卷3的引子) 258
2.14.3 測(cè)試要能層次化地推進(jìn) 258
2.14.4 測(cè)試時(shí)的局部組件依賴的相對(duì)導(dǎo)入 263
2.14.5 可容許的跨包的測(cè)試驅(qū)動(dòng)程序依賴 266
2.14.6 盡量減少測(cè)試驅(qū)動(dòng)程序?qū)ν獠凯h(huán)境的依賴 268
2.14.7 堅(jiān)持統(tǒng)一(獨(dú)立)的測(cè)試驅(qū)動(dòng)程序調(diào)用接口 269
2.14.8 本節(jié)小結(jié) 270
2.15 從開(kāi)發(fā)到部署 271
2.15.1 不應(yīng)在軟件的靈活部署方面讓步 271
2.15.2 .h和.o文件名的唯一性非常關(guān)鍵 271
2.15.3 在開(kāi)發(fā)過(guò)程中軟件組織會(huì)有所變化 271
2.15.4 在全公司范圍內(nèi)讓名稱保持唯一有助于重構(gòu) 272
2.15.5 在構(gòu)建過(guò)程中軟件組織都可能有所變化 272
2.15.6 即使在正常情況下部署中仍需要靈活性 272
2.15.7 讓定制化部署成為可能是靈活性之價(jià)值的重要體現(xiàn) 273
2.15.8 頭文件中風(fēng)格化呈現(xiàn)的靈活性 273
2.15.9 庫(kù)的部署方式不應(yīng)架構(gòu)顯著 273
2.15.10 出于工程原因?qū)σ巡渴鸬能浖M(jìn)行劃分 274
2.15.11 出于業(yè)務(wù)原因?qū)σ巡渴鸬能浖M(jìn)行劃分 275
2.15.12 本節(jié)小結(jié) 276
2.16 元數(shù)據(jù) 276
2.16.1 元數(shù)據(jù)即“法令” 277
2.16.2 元數(shù)據(jù)的類型 277
2.16.3 元數(shù)據(jù)的呈現(xiàn) 281
2.16.4 本節(jié)小結(jié) 282
2.17 小結(jié) 283
第3章 物理設(shè)計(jì)和分解 290
3.1 從物理的角度思考 290
3.1.1 純經(jīng)典的(邏輯的)軟件設(shè)計(jì)是幼稚的 291
3.1.2 組件充當(dāng)細(xì)粒度的模塊 291
3.1.3 軟件的設(shè)計(jì)空間是有方向性的 291
3.1.4 軟件有其絕對(duì)位置 292
3.1.5 并置與否的準(zhǔn)則應(yīng)該看本質(zhì),不應(yīng)流于表面 293
3.1.6 不規(guī)整的非初等功能搜尋十分麻煩 293
3.1.7 包的作用域是一項(xiàng)重要的設(shè)計(jì)考量 293
3.1.8 禁止循環(huán)物理依賴帶來(lái)的一些限制 295
3.1.9 對(duì)友元的約束有意排除了某些邏輯設(shè)計(jì) 297
3.1.10 一個(gè)有正當(dāng)理由要求包裝的 案例 297
3.1.11 本節(jié)小結(jié) 302
3.2 避免糟糕的物理模塊化 303
3.2.1 有很多糟糕的模塊化準(zhǔn)則,語(yǔ)法是其中之一 303
3.2.2 將用途廣泛的軟件分解并加入庫(kù)中非常重要 303
3.2.3 迫于壓力未能維持應(yīng)用/庫(kù)的模塊化 303
3.2.4 可復(fù)用組件的持續(xù)降級(jí)至關(guān)重要 304
3.2.5 對(duì)應(yīng)用開(kāi)發(fā)者而言,物理依賴不是實(shí)現(xiàn)細(xì)節(jié) 305
3.2.6 迭代器有助于減少初等功能的開(kāi)發(fā)量 309
3.2.7 既要最小也要初等:實(shí)用結(jié)構(gòu)體 309
3.2.8 總結(jié)性示例:封裝型多邊形類接口 309
3.2.9 語(yǔ)義與語(yǔ)法作為模塊化準(zhǔn)則 322
3.2.10 本節(jié)小結(jié) 323
3.3 邏輯相近的事物在物理上應(yīng)分組在一起 324
3.3.1 類并置的4個(gè)明確準(zhǔn)則 324
3.3.2 組件之上的并置 327
3.3.3 何時(shí)讓輔助類供其組件私用 327
3.3.4 模板特化的并置 329
3.3.5 附屬組件的使用 329
3.3.6 將緊密的相互協(xié)作并置于單個(gè)發(fā)布單元中 330
3.3.7 計(jì)算天數(shù)的示例 330
3.3.8 最后的示例:?jiǎn)尉程引用計(jì)數(shù)型函子 336
3.3.9 本節(jié)小結(jié) 344
3.4 避免循環(huán)的連接時(shí)依賴 345
3.5 層級(jí)劃分技術(shù) 351
3.5.1 經(jīng)典層級(jí)劃分技術(shù) 351
3.5.2 升級(jí) 352
3.5.3 降級(jí) 357
3.5.4 不透明指針 359
3.5.5 啞數(shù)據(jù) 365
3.5.6 冗余 367
3.5.7 回調(diào) 371
3.5.8 管理器類 389
3.5.9 分解 391
3.5.10 升級(jí)封裝 392
3.5.11 本節(jié)小結(jié) 407
3.6 避免過(guò)度的連接時(shí)依賴 408
3.6.1 起初分解妥當(dāng)?shù)娜掌陬悤?huì)隨時(shí)間退化 408
3.6.2 將工作日功能添加到日期類中(壞主意) 414
3.6.3 提供一個(gè)物理上整塊式的平臺(tái)適配器(壞主意) 415
3.6.4 本節(jié)小結(jié) 418
3.7 橫展架構(gòu)與分層架構(gòu) 418
3.7.1 另一個(gè)與建筑業(yè)的類比 419
3.7.2 (經(jīng)典的)分層架構(gòu) 419
3.7.3 對(duì)純組合式設(shè)計(jì)加以改進(jìn) 421
3.7.4 最小化累積組件依賴度 421
3.7.5 基于繼承的橫展架構(gòu) 424
3.7.6 橫展架構(gòu)與分層架構(gòu)的測(cè)試 427
3.7.7 本節(jié)小結(jié) 427
3.8 避免不當(dāng)?shù)倪B接時(shí)依賴 428
3.8.1 不當(dāng)?shù)奈锢硪蕾?428
3.8.2 在單一技術(shù)上“押注”(壞主意) 431
3.8.3 本節(jié)小結(jié) 436
3.9 確保物理互操作性 436
3.9.1 妨礙層次化的復(fù)用是壞主意 436
3.9.2 領(lǐng)域特定的條件編譯是壞主意 437
3.9.3 在庫(kù)組件中的應(yīng)用特定的依賴是壞主意 439
3.9.4 約束并排型復(fù)用是壞主意 440
3.9.5 防止故意的濫用不是目的 441
3.9.6 讓組件侵占全局資源是壞主意 441
3.9.7 隱藏頭文件來(lái)實(shí)現(xiàn)邏輯封裝是壞主意 441
3.9.8 可復(fù)用庫(kù)中存在對(duì)不可移植軟件的依賴是壞主意 443
3.9.9 將潛在可復(fù)用軟件隱藏起來(lái)是壞主意 446
3.9.10 本節(jié)小結(jié) 447
3.10 避免不必要的編譯時(shí)依賴 447
3.10.1 封裝不能杜絕編譯時(shí)耦合 447
3.10.2 共享枚舉和編譯時(shí)耦合 449
3.10.3 C++中的編譯時(shí)耦合比C語(yǔ)言中更為普遍 451
3.10.4 避免不必要的編譯時(shí)耦合 451
3.10.5 避免編譯時(shí)耦合的益處及真實(shí)示例 454
3.10.6 本節(jié)小結(jié) 458
3.11 架構(gòu)隔離技術(shù) 458
3.11.1 封裝與隔離的形式化定義 459
3.11.2 用組件的概念闡釋封裝與 隔離 459
3.11.3 整體隔離與部分隔離 460
3.11.4 架構(gòu)顯著的整體隔離技術(shù) 461
3.11.5 純抽象接口(協(xié)議)類 461
3.11.6 完全隔離型具體包裝器 組件 467
3.11.7 過(guò)程接口 471
3.11.8 隔離和動(dòng)態(tài)加載庫(kù) 484
3.11.9 面向服務(wù)的架構(gòu) 484
3.11.10 本節(jié)小結(jié) 485
3.12 用組件進(jìn)行設(shè)計(jì) 485
3.12.1 原先陳述的“需求” 485
3.12.2 實(shí)際(外延)的需求 486
3.12.3 用C++類型表示日期值 487
3.12.4 確定今天的日期值 494
3.12.5 確定給定日期值是否為工作日 496
3.12.6 解析和格式化功能 508
3.12.7 值的傳輸與持久化 510
3.12.8 債券計(jì)息日數(shù)慣例 510
3.12.9 日期數(shù)學(xué) 510
3.12.10 日期和日歷實(shí)用件 513
3.12.11 充實(shí)分解透徹的實(shí)現(xiàn) 515
3.12.12 本節(jié)小結(jié) 527
3.13 小結(jié) 529
結(jié)論 536
參考文獻(xiàn) 538