內容簡介
《編程匠藝:編寫卓越的代碼》主要內容簡介:如果你可以編寫出合格的代碼,但是想更進一步、創作出組織良好而且易於理解的代碼,並希望成為一名真正的編程專家或提高現有的職業技能,那么《編程匠藝:編寫卓越的代碼》都會為你給出答案。《編程匠藝:編寫卓越的代碼》的內容涵蓋編程的各個要素,如代碼風格、變數命名、錯誤處理和安全性等。此外,《編程匠藝:編寫卓越的代碼》還對一些更廣泛的編程問題進行了探討,如有效的團隊合作、開發過程和文檔編寫,等等。《編程匠藝:編寫卓越的代碼》各章的末尾均提供一些思考問題,這些問題回顧了各章中的一些關鍵概念,可以促使你像專家一樣思考,從而使《編程匠藝:編寫卓越的代碼》成為那些渴望作為團隊的一分子,職業並高效地編程的新手們的一本絕佳的參考書。
目錄
第1篇 代碼表面第一部分
第1章 善於防守:健壯代碼的防禦性編程技巧 3
1.1 向優秀的代碼前進 3
1.2 構想:最壞的選擇 4
1.3 什麼是防禦性編程? 6
1.4 又大又壞的世界 8
1.5 防禦性編程技巧 9
1.5.1 使用好的編碼風格和合理的設計 9
1.5.2 不要倉促地編寫代碼 9
1.5.3不要相信任何人10
1.5.4 編碼的目標是清晰,而不是簡潔 11
1.5.5 不要讓任何人做他們不該做的修補工作 11
1.5.6 編譯時打開所有警告開關 12
1.5.7 使用靜態分析工具 13
1.5.8 使用安全的數據結構 13
1.5.9 檢查所有的返回值 14
1.5.10 審慎地處理記憶體(和其他寶貴的資源) 14
1.5.11 在聲明位置初始化所有變數 15
1.5.12 儘可能推遲一些聲明變數 15
1.5.13 使用標準語言工具 15
1.5.14 使用好的診斷信息日誌工具 16
1.5.15 審慎地進行強制轉換16
1.5.16 細則 16
1.6 約束 17
1.6.1 約束的內容 19
1.6.2 移除約束 19
1.7 總結 22
1.8 另請參見 22
1.9 思考 24
1.9.1 深入思考 24
1.9.2 結合自己 24
第2章 精心布局:原始碼的版面和樣式 26
2.1 什麼是關鍵 27
2.2 了解你的讀者 27
2.3 什麼是好的樣式 29
2.4 使用括弧 30
2.4.1 K&R括弧風格 30
2.4.2 懸掛式的括弧風格 31
2.4.3 縮進的括弧風格 32
2.4.4 其他的括弧風格 33
2.5 主宰一切的風格 33
2.6 內部風格(以及在哪裡使用它們) 35
2.7 設立標準 37
2.8 正義的戰爭 39
2.9 總結 40
2.10 另請參見 42
2.11 思考 42
2.11.1 深入思考 42
2.11.2 結合自己 43
第3章 名正言順:為有意義的事物起有意義的名稱 45
3.1 為什麼我們應該恰當地命名呢 47
3.2 我們對什麼進行命名 47
3.3 名字遊戲 48
3.3.1 描述性 48
3.3.2 技術上正確 48
3.3.3 符合語言習慣 49
3.3.4 恰當 49
3.4 具體細節 50
3.4.1 命名變數 51
3.4.2 命名函式 52
3.4.3 命名類型 53
3.4.4 命名名字空間 54
3.4.5 命名宏 55
3.4.6 命名檔案 56
3.5 玫瑰不叫玫瑰 57
3.5.1 保持前後一致 58
3.5.2 利用上下文 58
3.5.3 使用對你有利的名稱 59
3.6 總結 59
3.7 另請參見 61
3.8 思考 62
3.8.1 深入思考 62
3.8.2 結合自己 63
第4章 不言自明:編寫“自文檔化”代碼的技巧 64
4.1 自文檔化的代碼 66
4.2 編寫自文檔化代碼的技術 69
4.2.1 使用好的樣式編寫簡單的代碼 69
4.2.2 選擇有意義的名稱 70
4.2.3 分解為原子函式 70
4.2.4 選擇描述性的類型 71
4.2.5 命名常量 71
4.2.6 強調重要的代碼 72
4.2.7 分組相關信息 72
4.2.8 提供檔案頭 72
4.2.9 恰當地處理錯誤 73
4.2.10 編寫有意義的注釋 73
4.3 實用的自文檔化方法 74
4.3.1 文學性編程 74
4.3.2 文檔化工具 76
4.4 總結 78
4.5 另請參見 79
4.6 思考 79
4.6.1 深入思考 79
4.6.2 結合自己 81
第5章 隨篇注釋:如何編寫代碼注釋 82
5.1 什麼是代碼注釋 83
5.2 注釋看上去是什麼樣的 84
5.3 多少注釋是恰當的 84
5.4 注釋中應該有些什麼 85
5.4.1 解釋為什麼,而不是怎么樣 85
5.4.2 不要描述代碼 86
5.4.3 不要取代代碼 86
5.4.4 確保注釋有用 86
5.4.5 避免分心 88
5.5 實踐 88
5.6 從審美的角度看注釋 89
5.6.1 一致性 89
5.6.2 清晰的塊注釋 90
5.6.3 縮進的注釋 90
5.6.4 行章節附注釋 91
5.6.5 幫助你閱讀代碼 91
5.6.6 選擇一種維護成本較低的風格 92
5.6.7 分隔板 92
5.6.8 標誌 92
5.6.9 檔案頭注釋 93
5.7 使用注釋 94
5.7.1 幫助你編寫例行程式 94
5.7.2 錯誤修正通告 95
5.7.3 注釋過時 95
5.7.4 維護和空洞無物的注釋 96
5.8 總結 97
5.9 另請參見 98
5.10 思考 98
5.10.1 深入思考 98
5.10.2 結合自己 99
第6章 人非聖賢:處理不可避免的情況——代碼中的錯誤情形 100
6.1 從何而來 101
6.2 錯誤報告機制 102
6.2.1 不報告 103
6.2.2 返回值 103
6.2.3 錯誤狀態變數 104
6.2.4 異常 104
6.2.5 信號 106
6.3 檢測錯誤 107
6.4 處理錯誤 108
6.4.1 何時處理錯誤 109
6.4.2 可能的反應 110
6.4.3 代碼示例 112
6.5 使地獄浮現 116
6.6 管理錯誤 118
6.7 總結 119
6.8 另請參見 119
6.9 思考 120
6.9.1 深入思考 120
6.9.2 結合自己 121
第2篇 代碼的神秘生命
第7章 欲善其事,先利其器:使用工具構建軟體 125
7.1 什麼是軟體工具 126
7.2 為什麼要在意工具 128
7.3 使工具發揮作用 129
7.3.1 了解它能做些什麼 130
7.3.2 學習如何駕馭它 130
7.3.3 了解它適合什麼任務 131
7.3.4 檢查它是否可用 131
7.3.5 找到了解更多信息的途徑 131
7.3.6 查明新版本何時出現 132
7.4 哪個工具 132
7.4.1 原始碼編輯工具 133
7.4.2 代碼構建工具 136
7.4.3 調試和調查工具 138
7.4.4 語言支持工具 140
7.4.5 其他工具 141
7.5 總結 142
7.6 另請參見 143
7.7 思考 144
7.7.1 深入思考 144
7.7.2 結合自己 145
第8章測試時代:測試代碼的魔術 146
8.1 反思現實 148
8.2 誰、是什麼、何時以及為什麼 149
8.2.1 我們為什麼要測試 149
8.2.2 誰來進行測試 150
8.2.3 測試的內容有些什麼 150
8.2.4 何時進行測試 151
8.3 測試並不難…… 152
8.4 測試的類型 156
8.5 選擇單元測試用例 160
8.6 為測試而設計 163
8.7 看!不要用手 164
8.8 面對故障該怎么辦 165
8.9 你能管理它嗎 166
8.9.1缺陷跟蹤系統166
8.9.2 bug審查 168
8.10 總結 169
8.11 另請參見 169
8.12 思考 170
8.12.1 深入思考 170
8.12.2 結合自己 171
第9章 尋找缺陷(調試):當事情進展得不順利時該怎么辦 172
9.1 生活的真相 173
9.2 bug的種類 174
9.2.1 從遠處看 174
9.2.2 從近處看 175
9.2.3 從更近處看 178
9.3 消滅害蟲 180
9.3.1 地下之路 181
9.3.2 地上之路 181
9.4 搜尋bug 182
9.4.1 編譯時錯誤 182
9.4.2 運行時錯誤 184
9.5 如何修正缺陷 188
9.6 預防 190
9.7 除蜂劑、驅蟲劑、捕蠅紙 190
9.7.1 調試器 190
9.7.2 記憶體訪問校驗器 191
9.7.3 系統調用跟蹤 191
9.7.4 核心轉儲 191
9.7.5 日誌 191
9.8 總結 192
9.9 另請參見 193
9.10 思考 194
9.10.1 深入思考 194
9.10.2 結合自己 194
第10章 代碼構建:將原始碼轉換為可執行代碼的過程 196
10.1 語言障礙 197
10.1.1解釋型語言198
10.1.2編譯型語言199
10.1.3 位元組編譯型語言 200
10.2 小題大做 201
10.3 構建軟體版本 203
10.4 怎樣才算是一個優秀的構建系統 206
10.4.1 簡潔 206
10.4.2 一致 207
10.4.3 可重複和可靠 207
10.4.4 原子性 208
10.4.5 能夠應付錯誤 209
10.5 技術細節 210
10.5.1 目標的選擇 210
10.5.2 內務處理 212
10.5.3 依賴關係 212
10.5.4 自動構建 213
10.5.5 構建配置 214
10.5.6 遞歸地使用make 215
10.6 請發布我吧 215
10.7 構建大師是全能的嗎 218
10.8 總結 218
10.9 另請參見 219
10.10 思考 219
10.10.1 深入思考 220
10.10.2 結合自己 220
第11章 追求速度:最佳化程式和編寫高效的代碼 222
11.1 最佳化是什麼 223
11.2 是什麼使代碼不盡如人意 224
11.3 為什麼不進行最佳化呢 225
11.4 為什麼要進行最佳化 228
11.5 最佳化的具體細節 229
11.5.1 證明你需要進行最佳化 230
11.5.2 找出運行得最慢的代碼 230
11.5.3 測試代碼 232
11.5.4 最佳化代碼 233
11.5.5 最佳化之後 233
11.6 最佳化的技術 233
11.6.1 設計更改 234
11.6.2 代碼更改 237
11.7 編寫高效的代碼 241
11.8 總結 243
11.9 另請參見 244
11.10 思考 244
11.10.1 深入思考 244
11.10.2 結合自己 245
第12章 不安全感綜合徵:編寫安全的程式 247
12.1 危險 248
12.2 敵人 250
12.3 藉口,都是藉口 252
12.4 感到很脆弱 253
12.4.1 不安全的設計和體系結構 253
12.4.2 緩沖溢出 254
12.4.3 嵌入的查詢字元串 255
12.4.4 競爭狀況 255
12.4.5 整數溢出 256
12.5 防範措施 257
12.5.1 系統安裝技術 258
12.5.2 軟體設計技術 258
12.5.3 代碼實現技術 260
12.5.4 規程技術 261
12.6 總結 261
12.7 另請參見 262
12.8 思考 263
12.8.1 深入思考 263
12.8.2 結合自己 263
第3篇 代碼的形成過程
……