內容介紹
"本書全面展示如何使用C++編寫可重用的代碼,從而提高程式設計師的開發效率。
全書分為12章。包括重用性基本概念、類設計、擴展性、效率、錯誤、衝突、兼容性、繼承、移植性、程式庫等和重用相關的諸多話題。每一章的最後,通過總結和練習幫助你鞏固概念、加深理解,參考文獻和相關資料為你指明了深入學習的方向。
本書適合有一定C++經驗的程式設計師閱讀,也可供以提高代碼重用性為專門學習方向的讀者參考。"
作者介紹
"Martin Carroll是AT&T貝爾實驗室的技術人員,他曾經用好幾年的時間致力於設計和實現可重用的C++程式庫,包括AT&T標準組件庫(Standard Components Library)。他在Rutgers大學獲得計算機科學博士學位。Margaret Ellis 是The Annotated C++ Reference Manual的合著者(另一個作者是大名鼎鼎的C++之父Bjarne Stroustrup),她主要致力於AT&T貝爾實驗室、UNIX系統實驗室和美國Novell公司的編譯器開發。她曾獲得加州大學計算機專業的碩士學位。
"
作品目錄
"目
錄
第1章 重用性介紹 1
1.1 什麼是重用性 1
1.1.1 提取代碼來作為重用 2
1.1.2 可重用代碼的基本特性 2
1.2 重用的神話 3
1.3 重用的障礙 4
1.3.1 非技術障礙 4
1.3.2 技術障礙 5
1.4 希望是否尚存 6
1.5 這本書能給我們帶來什麼 7
l.6 練習 8
1.7 參考文獻和相關資料 9
第2章 類的設計 11
2.1 抽象性 11
2.2 正規函式 12
2.3 Nice類 14
2.4 存在最小標準接口嗎 15
2.4.1 預設構造函式 16
2.4.2 賦值運算符 17
2.4.3 拷貝構造函式 18
2.4.4 相等運算符 18
2.4.5 析構函式 18
2.5 淺拷貝和深拷貝 19
2.6 接口一致性 22
2.7 轉型 25
2.7.1 多重所有權(Multiple Ownership) 26
2.7.2 敏感轉型 26
2.7.3 不敏感轉型 28
2.7.4 轉型數目(Fanout) 28
2.8 const關鍵字的使用 29
2.8.1 抽象const對比位元const 29
2.8.2 最大限度地使用const 31
2.8.3 對const不安全的解釋 32
2.9 總結 33
2.10 練習 34
2.11 參考文獻和相關資料 37
第3章 擴展性 39
3.1 擴展性的權衡 39
3.2 擴展性和繼承 40
3.2.1 只繼承基類的接口 41
3.2.2 只繼承基類的實現 42
3.2.3 同時繼承基類的接口和實現 43
3.3 繼承語義(Semantie) 43
3.4 繼承的障礙 45
3.4.1 非虛成員函式 45
3.4.2 過度保護 47
3.4.3 模組化不足 48
3.4.4 friend關鍵字的使用 51
3.4.5 成員變數過多 52
3.4.6 非虛(Nonvirtual)派生 52
3.4.7 妨礙繼承的成員函式 53
3.5 派生賦值問題 55
3.6 允許入侵(用戶修改原始碼)繼承 57
3.7 總結 58
3.8 練習 58
3.9 參考文獻和相關資料 60
第4章 效率 61
4.1 效率和重用性 61
4.2 程式創建時間 62
4.2.1 編譯時間 62
4.2.2 實例化時間 64
4.3 代碼大小 69
4.3.1 源檔案分割 69
4.3.2 外聯的(outlined)inline 71
4.3.3 模板特化大小 71
4.4 運行時間 72
4.4.1 內聯(inlning) 72
4.4.2 虛函式 74
4.4.3 返回引用 76
4.5 空閒存儲空間(free-store)和堆疊空間(stack space) 78
4.5.1 使用高效的算法 79
4.5.2 儘可能快地釋放空閒資源 80
4.5.3 靜態對象 81
4.5.4 龐大的對象 82
4.6 效率的權衡 83
4.6.1 實現更加困難 84
4.6.2 使用更加困難 86
4.7 總結 86
4.8 練習 87
4.9 參考文獻和相關資料 89
第5章 錯誤 91
5.1 可重用代碼中的錯誤 91
5.2 錯誤檢測 92
5.2.1 函式前提條件 93
5.2.2 表示不變性 93
5.3 處理錯誤 95
5.3.1 程式庫變數 95
5.3.2 解決問題 95
5.3.3 程式退出或者程式終止(Exit or Abort) 96
5.3.4 拋出異常 96
5.3.5 返回錯誤值 97
5.3.6 創建Nil值 98
5.3.7 把無效的數據解釋為有效的數據 99
5.3.8 允許不確定的行為 99
5.4 資源限制(Resource-Limit)錯誤 100
5.4.1 堆疊溢出 100
5.4.2 用完空閒存儲空間 101
5.4.3 檔案系統限制 102
5.5 異常安全性 103
5.5.1 不一致的狀態 104
5.5.2 資源泄漏 105
5.6 總結 106
5.7 練習 107
5.8 參考文獻和相關資料 110
第6章 衝突 111
6.1 全局名稱 111
6.1.1 翻譯單元 112
6.1.2 類的定義 112
6.1.3 函式和數據的定義 114
6.1.4 程式庫的蘊涵意義 114
6.1.5 命名約定 115
6.1.6 namespace(名字空間)結構 117
6.2 宏名稱 118
6.2.1 宏名稱衝突 118
6.2.2 去掉宏 119
6.2.3 宏的命名約定 121
6.3 環境名稱 121
6.4 Unclean程式庫 122
6.5 Good-Citizen程式庫 123
6.6 總結 123
6.7 練習 124
6.8 參考文獻和相關資料 125
第7章 兼容性 127
7.1 向後和向前兼容性 127
7.2 兼容性的形式 128
7.3 理論原始碼兼容性 129
7.4 實際原始碼兼容性 130
7.5 連結兼容牲 131
7.6 運行兼容牲 133
7.7 進程兼容性 134
7.8 文檔化不兼容性 135
7.9 非文檔化特性 135
7.10 總結 136
7.11 練習 137
7.12 參考文獻和相關資料 142
第8章 繼承體系 143
8.1 根數目、深度和扇出數 143
8.2 體系類型 146
8.2.1 直接體系 146
8.2.2 接口體系 147
8.2.3 對象工廠(Object Factory) 149
8.2.4 句柄體系 151
8.3 模板還是繼承 154
8.3.1 指針操縱 155
8.3.2 派生要求 156
8.3.3 實現不需要的函式 157
8.4 總結 158
8.5 練習 159
8.6 參考文獻和相關資料 161
第9章 移植性 163
9.1 有編寫可移植代碼的必要嗎 163
9.1.1 可移植性的優缺點 163
9.1.2 目標代碼和創建過程的可移植性 164
9.2 不斷發展的語言定義 165
9.2.1 衝突 165
9.2.2 實現的完整性 166
9.3 不確定的行為 166
9.3.1 排列方式和補全(padding) 167
9.3.2 地址操縱 168
9.4 合法但不可移植的代碼 169
9.4.1 實現性定義的行為 169
9.4.2 未經指定的行為 170
9.5 實現依賴性 171
9.6 可移植的數據檔案 172
9.7 模板實例化 173
9.7.1 自動的實例化器 173
9.7.2 人工實例化 177
9.8 運行期程式庫 179
9.9 其他移植性問題 180
9.10 總結 181
9.11 練習 182
9.12 參考文獻和相關資料 184
第10章 使用其他程式庫 185
10.1 為何要重用其他程式庫 185
10.2 使用其他程式庫的缺點 186
10.2.1 獲得可重用程式庫 186
10.2.2 效率 187
10.2.3 衝突 187
10.2.4 版本同步 188
10.3 自含式(Self-Contained)程式庫 190
10.3.1 實現困難 190
10.3.2 使用困難 191
10.3.3 效率 192
10.3.4 隔離 192
10.4 總結 193
10.5 練習 193
第11章 文檔編制 195
11.1 文檔編制和重用性 195
11.2 設計文檔 196
11.3 使用指南 196
11.3.1 對讀者的背景知識了如指掌 197
11.3.2 用抽象的觀點來編寫 197
11.3.3 先解釋普通用法 198
11.3.4 一次只解釋一個事物 198
11.3.5 解釋用法,不解釋設計思路 199
11.3.6 簡單清楚地編寫 199
11.3.7 準確地使用語言 199
11.3.8 使用普遍接受的術語 200
11.3.9 深刻理解重載的術語 200
11.3.10 給出合法的、無錯誤的代碼 201
11.3.11 保持簡短的代碼段 201
11.3.12 避免使用太大的函式 201
11.3.13 提供線上實例 202
11.4 參考手冊 203
11.4.1 抽象化 203
11.4.2 語法接口 203
11.4.3 函式語義 205
11.4.4 模板參數約束 206
11.5 總結 207
11.6 練習 207
11.7 參考文獻和相關資料 208
第12章 其他話題 209
12.1 靜態初始化問題 209
12.1.1 構造和析構的時刻 210
12.1.2 程式庫的蘊含意義 211
12.1.3 初始化函式 213
12.1.4 初始化檢查 214
12.1.5 初始化對象 216
12.1.6 雙構造 217
12.2 局部化開銷原則 218
12.2.1 局部化開銷和C++ 219
12.2.2 局部化開銷和程式庫 219
12.3 內生類和外生類 220
12.4 疊代器 222
12.5 類耦合 224
12.6 推遲決定 226
12.7 總結 229
12.8 練習 229
12.9 參考文獻和相關資料 232
中英文術語對照表 233
參考文獻 261
"