現(xiàn)代C++軟件架構(gòu):方法與實踐
定 價:139 元
叢書名:架構(gòu)師書庫
- 作者:[美]艾德里安·奧斯特洛夫斯基,[波]彼得亞雷·加奇科夫斯基
- 出版時間:2023/10/1
- ISBN:9787111736769
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP312.8C++
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書結(jié)合現(xiàn)代C++特性,詳細介紹軟件架構(gòu)的實用方法及實踐,探索了如何在單體應(yīng)用程序中使用成熟的設(shè)計模式,如何使應(yīng)用程序具有健壯性、安全性、高性能和可維護性,以及如何使用面向服務(wù)的架構(gòu)、微服務(wù)、容器和無服務(wù)器計算等架構(gòu)模式構(gòu)建連接多個單體應(yīng)用程序的高級服務(wù)。全書共分為四部分:第一部分包含第1~3章,介紹軟件架構(gòu)的概念及組件,包括軟件架構(gòu)的重要性和良好的設(shè)計原則、架構(gòu)風格、功能性和非功能性需求;第二部分包含第4~7章,介紹C++軟件的開發(fā)和設(shè)計,包括架構(gòu)與系統(tǒng)設(shè)計、C++語言特性、設(shè)計模式,以及構(gòu)建和打包;第三部分包含第8~11章,介紹架構(gòu)的質(zhì)量屬性,包括測試、持續(xù)集成和持續(xù)部署、安全性、性能;第四部分包含第12~15章,介紹云原生設(shè)計原則,包括面向服務(wù)的架構(gòu)、微服務(wù)、容器、云原生設(shè)計。本書適合C++程序員、架構(gòu)師等相關(guān)技術(shù)人員閱讀。
軟件架構(gòu)是指復(fù)雜應(yīng)用程序的高級設(shè)計。它像我們使用的編程語言一樣不斷進化,F(xiàn)代C++允許開發(fā)人員在不犧牲可讀性和可維護性的情況下,用高級語言編寫高性能應(yīng)用程序。如果你正在使用現(xiàn)代C++,那么本書將幫助你把相關(guān)知識應(yīng)用到工作中,設(shè)計分布式大規(guī)模應(yīng)用程序。
本書首先快速介紹架構(gòu)概念,包括已建立的模式和不斷上升的趨勢;然后,詳細闡釋軟件架構(gòu)的概念及其組件;接著,深入探索應(yīng)用程序架構(gòu)中涉及的設(shè)計概念和軟件開發(fā)中涉及的模式,詳細介紹構(gòu)建、打包、集成和部署組件的方法,以及架構(gòu)的不同質(zhì)量屬性,例如可維護性、可重用性、可測試性、性能、可伸縮性和安全性;最后,概述分布式系統(tǒng),例如面向服務(wù)的架構(gòu)、微服務(wù)和云原生設(shè)計,并簡單介紹如何在應(yīng)用程序開發(fā)中應(yīng)用它們。
學完本書內(nèi)容,你將能夠使用現(xiàn)代C++和相關(guān)工具構(gòu)建分布式服務(wù),并根據(jù)客戶的需求交付解決方案。
Preface前 言
現(xiàn)代C++允許程序員用高級語言編寫高性能的應(yīng)用程序,而不犧牲可讀性和可維護性。不過,軟件架構(gòu)還不僅僅是編程語言的問題,還包括很多其他的方面。在本書中,我們將展示如何設(shè)計和構(gòu)建健壯、可擴展且性能良好的應(yīng)用程序。
通過對基本概念、實例和自測問題的逐步解釋,你將首先理解架構(gòu)的重要性并學習一個實際應(yīng)用程序的案例。
你將學習如何在單體應(yīng)用程序級別使用成熟的設(shè)計模式,探索如何使應(yīng)用程序具有健壯性、安全性、高性能和可維護性。然后,你將使用面向服務(wù)的架構(gòu)、微服務(wù)、容器和無服務(wù)器(serverless)計算技術(shù)等架構(gòu)模式構(gòu)建連接多個單體應(yīng)用程序的高級服務(wù)。
最后,你將能夠使用現(xiàn)代C++和相關(guān)工具來構(gòu)建分布式服務(wù),以提供客戶滿意的解決
方案。
你是否有興趣成為一名軟件架構(gòu)師,或者想了解更多關(guān)于架構(gòu)的最新趨勢?如果是,那么本書應(yīng)該能幫助你!
讀者定位
使用現(xiàn)代C++的開發(fā)人員能夠?qū)⑺麄兊闹R與這本實用的軟件架構(gòu)指南結(jié)合到一起。本書以一種側(cè)重實踐的方式來實現(xiàn)相關(guān)方法,這可以讓你立即運用本書的知識來提高工作效率。
本書的主要內(nèi)容
第1章講述為什么設(shè)計軟件。
第2章涵蓋在架構(gòu)方面可以采取的不同方式。
第3章探討對客戶需求的理解。
第4章探討如何創(chuàng)建有效的軟件解決方案。
第5章介紹如何使用原生C++。
第6章重點介紹現(xiàn)代C++習語和有用的代碼構(gòu)造。
第7章介紹如何把代碼部署到生產(chǎn)環(huán)境。
第8章介紹如何比客戶先發(fā)現(xiàn)bug。
第9章介紹自動化軟件發(fā)布的現(xiàn)代方法。
第10章探討如何確保系統(tǒng)不容易被破壞。
第11章關(guān)注性能。C++應(yīng)該更快,它能更快嗎?
第12章介紹如何基于服務(wù)來構(gòu)建系統(tǒng)。
第13章只關(guān)注一件事,即如何設(shè)計微服務(wù)。
第14章提供一個構(gòu)建、打包和運行應(yīng)用程序的統(tǒng)一接口。
第15章超越傳統(tǒng)的基礎(chǔ)設(shè)施,探索云原生設(shè)計。
如何充分利用這本書
本書中的代碼示例大多是針對GCC 10編寫的。盡管C++20的某些特性可能在舊版本的編譯器中缺失,但這些示例也應(yīng)該兼容Clang或微軟的Visual C++。為了盡可能接近作者的開發(fā)環(huán)境,我們建議你在類Linux環(huán)境中使用Nix(https://nixos.org/download.html)和direnv(https://direnv.net/)。如果你在包含代碼示例的目錄中運行direnv allow,那么這兩個工具將會配置好編譯器和支持包。
如果沒有Nix和direnv,就不能保證這些示例正常工作。如果使用的是macOS,Nix應(yīng)該可以正常工作。如果使用的是Windows,那么(AWS的)Linux 2的Windows子系統(tǒng)是一個使用帶Nix的Linux開發(fā)環(huán)境的好方法。
要安裝這兩個工具,需要運行以下命令:
在執(zhí)行上述命令后,Nix應(yīng)該下載并安裝所有必要的依賴項。這雖然需要一段時間,但有助于確保我們使用的是完全相同的工具。
下載示例代碼文件
你可以從GitHub地址https://github.com/PacktPublishing/Software-Architecture-with-Cpp 下載本書的示例代碼文件。必要時,我們將在現(xiàn)有的GitHub代碼庫上對代碼進行更新。
下載彩色圖片
我們還提供了一個PDF文件,里面有本書中使用的屏幕截圖的彩色圖片,詳見地址https://static.packt-cdn.com/downloads/9781838554590_ColorImages.pdf。
排版約定
本書中使用的文本格式約定如下。
代碼體文本:代表文本中的代碼、數(shù)據(jù)庫表名稱、文件夾名、文件名、文件擴展名、路徑名、用戶輸入和Twitter句柄,例如“前兩個字段(openapi和info)是描述文檔的元
數(shù)據(jù)”。
代碼塊的設(shè)置如下:
代表警告或重要的提示事項。
代表提示和技巧。
目 錄Contents
前 言
第一部分 軟件架構(gòu)的概念和組成部分
第1章 軟件架構(gòu)的重要性和良好的
設(shè)計原則 2
1.1 技術(shù)要求 2
1.2 軟件架構(gòu) 2
1.3 適當架構(gòu)的重要性 3
1.3.1 軟件腐朽 4
1.3.2 意外架構(gòu) 4
1.4 優(yōu)秀架構(gòu)的基本原理 4
1.4.1 架構(gòu)上下文 4
1.4.2 相關(guān)方 4
1.4.3 業(yè)務(wù)和技術(shù)環(huán)境 5
1.5 使用敏捷原則開發(fā)架構(gòu) 5
1.6 C++的哲學思想 7
1.7 SOLID和DRY原則 9
1.7.1 單一責任原則 9
1.7.2 開放封閉原則 9
1.7.3 里氏替換原則 10
1.7.4 接口隔離原則 11
1.7.5 依賴倒置原則 12
1.7.6 DRY原則 15
1.8 耦合和內(nèi)聚 16
1.8.1 耦合 16
1.8.2 內(nèi)聚 17
1.9 總結(jié) 19
問題 19
進一步閱讀 19
第2章 架構(gòu)風格 20
2.1 技術(shù)要求 20
2.2 有狀態(tài)風格和無狀態(tài)風格 20
2.3 單體風格 23
2.4 服務(wù)和微服務(wù) 24
2.5 基于事件的架構(gòu) 27
2.5.1 基于事件的常見拓撲結(jié)構(gòu) 28
2.5.2 事件溯源 29
2.6 分層架構(gòu) 30
2.7 基于模塊的架構(gòu) 32
2.8 總結(jié) 32
問題 33
進一步閱讀 33
第3章 功能性和非功能性需求 34
3.1 從源代碼生成文檔的技術(shù)
要求 34
3.2 需求的類型 34
3.2.1 功能性需求 35
3.2.2 非功能性需求 35
3.3 架構(gòu)級重要需求 36
3.3.1 指示信號 37
3.3.2 阻礙以及應(yīng)對方法 37
3.4 從各種來源收集需求 38
3.4.1 了解上下文 38
3.4.2 了解現(xiàn)有文檔 39
3.4.3 了解相關(guān)方 39
3.4.4 收集來自相關(guān)方的需求 39
3.5 文檔化需求 40
3.5.1 文檔化上下文 40
3.5.2 文檔化范圍 41
3.5.3 文檔化功能性需求 41
3.5.4 文檔化非功能性需求 42
3.5.5 管理文檔的版本歷史 42
3.5.6 文檔化敏捷項目中的需求 43
3.5.7 其他部分 43
3.6 文檔化系統(tǒng)架構(gòu) 44
3.6.1 4+1模型 44
3.6.2 C4模型 48
3.6.3 文檔化敏捷項目中的架構(gòu) 51
3.7 選擇文檔的正確視圖 51
3.7.1 功能視圖 52
3.7.2 信息視圖 52
3.7.3 并發(fā)視圖 53
3.7.4 開發(fā)視圖 53
3.7.5 部署和操作視圖 54
3.8 生成文檔 55
3.8.1 生成需求文檔 55
3.8.2 從代碼生成圖 55
3.8.3 從代碼生成API文檔 55
3.9 總結(jié) 60
問題 60
進一步閱讀 61
第二部分 C++軟件的設(shè)計和開發(fā)
第4章 架構(gòu)與系統(tǒng)設(shè)計 64
4.1 技術(shù)要求 64
4.2 分布式系統(tǒng)的特性 64
4.2.1 不同的服務(wù)模型以及何時
使用它們 65
4.2.2 避免分布式計算的錯誤假設(shè) 67
4.2.3 CAP定理和最終的一致性 70
4.3 系統(tǒng)容錯性和可用性 72
4.3.1 計算系統(tǒng)的可用性 72
4.3.2 構(gòu)建容錯系統(tǒng) 73
4.3.3 故障檢測 75
4.3.4 減少故障的影響 76
4.4 系統(tǒng)集成 78
4.4.1 管道和過濾器模式 78
4.4.2 消費者競爭 78
4.4.3 從舊系統(tǒng)過渡 79
4.5 在規(guī);渴饡r保持性能 80
4.5.1 CQRS和事件溯源 80
4.5.2 緩存 82
4.6 系統(tǒng)部署 84
4.6.1 邊車模式 84
4.6.2 零停機時間部署 87
4.6.3 外部配置存儲 89
4.7 管理API 89
4.8 總結(jié) 90
問題 90
進一步閱讀 91
第5章 利用C++語言特性 92
5.1 技術(shù)要求 92
5.2 設(shè)計優(yōu)秀的API 93
5.2.1 利用RAII 93
5.2.2 指定C++容器接口 93
5.2.3 在接口中使用指針 96
5.2.4 指定前置條件和后置條件 97
5.2.5 使用內(nèi)聯(lián)命名空間 97
5.2.6 使用std::optional 98
5.3 編寫聲明式代碼 99
5.3.1 展示特色商品 101
5.3.2 標準范圍介紹 105
5.4 在編譯時移動計算 107
5.5 利用安全類型的力量 108
5.6 編寫模塊化的C++代碼 112
5.7 總結(jié) 114
問題 114
進一步閱讀 115
第6章 設(shè)計模式和C++ 116
6.1 技術(shù)要求 116
6.2 C++編程習語 116
6.2.1 使用RAII保護自動執(zhí)行
作用域的退出操作 117
6.2.2 管理可復(fù)制性和可移動性 117
6.2.3 使用隱藏的友元 119
6.2.4 使用復(fù)制和交換習語提供
異常安全性 120
6.2.5 編寫niebloid 121
6.2.6 基于策略的設(shè)計習語 123
6.3 奇異遞歸模板模式 124
6.3.1 知道何時使用動態(tài)多態(tài)性和
靜態(tài)多態(tài)性 124
6.3.2 實現(xiàn)靜態(tài)多態(tài)性 125
6.3.3 插曲—使用類型擦除技術(shù) 127
6.4 創(chuàng)建對象 128
6.4.1 使用工廠 128
6.4.2 使用構(gòu)建器 132
6.5 在C++中跟蹤狀態(tài)和訪問對象 135
6.6 有效地處理內(nèi)存 138
6.6.1 使用SSO/SOO減少動態(tài)
分配 138
6.6.2 通過COW來節(jié)省內(nèi)存 139
6.6.3 使用多態(tài)分配器 139
6.7 總結(jié) 143
問題 143
進一步閱讀 144
第7章 構(gòu)建和打包 145
7.1 技術(shù)要求 145
7.2 充分利用編譯器 145
7.2.1 使用多個編譯器 146
7.2.2 減少構(gòu)建時間 146
7.2.3 查找潛在的代碼問題 149
7.2.4 使用以編譯器為中心的
工具 150
7.3 抽象構(gòu)建過程 151
7.3.1 認識CMake 151
7.3.2 使用生成器表達式 154
7.4 使用外部模塊 155
7.4.1 獲取依賴項 155
7.4.2 使用查找腳本 156
7.4.3 編寫查找腳本 157
7.4.4 使用Conan軟件包管理器 159
7.4.5