C++ API設計(第2版)
[美] 馬丁·雷迪(Martin Reddy)著 張晉豫 何榮華 陳曉偉 譯
- 出版商: 清華大學
- 出版日期: 2026-06-01
- 售價: $834
- 語言: 簡體中文
- ISBN: 7302711860
- ISBN-13: 9787302711865
-
相關分類:
C++ 程式語言
- 此書翻譯自: API Design for C++ 2/e (Paperback)
下單後立即進貨 (約4週~6週)
商品描述
作者簡介
目錄大綱
目 錄
第1章 概述 1
1.1 什麼是API 1
1.1.1 契約和承包商 2
1.1.2 C++中的API 2
1.2 API設計有什麼不同 4
1.3 為什麼使用API 6
1.3.1 更健壯的代碼 6
1.3.2 代碼重用 7
1.3.3 並行開發 8
1.4 何時應該避免使用API 10
1.5 API示例 11
1.5.1 API層次 11
1.5.2 真實示例 14
1.6 庫、框架和軟件開發工具包 15
1.7 文件格式和網絡協議 16
1.8 關於本書 17
第2章 特性 20
2.1 問題域建模 20
2.1.1 提供良好的抽象 20
2.1.2 關鍵對象建模 22
2.1.3 解決核心問題 24
2.2 隱藏實現細節 25
2.2.1 物理隱藏:聲明與定義 25
2.2.2 邏輯隱藏:封裝 27
2.2.3 隱藏成員變量 28
2.2.4 隱藏實現方法 31
2.2.5 隱藏實現類 33
2.3 最小完整性 35
2.3.1 不要過度承諾 35
2.3.2 拒絕重復 36
2.3.3 便利的API 37
2.3.4 謹慎添加虛函數 39
2.4 易於使用 41
2.4.1 可發現性 41
2.4.2 難誤用 42
2.4.3 一致性 44
2.4.4 正交 46
2.4.5 穩健的資源分配 49
2.4.6 平臺獨立 52
2.5 松耦合 53
2.5.1 僅通過名稱耦合 54
2.5.2 降低類耦合度 55
2.5.3 刻意的冗余 56
2.5.4 管理類 58
2.5.5 回調、觀察者和通知 60
2.6 穩定、文檔齊全且經過測試 65
第3章 模式 67
3.1 pimpl慣用法 69
3.1.1 使用pimpl 69
3.1.2 復制語義 73
3.1.3 pimpl和智能指針 73
3.1.4 pimpl的優勢 74
3.1.5 pimpl的缺點 75
3.1.6 C語言中的不透明指針 76
3.2 單例(Singleton) 78
3.2.1 在C++語言中實現單例 79
3.2.2 單例和線程安全 80
3.2.3 單例與依賴註入 81
3.2.4 單例模式與共享狀態模式 82
3.2.5 單例與會話狀態 84
3.3 工廠方法 84
3.3.1 抽象基類和接口 85
3.3.2 簡單工廠方法示例 86
3.3.3 可擴展的工廠方法示例 88
3.4 API包裝模式 90
3.4.1 代理模式 91
3.4.2 適配器模式 93
3.4.3 外觀模式 95
3.5 觀察者模式 97
3.5.1 模型—視圖—控制器 97
3.5.2 觀察者模式的實現 98
3.5.3 推送和拉取觀察者 101
第4章 設計 103
4.1 良好的設計 104
4.1.1 技術債的積累 104
4.1.2 償還技術債 106
4.1.3 長期設計 107
4.2 收集功能性需求 108
4.2.1 什麼是功能性需求 108
4.2.2 功能性需求示例 109
4.2.3 維護需求 110
4.3 創建用例 110
4.3.1 開發用例 110
4.3.2 用例模板 111
4.3.3 編寫高質量用例 112
4.3.4 需求和敏捷開發 113
4.4 API的設計要素 115
4.5 架構設計 117
4.5.1 架構開發 118
4.5.2 架構的約束 119
4.5.3 識別主要抽象概念 121
4.5.4 構建關鍵對象 122
4.5.5 架構模式 124
4.5.6 針對架構的溝通 126
4.6 類設計 127
4.6.1 面向對象概念 127
4.6.2 類設計選項 128
4.6.3 SOLID原則 129
4.6.4 使用繼承 129
4.6.5 裏氏替換原則 131
4.6.6 開放—封閉原則 134
4.6.7 迪米特法則 135
4.6.8 類命名 136
4.7 函數設計 137
4.7.1 函數設計選項 137
4.7.2 函數命名 138
4.7.3 函數參數 139
4.7.4 錯誤處理 142
第5章 風格 147
5.1 扁平式C API 148
5.1.1 ANSI C特性 149
5.1.2 ANSI C API的優點 150
5.1.3 使用ANSI C編寫API 151
5.1.4 從C ++調用C函數 152
5.1.5 案例研究:FMOD C API 153
5.2 面向對象的C++ API 154
5.2.1 面向對象的API的優點 154
5.2.2 面向對象的API的缺點 155
5.2.3 案例研究:FMOD C++ API 155
5.3 基於模板的API 156
5.3.1 基於模板的API示例 157
5.3.2 模板和宏 157
5.3.3 基於模板的API的優點 158
5.3.4 基於模板的API的缺點 159
5.4 函數式API 160
5.4.1 函數式編程概念 160
5.4.2 函數式API示例 161
5.4.3 函數式API的優點 162
5.4.4 函數式API的缺點 162
5.5 數據驅動的API 163
5.5.1 數據驅動API的優點 164
5.5.2 數據驅動API的缺點 166
5.5.3 支持可變參數列表 166
5.5.4 案例研究:FMOD數據驅動的API 167
5.5.5 數據驅動的Web服務 168
5.5.6 冪等性 168
第6章 C++用法 172
6.1 命名空間 172
6.2 構造函數和賦值運算符 174
6.2.1 定義構造函數和賦值運算符 176
6.2.2 explicit關鍵字 177
6.3 const正確性 178
6.3.1 方法的const正確性 178
6.3.2 參數的const正確性 180
6.3.3 返回值的const正確性 180
6.4 模板 182
6.4.1 模板術語 182
6.4.2 隱式實例化API設計 184
6.4.3 顯式實例化API設計 185
6.5 運算符重載 187
6.5.1 可重載的運算符 188
6.5.2 自由運算符和成員運算符 189
6.5.3 向類中添加運算符 190
6.5.4 運算符語法 192
6.5.5 轉換運算符 195
6.6 函數形參 196
6.6.1 指針和引用形參 196
6.6.2 默認實參 197
6.7 避免使用#define來定義常量 198
6.8 避免使用友元 200
6.9 導出符號 202
6.10 編碼規範 205
第7章 C++版本 208
7.1 使用哪個C++版本 208
7.2 C++11 API特性 209
7.2.1 移動構造函數和五法則 209
7.2.2 默認和刪除函數 213
7.2.3 對象構造 215
7.2.4 初始化器列表構造函數 217
7.2.5 智能指針 218
7.2.6 枚舉類 220
7.2.7 override和final說明符 221
7.2.8 noexcept說明符 225
7.2.9 內聯命名空間 225
7.2.10 使用using的類型別名 227
7.2.11 用戶定義字面量 228
7.2.12 後置返回類型聲明 230
7.2.13 元組 230
7.2.14 常量表達式 231
7.2.15 關鍵字nullptr 233
7.2.16 變參模板 233
7.2.17 遷移至C++11 235
7.3 C++14 API特性 237
7.3.1 auto返回類型 237
7.3.2 廢棄屬性 238
7.3.3 變量模板 239
7.3.4 常量表達式的改進 240
7.3.5 二進制字面量和數字分隔符 241
7.3.6 遷移至C++14 241
7.4 C++17 API特性 242
7.4.1 內聯變量 242
7.4.2 字符串視圖 243
7.4.3 optional 245
7.4.4 any 248
7.4.5 variant 249
7.4.6 嵌套命名空間 251
7.4.7 折疊表達式 252
7.4.8 頭文件的可用性檢查 254
7.4.9 字節類型 255
7.4.10 maybe_unused屬性 256
7.4.11 遷移至C++17 257
7.5 C++20 API的特性 258
7.5.1 模塊 258
7.5.2 太空船運算符 261
7.5.3 約束和概念 265
7.5.4 簡寫函數模板 267
7.5.5 consteval說明符 268
7.5.6 constinit說明符 269
7.5.7 遷移至C++20 269
7.6 C++23 API的特性 271
7.6.1 期值 271
7.6.2 多維下標運算符 272
7.6.3 預處理器指令 273
7.6.4 遷移至C++23 275
第8章 性能 276
8.1 通過const引用傳遞輸入參數 277
8.2 最小化#include依賴 279
8.2.1 避免“無所不包型”頭文件 279
8.2.2 前置聲明 279
8.2.3 冗余的#include保護 281
8.3 聲明常量 284
8.4 初始化列表 286
8.5 內存優化 288
8.6 若非必要,勿用內聯 293
8.7 寫時復制 295
8.8 遍歷元素 299
8.8.1 疊代器 299
8.8.2 隨機訪問 300
8.8.3 數組引用 301
8.8.4 外部模板 302
8.9 性能分析 303
8.9.1 時效性分析 303
8.9.2 基於內存的分析 306
8.9.3 多線程分析 307
第9章 並發 308
9.1 C++中的多線程 308
9.2 術語 310
9.2.1 數據競爭和競爭條件 310
9.2.2 線程安全 310
9.2.3 可重入性 311
9.2.4 異步任務 312
9.2.5 並行 312
9.3 訪問共享數據 313
9.3.1 無狀態API 313
9.3.2 初始化共享數據 315
9.3.3 同步數據訪問 316
9.4 並發API設計 317
9.4.1 並發的最佳實踐 318
9.4.2 線程安全接口模式 319
第10章 版本控制 321
10.1 版本號 321
10.1.1 版本號的意義 321
10.1.2 特殊的編號方案 322
10.1.3 創建版本API 323
10.2 軟件的分支策略 325
10.2.1 分支方案 325
10.2.2 分支原則 326
10.2.3 API和並行分支 326
10.2.4 文件格式和並行發布產品 327
10.3 API的生命周期 328
10.4 兼容性級別 329
10.4.1 向後兼容性 329
10.4.2 功能兼容性 330
10.4.3 源碼兼容性 330
10.4.4 二進制兼容性 331
10.4.5 向前兼容性 334
10.5 如何維護向後兼容性 335
10.5.1 添加功能 335
10.5.2 修改功能 336
10.5.3 棄用功能 337
10.5.4 移除功能 339
10.5.5 用於版本控制的內聯命名空間 340
10.6 API審查 341
10.6.1 API審查的目的 341
10.6.2 發布前API審查 342
10.6.3 提交前的API審查 344
第11章 文檔 346
11.1 撰寫文檔的理由 346
11.1.1 定義行為 347
11.1.2 為接口契約編寫文檔 348
11.1.3 告知行為的改變 349
11.1.4 文檔涉及的內容 350
11.2 文檔的類型 352
11.2.1 自動生成的API文檔 353
11.2.2 概述文檔 353
11.2.3 示例和教程 354
11.2.4 發行說明 355
11.2.5 許可證信息 355
11.3 文檔可用性 358
11.4 使用Doxygen 361
11.4.1 配置文件 361
11.4.2 註釋風格和命令 361
11.4.3 API註釋 363
11.4.4 文件註釋 364
11.4.5 類註釋 365
11.4.6 方法註釋 365
11.4.7 枚舉註釋 366
第12章 測試 369
12.1 編寫測試的原因 369
12.2 API測試的類型 371
12.2.1 單元測試 372
12.2.2 集成測試 375
12.2.3 性能測試 376
12.3 編寫良好的測試 378
12.3.1 良好測試的特征 378
12.3.2 測試對象 379
12.3.3 關註測試工作量 381
12.3.4 與QA一起工作 382
12.4 編寫可測試的代碼 382
12.4.1 測試驅動開發 382
12.4.2 樁對象和模擬對象 385
12.4.3 測試私有代碼 388
12.4.4 使用斷言 391
12.4.5 契約編程 392
12.4.6 記錄和回放功能 395
12.4.7 支持國際化 396
12.5 自動化測試工具 396
12.5.1 自動化測試框架 397
12.5.2 代碼覆蓋率工具 400
12.5.3 缺陷跟蹤系統 403
12.5.4 持續構建系統 404
第13章 Objective-C和Swift 405
13.1 C++和Objective-C中的接口設計 405
13.2 Objective-C中的數據隱藏 407
13.3 C++ API背後的Objective-C 409
13.4 Objective-C API背後的C++ 412
13.5 Swift API背後的C++ 414
第14章 腳本化 418
14.1 添加腳本綁定 418
14.1.1 擴展與嵌入 418
14.1.2 腳本化的優勢 419
14.1.3 語言兼容性問題 420
14.1.4 跨越語言障礙 421
14.2 腳本綁定技術 422
14.2.1 Boost Python 422
14.2.2 簡化的包裝器和接口生成器 423
14.2.3 Python-SIP 423
14.2.4 組件對象模型自動化 424
14.2.5 CORBA 425
14.3 使用Boost Python添加Python綁定 425
14.3.1 構建Boost Python 426
14.3.2 使用Boost Python包裝C++ API 427
14.3.3 構造函數 429
14.3.4 擴展Python API 430
14.3.5 C++中的繼承 432
14.3.6 跨語言多態性 433
14.3.7 支持疊代器 434
14.3.8 綜合應用 435
14.4 使用SWIG添加Ruby綁定 437
14.4.1 使用SWIG包裝C++API 438
14.4.2 調試Ruby API 439
14.4.3 構造函數 440
14.4.4 擴展Ruby API 441
14.4.5 C++中的繼承 442
14.4.6 跨語言多態性 444
14.4.7 綜合應用 444
第15章 可擴展性 447
15.1 通過插件擴展 447
15.1.1 插件模型概述 448
15.1.2 插件系統的設計問題 450
15.1.3 使用C++實現插件 452
15.1.4 插件API 453
15.1.5 插件示例 455
15.1.6 插件管理器 456
15.1.7 插件版本控制 458
15.2 通過繼承擴展 460
15.2.1 添加功能 460
15.2.2 修改功能 461
15.2.3 繼承與標準庫 462
15.2.4 繼承和枚舉 463
15.2.5 訪問者模式 464
15.3 通過模板擴展 469
15.3.1 基於策略的模板 469
15.3.2 奇異遞歸模板模式 470
附錄 庫 473



