《C++ API設計》
基本信息
做者: (美)Martin Reddy
譯者: 劉曉娜 臧秀濤 林健
叢書名: 圖靈程序設計叢書
出版社:人民郵電出版社
ISBN:9787115322999
上架時間:2013-7-23
出版日期:2013 年8月
開本:16開
頁碼:1
版次:1-1
所屬分類:計算機 > 軟件與程序設計 > C++ > C++
內容簡介
計算機書籍
如何構建高效、健壯、穩定且可擴展的優質api ?對於這一軟件工程上的難題,martin reddy 憑藉長期的從業經驗,對優質api 所應具有的各要素進行了全面分析,針對api 的不一樣風格及模式,以及大型長期項目的內在需求,給出了種種最佳設計策略,從而對api 設計過程的規範性及可持續性做出了理論上不可磨滅的貢獻。
《c++ api設計》適合具備必定c++ 編程經驗的程序員閱讀,也適合對api 設計主題感興趣的讀者參考。
現代軟件開發中的一大難題就是如何編寫優質的api。api負責爲某個組件提供邏輯接口並隱藏該模塊的內部細節。多數程序員依靠的是經驗和冒險,從而很難達到健壯、高效、穩定、可擴展性強的要求。martin reddy博士在本身多年經驗基礎之上,對於不一樣api風格與模式,總結出了api設計的種種最佳策略,着重針對大規模長期開發項目,輔以翔實的代碼範例,從而有助於設計決策的成功實施,以及軟件項目的健壯性及穩定性的實現。
主要內容:
api簡介及其特色
api的一些設計模式及慣用法
影響api的設計的一些c++特性
把控api的風格與性能
版本控制與文檔化的實現
各類優秀的測試方法
如何建立腳本綁定,以便api能被諸如ruby和python等語言調用
可擴展性api的基本實現方式
類庫的編譯器實現
目錄
《c++ api設計》
第1章 api簡介 1
1.1 什麼是api 1
1.1.1 契約和承包人 2
1.1.2 c++中的api 3
1.2 api設計上有什麼不一樣 4
1.3 爲何使用api 5
1.3.1 更健壯的代碼 6
1.3.2 代碼複用 6
1.3.3 並行開發 8
1.4 什麼時候應當避免使用api 9
1.5 api示例 10
1.5.1 api層次 10
1.5.2 真實示例 12
1.6 文件格式和網絡協議 13
1.7 關於本書 15
第2章 特徵 17
2.1 問題域建模 17
2.1.1 提供良好的抽象 17
2.1.2 關鍵對象的建模 19
.2.2 隱藏實現細節 20
2.2.1 物理隱藏:聲明與定義 20
2.2.2 邏輯隱藏:封裝 22
2.2.3 隱藏成員變量 23
2.2.4 隱藏實現方法 26
2.2.5 隱藏實現類 28
2.3 最小完備性 29
2.3.1 不要過分承諾 29
2.3.2 謹慎添加虛函數 30
2.3.3 便捷api 31
2.4 易用性 33
2.4.1 可發現性 34
2.4.2 不易誤用 34
2.4.3 一致性 36
2.4.4 正交 38
2.4.5 健壯的資源分配 40
2.4.6 平臺獨立 43
2.5 鬆耦合 44
2.5.1 僅經過名字耦合 45
2.5.2 下降類耦合 45
2.5.3 刻意的冗餘 47
2.5.4 管理器類 48
2.5.5 回調、觀察者和通知 50
2.6 穩定的、文檔詳細且通過測試的api 53
第3章 模式 54
3.1 pimpl慣用法 55
3.1.1 使用pimpl 56
3.1.2 複製語義 59
3.1.3 pimpl與智能指針 60
3.1.4 pimpl的優勢 61
3.1.5 pimpl的缺點 62
3.1.6 c語言的不透明指針 62
3.2 單例 64
3.2.1 在c++中實現單例 64
3.2.2 使單例線程安全 66
3.2.3 單例與依賴注入 68
3.2.4 單例與單一狀態 69
3.2.5 單例與會話狀態 71
3.3 工廠模式 71
3.3.1 抽象基類 72
3.3.2 工廠示例 73
3.3.3 擴展工廠示例 74
3.4 api包裝器模式 76
3.4.1 代理模式 76
3.4.2 適配器模式 79
3.4.3 外觀模式 81
3.5 觀察者模式 83
3.5.1 mvc架構 83
3.5.2 實現觀察者模式 84
3.5.3 推與拉觀察者 87
第4章 設計 88
4.1 良好設計的例子 89
4.1.1 積累技術債 89
4.1.2 償還技術債 90
4.1.3 爲長期而設計 91
4.2 收集功能性需求 92
4.2.1 什麼是功能性需求 93
4.2.2 功能性需求舉例 94
4.2.3 維護需求 94
4.3 建立用例 95
4.3.1 開發用例 95
4.3.2 用例模板 95
4.3.3 編寫高質量用例 96
4.3.4 需求與敏捷開發 98
4.4 api設計的元素 100
4.5 架構設計 102
4.5.1 架構的開發 103
4.5.2 架構的約束 104
4.5.3 識別主要抽象 105
4.5.4 創造關鍵對象 106
4.5.5 架構模式 109
4.5.6 架構的交流 110
4.6 類的設計 111
4.6.1 面向對象概念 112
4.6.2 類設計選項 113
4.6.3 使用繼承 113
4.6.4 liskov替換原則 115
4.6.5 開放?封閉原則 118
4.6.6 迪米特法則 119
4.6.7 類的命名 120
4.7 函數設計 121
4.7.1 函數設計選項 121
4.7.2 函數命名 122
4.7.3 函數參數 123
4.7.4 錯誤處理 125
第5章 風格 129
5.1 純c api 129
5.1.1 ansi c特性 130
5.1.2 ansi c api的優勢 132
5.1.3 使用ansi c編寫api 132
5.1.4 從c++中調用c函數 134
5.1.5 案例研究:fmod c api 135
5.2 面向對象的c++ api 136
5.2.1 面向對象api的優勢 136
5.2.2 面向對象api的缺點 136
5.2.3 案例研究:fmod c++ api 137
5.3 基於模板的api 138
5.3.1 基於模板的api示例 138
5.3.2 模板與宏 139
5.3.3 基於模板的api的優勢 140
5.3.4 基於模板的api的缺點 141
5.4 數據驅動型api 141
5.4.1 數據驅動型web服務 142
5.4.2 數據驅動型api的優勢 143
5.4.3 數據驅動api的缺點 144
5.4.4 支持可變參數列表 144
5.4.5 案例研究:fmod數據驅動型api 147
第6章 c++用法 149
6.1 命名空間 149
6.2 構造函數和賦值 150
6.2.1 控制編譯器生成的函數 152
6.2.2 定義構造函數和賦值操做符 153
6.2.3 explicit關鍵字 154
6.3 const正確性 155
6.3.1 方法的const正確性 155
6.3.2 參數的const正確性 157
6.3.3 返回值的const正確性 157
6.4 模板 158
6.4.1 模板術語 158
6.4.2 隱式實例化api設計 160
6.4.3 顯式實例化api設計 162
6.5 操做符重載 164
6.5.1 可重載的操做符 164
6.5.2 自由操做符與成員操做符 165
6.5.3 爲類添加操做符 166
6.5.4 操做符語法 168
6.5.5 轉換操做符 170
6.6 函數參數 171
6.6.1 指針與引用參數 171
6.6.2 默認參數 172
6.7 避免使用#define定義常量 173
6.8 避免使用友元 175
6.9 導出符號 176
6.10 編碼規範 179
第7章 性能 181
7.1 經過const引用傳遞輸入參數 182
7.2 最小化#include依賴 184
7.2.1 避免「無所不包型」頭文件 184
7.2.2 前置聲明 184
7.2.3 冗餘的#include警惕語句 186
7.3 聲明常量 188
7.4 初始化列表 190
7.5 內存優化 192
7.6 除非須要,勿用內聯 196
7.7 寫時複製 198
7.8 迭代元素 202
7.8.1 迭代器 202
7.8.2 隨機訪問 203
7.8.3 數組引用 204
7.9 性能分析 205
7.9.1 時效性分析 205
7.9.2 基於內存的分析 207
7.9.3 多線程分析 208
第8章 版本控制 209
8.1 版本號 209
8.1.1 版本號的意義 209
8.1.2 小衆的編號方案 210
8.1.3 提供api的版本信息 211
8.2 軟件分支策略 213
8.2.1 分支策略 213
8.2.2 分支方針 213
8.2.3 api和並行分支 214
8.2.4 文件格式和並行發佈產品 215
8.3 api的生命週期 216
8.4 兼容性級別 217
8.4.1 向後兼容性 217
8.4.2 功能兼容性 218
8.4.3 源代碼兼容性 218
8.4.4 二進制兼容性 219
8.4.5 向前兼容性 221
8.5 怎樣維護向後兼容性 222
8.5.1 添加功能 222
8.5.2 修改功能 223
8.5.3 棄用功能 224
8.5.4 移除功能 226
8.6 api審查 226
8.6.1 api審查的目的 226
8.6.2 api預發佈審查 227
8.6.3 api預提交審查 228
第9章 文檔 230
9.1 編寫文檔的理由 230
9.1.1 定義行爲 230
9.1.2 爲接口契約編寫文檔 232
9.1.3 告知行爲的改變 233
9.1.4 文檔涉及的內容 234
9.2 文檔的類型 236
9.2.1 自動生成的api文檔 237
9.2.2 概述文檔 237
9.2.3 示例和教程 238
9.2.4 發佈說明 238
9.2.5 受權信息 239
9.3 文檔可用性 241
9.4 使用doxygen 242
9.4.1 配置文件 242
9.4.2 註釋風格和命令 242
9.4.3 api註釋 243
9.4.4 文件註釋 245
9.4.5 類註釋 245
9.4.6 方法註釋 246
9.4.7 枚舉註釋 247
9.4.8 帶有文檔的示例頭文件 247
第10章 測試 250
10.1 編寫測試的理由 250
10.2 api測試的類型 252
10.2.1 單元測試 253
10.2.2 集成測試 255
10.2.3 性能測試 257
10.3 編寫良好的測試 259
10.3.1 良好測試的特徵 259
10.3.2 測試對象 260
10.3.3 關注測試工做量 261
10.3.4 與qa一塊兒工做 261
10.4 編寫可測試的代碼 262
10.4.1 測試驅動開發 262
10.4.2 樁對象和模擬對象 264
10.4.3 測試私有代碼 267
10.4.4 使用斷言 269
10.4.5 契約編程 270
10.4.6 記錄並重放功能 272
10.4.7 支持國際化 273
10.5 自動化測試工具 273
10.5.1 自動化測試框架 274
10.5.2 代碼覆蓋率 277
10.5.3 缺陷跟蹤系統 279
10.5.4 持續構建系統 280
第11章 腳本化 282
11.1 添加腳本綁定 282
11.1.1 擴充或嵌入 282
11.1.2 腳本化的優勢 283
11.1.3 語言兼容性問題 284
11.1.4 跨越語言障礙 285
11.2 腳本綁定技術 286
11.2.1 boost python 286
11.2.2 swig 286
11.2.3 python-sip 287
11.2.4 com自動化 287
11.2.5 corba 288
11.3 使用boost python添加python綁定 289
11.3.1 構建boost python 290
11.3.2 使用boost python包裝c++ api 290
11.3.3 構造函數 292
11.3.4 擴充python api 293
11.3.5 c++中的繼承 295
11.3.6 跨語言多態 296
11.3.7 支持迭代器 298
11.3.8 綜合應用 298
11.4 使用swig添加ruby綁定 300
11.4.1 使用swig包裝c++ api 301
11.4.2 調整ruby api 303
11.4.3 構造函數 304
11.4.4 擴充ruby api 304
11.4.5 c++中的繼承 305
11.4.6 跨語言多態 307
11.4.7 綜合應用 307
第12章 可擴展性 310
12.1 經過插件擴展 310
12.1.1 插件模型概覽 311
12.1.2 插件系統設計問題 313
12.1.3 以c++實現插件 314
12.1.4 插件api 315
12.1.5 插件示例 317
12.1.6 插件管理器 318
12.1.7 插件版本控制 321
12.2 經過繼承擴展 322
12.2.1 添加功能 322
12.2.2 修改功能 323
12.2.3 繼承與stl 324
12.2.4 繼承與枚舉 325
12.2.5 訪問者模式 326
12.2.6 禁止子類化 331
12.3 經過模板擴展 332
12.3.1 基於策略的模板 332
12.3.2 奇特的遞歸模板模式 334
附錄a 庫 336
參考文獻 351
索引 355