C++20 代碼整潔之道:可持續軟件開發模式實踐 (原書第2版) (Clean C++20: Sustainable Software Development Patterns and Best Practices, 2/e)

Stephan Roth 譯 連少華//李國誠//吳毓龍//謝鄭逸

買這商品的人也買了...

商品描述

本書全面更新至C++20,介紹如何使用現代C++編寫可維護、可擴展和可持久的軟件。
對於每一個對編寫整潔的C++代碼感興趣的開發人員、軟件架構師或團隊領導來說,這本書都是必需的。
如果你想自學編寫整潔的C++代碼,本書也正是你需要的。
本書旨在幫助所有級別的C++開發人員編寫可理解的、靈活的、可維護的和高效的C++代碼。
即使是經驗豐富的C++開發人員,也將受益匪淺。

目錄大綱

目錄
第1章引言1
1.1 軟件熵2
1.2 為什麼使用C++3
1.3 整潔的代碼4
1.4 C++11—新時代的開始5
1.5 本書適合的讀者6
1.6 本書使用的約定6
1.6.1 擴展內容7
1.6.2 注意事項、提示和警告7
1.6.3 示例代碼7
1.7 相關網站和代碼庫8
1.8 UML圖9
第2章構建安全體系10
2.1 測試的必要性10
2.2 測試入門12
2.3 單元測試14
2.4 關於質量保證16
2.5 良好單元測試的原則16
2.5.1 單元測試代碼的質量16
2.5.2 單元測試的命名17
2.5.3 單元測試的獨立性18
2.5.4 一個測試一個斷言19
2.5.5 單元測試環境的獨立初始化20
2.5.6 不對Getter和Setter做單元測試20
2.5.7 不對第三方代碼做單元測試21
2.5.8 不對外部系統做單元測試21
2.5.9 如何處理數據庫的訪問21
2.5.10 不要混淆測試代碼和產品代碼22
2.5.11 測試必須快速執行24
2.5.12 如何設計測試的輸入數據25
2.5.13 測試替身27
第3章原則31
3.1 什麼是原則31
3.2 保持簡單和直接原則32
3.3 不需要原則33
3.4 避免複製原則33
3.4.1 關於避免複製原則的知識34
3.4.2 構建抽像有時很困難34
3.5 信息隱藏原則37
3.6 高內聚原則40
3.7 松耦合原則42
3.8 小心優化原則45
3.9 最少驚訝原則46
3.10 童子軍原則46
第4章C++代碼整潔的基本規範48
4.1 良好的命名49
4.1.1 名稱應該不言自明50
4.1.2 使用領域中的名稱52
4.1.3 選擇適當抽象級別的名稱53
4.1.4 避免冗餘的名稱54
4.1.5 避免晦澀難懂的縮寫54
4.1.6 避免匈牙利命名法和
   命名前綴55
4.1.7 避免相同的名稱用於
   不同的用途57
4.2 註釋57
4.2.1 讓寫代碼像講故事一樣57
4.2.2 不要為易懂的代碼寫註釋58
4.2.3 不要通過註釋禁用代碼59
4.2.4 不要寫塊註釋59
4.2.5 特殊情況的註釋是有用的62
4.3 函數66
4.3.1 只做一件事情68
4.3.2 讓函數盡可能小69
4.3.3 函數命名70
4.3.4 使用容易理解的名稱71
4.3.5 函數的參數和返回值72
4.4 C++項目中的C風格代碼83
4.4.1 使用C++的string和stream來
   替代C風格的char*83
4.4.2 避免使用printf()、sprintf()、
   gets()等85
4.4.3 使用標準庫的容器而不是使用
   C風格數組88
4.4.4 使用C++類型轉換代替C風格
   類型轉換91
4.4.5 避免使用宏92
第5章現代C++的高級概念95
5.1 資源管理95
5.1.1 資源申請即初始化97
5.1.2 智能指針98
5.1.3 避免顯式的new和delete104
5.1.4 管理專有資源105
5.2 move語義106
5.2.1 什麼是move語義107
5.2.2 左值和右值的關係108
5.2.3 右值引用109
5.2.4 不要濫用move語義111
5.2.5 零原則111
5.3 編譯器是你的搭檔115
5.3.1 自動類型推導116
5.3.2 編譯時的計算119
5.3.3 模板變量121
5.4 不允許出現未定義行為123
5.5 Type-Rich編程124
5.6 熟悉使用的庫132
5.6.1 熟練使用133
5.6.2 使用Boost140
5.6.3 應該了解的其他庫141
5.7 正確處理異常和錯誤142
5.7.1 防患於未然142
5.7.2 從字面上講,例外就是異常146
5.7.3 如果不能恢復,則盡快退出147
5.7.4 用戶自定義異常148
5.7.5 值類型拋出,常量引用類型
   捕獲149
5.7.6 注意catch的正確順序150
5.8 接口設計150
5.8.1 Attribute151
5.8.2 concept:模板參數的要求155
第6章模塊化編程159
6.1 模塊化的基礎160
6.1.1 模塊設計的原則160
6.1.2 小結162
6.2 面向對象163
6.2.1 面向對象思想164
6.2.2 類的設計原則165
6.3 模塊200
6.3.1 #include的缺點200
6.3.2 使用模塊來解決202
6.3.3 底層實現203
6.3.4 使用模塊的三種方案204
6.3.5 模塊的影響207
第7章函數式編程208
7.1 什麼是函數式編程209
7.1.1 什麼是函數210
7.1.2 純函數和非純函數211
7.2 現代C++中的函數式編程212
7.2.1 基於模板的函數式編程212
7.2.2 仿函數214
7.2.3 綁定包裝和函數包裝221
7.2.4 Lambda表達式223
7.2.5 通用Lambda表達式225
7.2.6 Lambda模板226
7.3 高級函數228
7.4 管道與範圍適配器233
7.5 整潔的函數式編程代碼236
第8章測試驅動開發238
8.1 傳統單元測試的缺點239
8.2 作為顛覆者的測試驅動開發240
8.2.1 TDD的流程240
8.2.2 TDD示例:羅馬數字的代碼招式243
8.3 TDD的優勢261
8.4 不應該使用TDD的場合262
第9章設計模式和習慣用法266
9.1 設計原則與設計模式267
9.2 常見設計模式及應用場景267
9.2.1 依賴注入模式268
9.2.2 適配器模式280
9.2.3 策略模式281
9.2.4 命令模式286
9.2.5 命令處理模式289
9.2.6 組合模式293
9.2.7 觀察者模式296
9.2.8 工廠模式300
9.2.9 門面模式302
9.2.10 貨幣類模式304
9.2.11 特例模式306
9.3 什麼是習慣用法310
附錄UML簡要指南321
參考文獻338