C++ API設計(第2版)

[美] 馬丁·雷迪(Martin Reddy)著 張晉豫 何榮華 陳曉偉 譯

  • C++ API設計(第2版)-preview-1
  • C++ API設計(第2版)-preview-2
  • C++ API設計(第2版)-preview-3
C++ API設計(第2版)-preview-1

商品描述

"《C++ API設計》(第2版)全面探討了應用程序編程接口(API)的完整開發生命周期,涵蓋從初始設計、實現、測試、文檔編寫,到發布、版本控制、維護及廢棄的全流程。本書是**系統講解C++ API開發策略的**著作,深入解析接口設計、版本管理、腳本支持及插件擴展性等核心技術。作者基於大規模協作軟件項目的實踐經驗,提煉出能夠構建長期性穩健代碼的API設計實用技巧,為開發者個人及企業提供可落地的模式與實踐。第2版全面更新至C++ 23標準,新增兩章:一章探討並發與多線程主題,還有一章演示C++ API與Objective-C/Swift代碼的互操作性。本書聚焦於多種API風格與設計模式,助你打造縝密、長效的類庫。每個概念均輔以豐富的C++代碼示例。 圖書特色: ?**系統講解C++ API開發策略的著作,涵蓋設計、版本控制、文檔編寫、測試、腳本支持及擴展性等核心內容。 ?每個概念均配有翔實的代碼示例,並提供完整、可運行的示例代碼。 ?全面解析多種API風格與設計模式,重點探討大型長期性項目的實用、高效設計方案。 ?更新拓展資源獲取方式,確保示例代碼與現代編譯器及配套工具完全兼容。"

作者簡介

Martin Reddy擁有計算機科學博士學位,在軟件行業擁有30多年的從業經驗。他是電氣和電子工程師協會(IEEE)會員、亞太人工智能協會(AAIA)會員以及美國計算機學會(ACM)傑出工程師,已獲得10項專利授權,發表過40余篇專業論文並出版2本著作。Reddy博士是人工智能初創公司PullString的聯合創始人兼首席技術官(CTO),是公司的技術研發負責人。2019年,該公司被蘋果公司收購。在蘋果公司任職期間,他作為軟件架構師負責Siri虛擬助手核心組件的架構設計與API開發。此前,Reddy博士在皮克斯動畫工作室工作了6年,擔任內部動畫系統首席工程師,參與制作的多部影片獲得奧斯卡金像獎及提名,包括《海底總動員》《超人總動員》《汽車總動員》《美食總動員》等;他還是《超人總動員》中“超能先生”的發型模特。Reddy的職業生涯始於SRI國際公司,在職期間參與了分布式3D地形可視化系統的研發,並與他人共同制定了虛擬現實建模語言(VRML)和可擴展3D(X3D) ISO(國際標準化組織)的地理空間功能規範。斯特拉斯克萊德大學曾授予Reddy“年度傑出校友”稱號。

目錄大綱

目  錄

第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

最後瀏覽商品 (20)