內容簡介
《代碼大全(第2版)》是著名IT暢銷書作者Steve McConnell十一年前的經典著作的全新演繹:第二版不是第一版的簡單修訂增補,而是完全進行了重寫;增加了很多與時俱進的內容。這也是一本完整的軟體構建手冊,涵蓋了軟體構建過程中的所有細節。
《代碼大全(第2版)》所論述的技術不僅填補了初級與高級編程技術之間的空白,而且也為程式設計師們提供了一個有關編程技巧的信息來源。
本書對經驗豐富的程式設計師、技術帶頭人、自學的程式設計師及幾乎不懂太多編程技巧的學生們都是大有裨益的。
可以說,無論你是什麼背景,閱讀本書都會讓你在更短的時間內、更容易地寫出更好的程式。
編輯推薦
兩屆震撼大獎得主,數十年軟體開發智慧,十二年前的經典,十二年後再鑄輝煌!
《代碼大全(第2版)》——Amazon全五星一致推薦!開發者必讀著作!圖書館必備典藏!
媒體推薦
書評
“《代碼大全》第1版在我看來堪稱軟體工程領域的經典之作一而第2版
則更棒!”
——Ralph Johnson,伊利諾州立大學; 《設計模式》(Design
Patterns)作者之一
“無論您是新手還是經驗豐富的開發人員,《代碼大全》(第2版)都能
教會您思考編程的最佳方法。”
——Jeffrey Richter(www-wintetlect-com),((Microsoft NET框架
實用編程》(Appfied Microsoft-NET
FrameworkProgramming)作者
“這本書是講述軟體構建的權威指南一準備孤身前往荒島的程式設計師只要
帶上這本書就足夠了。”
——Diomidis Spinellis,《代碼閱讀方法與實踐》(Code Reading:
The Open Source Perspective)作者
“Steve McConnell是一位既在一線實踐,又能把其中奧妙講個明白的
少數人之一。”
——John Vlissides,IBM研究院; 《設計模式》(Design Patterns)
作者之一
“Steve McConnell比任何人都懂得如何構建軟體;我們十分慶幸他能
把其所有的深邃見解和實踐經驗
寫成這樣一本重要而新穎的圖書。”
——“Visual Basic之父”Alan Cooper,《軟體觀念革命》(About
Face 2.0)作者
作者簡介
史蒂夫·邁克康奈爾(Steve McConnell)被公認為軟體開發社區中的首要作者和發言人之一。他是Construx Software公司的首席軟體工程師。
他所編著的圖書包括曾被《軟體開發》雜誌授予優異產品震撼大獎的《代碼大全》和《快速軟體開發》,以及《軟體項目生存指南》和《專業軟體開發》等等。
目錄
前言
鳴謝
核對表目錄
表目錄
圖目錄
第1部分 打好基礎
第1章 歡迎進入軟體構建的世界
1.1 什麼是軟體構建
1.2 軟體構建為何如此重要
1.3 如何閱讀本書
關鍵點
第2章 用隱喻來更充分地理解軟體開發
2.1 隱喻的重要性
2.2 如何使用軟體隱喻
2.3 常見的軟體隱喻
軟體中的書法:寫作代碼
軟體的耕作法:培植系統
軟體的牡蠣養殖觀點:系統生長
軟體構建:建造軟體
套用軟體技術:智慧工具箱
組合各個隱喻
更多資源
關鍵點
第3章 三思而後行:前期準備
3.1 前期準備的重要性
前期準備適用於現代軟體項目嗎
準備不周全的誘因
關於開始構建之前要做前期準備的絕對有力且簡明的論據
3.2 辨明你所從事的軟體的類型
疊代開發法對前期準備的影響
在序列式開發法和疊代式開發法之間做出選擇
3.3 問題定義的先決條件
3.4 需求的先決條件
為什麼要有正式的需求
穩定需求的神話
在構建期間處理需求變更
3.5 架構的先決條件
架構的典型組成部分
3.6 花費在前期準備上的時間長度
更多資源
關鍵點
第4章 關鍵的“構建”決策
4.1 選擇程式語言
語言描述
4.2 編程約定
4.3 你在技術浪潮中的位置
“深入一種語言去編程”的例子
4.4 選擇主要的構建實踐方法
關鍵點
第2部分 創建高質量的代碼
第5章 軟體構建中的設計
5.1 設計中的挑戰
設計是一個險惡的問題
設計是個了無章法的過程(即使它能得出清爽的成果)
設計就是確定取捨和調整順序的過程
設計受到諸多限制
設計是不確定的
設計是一個啟發式過程
設計是自然而然形成的
5.2 關鍵的設計概念
軟體的首要技術任務:管理複雜度
理想的設計特徵
設計的層次
5.3 設計構造塊:啟發式方法
尋找現實世界中的對象
形成一致的抽象
封裝實現細節
當繼承能簡化設計時就繼承
隱藏秘密(信息隱藏)
找出容易改變的區域
保持鬆散耦合
查閱常用的設計模式
其他的啟發式方法
關於設計啟發的總結*****
使用啟發式方法的原則
5.4 設計實踐
疊代
分而治之
自上而下和自下而上的設計方法
建立試驗性原型
合作設計
要做多少設計才夠?
記錄你的設計成果
5.5 對流行的設計方法的評論
更多資源
軟體設計,一般性問題
軟體設計理論
設計模式
廣義的設計
標準
關鍵點
第6章 可以工作的類
6.1 類的基礎:抽象數據類型
需要用到ADT的例子
使用ADT的益處
更多的ADT示例
在非面向對象環境中用ADT處理多份數據實例
ADT和類
6.2 良好的類接口
好的抽象
良好的封裝
6.3 有關設計和實現的問題
包含(“有一個……”的關係)
繼承(“是一個……”關係)
成員函式和數據成員
構造函式
6.4 創建類的原因
應該避免的類
總結:創建類的理由
與具體程式語言相關的問題
6.6 超越類:包
更多資源
關鍵點
第7章 高質量的子程式
7.1 創建子程式的正當理由
似乎過於簡單而沒必要寫成子程式的操作
總結:創建子程式的理由
7.2 在子程式層上設計
7.3 好的子程式名字
7.4 子程式可以寫多長
7.5 如何使用子程式參數
7.6 使用函式時要特別考慮的問題
什麼時候使用函式,什麼時候使用過程
設定函式的返回值
7.7 宏子程式和內聯子程式
宏子程式在使用上的限制
內聯子程式
關鍵點
第8章 防範式編程
8.1 保護程式免遭無效輸入數據的破壞
8.2 斷言
建立自己的斷言機制
使用斷言的指導建議
8.3 錯誤處理技術
健壯性與正確性
高層次設計對錯誤處理方式的影響
8.4 異常
8.5 隔離程式以免遭由錯誤造成的損害
隔離區與斷言的關係
8.6 輔助調試代碼
不要自動地把產品版本的限制強加於開發版本之上
儘早引入輔助調試的手段
採用冒進式編程
計畫移除調試輔助代碼
8.7 確定在產品代碼中該保留多少防範式代碼
8.8 防範式編程時保持防範
其他資源
關鍵點
第9章 偽代碼編程過程
9.1 創建類和子程式的步驟概述
創建一個類的步驟
創建子程式的步驟
9.2 偽代碼
9.3 通過偽代碼編程過程創建子程式
設計子程式
編寫子程式
檢查代碼
收尾工作
根據需要重複上述步驟
9.4 偽代碼編程過程之外的其他方案
關鍵點
第3部分 變數
第10章 使用變數的一般事項
10.1 數據認知
數據認知測試
有關數據類型的其他資源
10.2 輕鬆掌握變數定義
隱式聲明
10.3 變數初始化原則
10.4 作用域
使變數引用局部化
儘可能縮短變數的“存活”時間
減小作用域的一般原則
有關縮小變數作用域的說明
10.5 持續性
10.6 綁定時間
10.7 數據類型和控制結構之間的關係
10.8 為變數指定單一用途
關鍵點
第11章 變數名的力量
11.1 選擇好變數名的注意事項
最重要的命名注意事項
以問題為導向
最適當的名字長度
變數名字的效果範圍
變數名字中的計算值限定詞
變數名字中的常用反義詞
11.2 為特定類型的數據命名
為循環索引命名
為狀態變數命名
為臨時變數命名
為布爾變數命名
為枚舉類型命名
為常量命名
11.3 命名規則的力量
為什麼要有規則?
何時採用命名規則
正式程度
11.4 非正式命名規則
語言無關規則的指導原則
語言相關規則的指導原則
混合語言編程的注意事項
命名規則示例
11.5 標準前綴
用戶自定義類型縮寫
語義前綴
標準前綴的優點
11.6 創建具備可讀性的短名稱
一般的縮寫指導原則
語音縮寫
有關縮寫的評論
11.7 應該避免的名稱
關鍵點
第12章 基本數據類型
12.1 使用數的普遍規則
12.2 整數
12.3 浮點數
12.4 字元和字元串
C中的字元串
12.5 布爾變數
12.6 枚舉類型
如果你的語言裡沒有枚舉類型
12.7 命名常量
12.8 數組
12.9 創建你自己的類型(類型別名)
為什麼創建自己的類型的示例是用Pascal和Ada寫的?
創建自定義數據類型的指導原則
關鍵點
第13章 不常見的數據類型
13.1 結構
13.2 指針
用來理解指針的例子
使用指針的一般技巧
C++指針
C指針
13.3 全局數據
與全局數據有關的常見問題
使用全局數據的理由
只有萬不得已時才使用全局數據
用訪問子程式來取代全局數據
如何降低使用全局數據的風險
其他資源
關鍵點
第4部分 語句
第14章 組織直線型代碼
14.1 必須有明確順序的語句
14.2 順序無關的語句
使代碼易於自上而下的閱讀
把相關的語句組織在一起
關鍵點
第15章 使用條件語句
15.1 if語句
簡單if-then語句
if-then-else語句串
15.2 case語句
為case選擇最有效的排序
使用case語句的提示
關鍵點
第16章 控制循環
16.1 選擇循環的種類
什麼時候使用while循環
什麼時候用帶退出的循環
何時使用for循環
何時使用foreach循環
16.2 循環控制
進入循環
處理好循環體
退出循環
檢查端點
使用循環變數
循環應該有多長
16.3 輕鬆創建循環——由內而外
16.4 循環和數組的關係
關鍵點
第17章 不常見的控制結構
17.1 子程式中的多個返回
17.2 遞歸
遞歸的例子
使用遞歸的技巧
17.3 goto
反對goto的論點
支持goto的觀點
關於goto的虛假辯論
錯誤處理和goto
goto和在else子句中的共享代碼
goto使用原則總結
17.4 對不常見控制結構的看法
其他資源
關鍵點
第18章 表驅動方法
18.1 表驅動方法使用總則
使用表驅動方法的兩個問題
18.2 直接訪問表
示例:一個月中的天數(Days-in-Month)
示例:保險費率
例子:靈活的訊息格式(Flexible-Message-Format)
構造查詢鍵值
18.3 索引表訪問(Indexed Access Tables)
18.4 階梯訪問表
18.5 表查詢的其他示例
關鍵點
第19章 一般控制問題
19.1 布爾表達式
用true和false做布爾判斷
簡化複雜的表達式
編寫肯定形式的布爾表達式
用括弧使布爾表達式更清晰
理解布爾表達式是如何求值的
按照數軸的順序編寫數值表達式
與0比較的指導原則
布爾表達式的常見問題
19.2 複合語句(塊)
19.3 空語句
19.4 馴服危險的深層嵌套
對減少嵌套層次的技術的總結
19.5 編程基礎:結構化編程
結構化編程的三個組成部分
19.6 控制結構與複雜度
複雜度的重要性
降低複雜度的一般原則
其它類型的複雜度
關鍵點
第5部分 代碼改善
第20章 軟體質量概述
20.1 軟體質量的特性
20.2 改善軟體質量的技術
開發過程
設定目標
20.3 不同質量保障技術的相對效能
缺陷檢測率
找出缺陷的成本
修正缺陷的成本
20.4 什麼時候進行質量保證工作
20.5 軟體質量的普遍原理
推薦讀物
相關標準
關鍵點
第21章 協同構造
21.1 協同開發實踐概要
協同構造是其他質量保證技術的補充
協同構造有利於傳授公司文化以及編程專業知識
集體所有權適用於所有形式的協同構造
在構造前後都應保持協作
21.2 結對編程
成功運用結對編程的關鍵
結對編程的好處
21.3 正式檢查
你期望檢查能夠帶來什麼結果
檢查中的人員角色
檢查的一般步驟
檢查中的自尊心
檢查和代碼大全
檢查總結
21.4 其他類型的協同開發實踐
走查
代碼閱讀
大型演示
協同構造技術的比較
參考資料
結對編程
檢查
相關標準
關鍵點
第22章 開發者測試
22.1 開發者測試在軟體質量中的角色.. 500
構造中測試
22.2 推薦的開發者測試方法
先測試還是後測試
開發者測試的局限性
22.3 測試技巧錦囊
不完整的測試
結構化的基礎測試
數據流測試
等價類劃分
猜測錯誤
邊界值分析
幾類壞數據
幾類好數據
採用容易手工檢查的測試用例
22.4 典型錯誤
哪些類包含最多的錯誤?
錯誤的分類
不完善的構造過程引發錯誤所占的比例
你期望能發現多少錯誤
測試本身的錯誤
22.5 測試支持工具
為測試各個類構造腳手架
Diff工具
測試數據生成器
覆蓋率監視器
數據記錄器/日誌記錄器
符號調試工具
系統干擾器
錯誤資料庫
22.6 改善測試過程
有計畫的測試
重新測試(回歸測試)
自動化測試
22.7 保留測試記錄
個人測試記錄
推薦讀物
測試
測試腳手架
測試優先的開發
相關標準
關鍵點
第23章 調 試
23.1 調試概述
調試在軟體質量中所扮演的角色
調試效率的巨大差異
讓你有所收穫的缺陷
一種效率低下的調試方法
23.2 尋找缺陷
科學的調試方法
尋找缺陷的一些小建議
語法錯誤
23.3 修正缺陷
23.4 調試中的心理因素
心理取向如何導致調試時的盲目
“心理距離”在調試中的作用
23.5 調試工具——明顯的和不那么明顯的.. 557
原始碼比較工具
編譯器的警告訊息
擴展的語法和邏輯檢查
執行性能分析器
測試框架
調試器
其它資源
關鍵點
第24章 重構
24.1 軟體進化的類型
軟體進化的哲學
24.2 重構簡介
重構的理由
拒絕重構的理由
24.3 特定的重構
數據級的重構
語句級的重構
子程式級重構
類實現的重構
類接口的重構
系統級重構
24.4 安全的重構
不宜重構的情況
24.5 重構策略
推薦讀物
關鍵點
第25章 代碼調整策略
25.1 性能概述
質量特性和性能
性能和代碼調整
25.2 代碼調整簡介
Pareto法則
一些無稽之談
何時調整代碼
編譯器最佳化
25.3 蜜糖和哥斯拉
常見的低效率之源
常見操作的相對效率
25.4 性能測量
性能測量應當精確
25.5 反覆調整
25.6 代碼調整方法總結
推薦讀物
算法和數據類型
關鍵點
第26章 代碼調整方法
26.1 邏輯
在知道答案後停止判斷
按照出現頻率來調整判斷順序
相似邏輯結構之間的性能比較
用查找表替代複雜表達式
使用惰性求值
26.2 循環
將判斷外提(Unswitching)
合併循環
展開
儘可能減少再循環內部做的工作
哨兵值
把最忙的循環放在最內層
削減強度
26.3 數據變換
使用整型數而不是浮點數
數組維度儘可能少
儘可能減少數組引用
使用輔助索引
使用快取機制
26.4 表達式
利用代數恆等式
削弱運算強度
編譯時初始化
小心繫統函式
使用正確的常量類型
預先算出結果
刪除公共子表達式
26.5 子程式
將函式重寫為內聯
26.6 用低級語言重寫代碼
26.7 變得越多,事情反而更沒變
推薦讀物
關鍵點
第6部分 系統考慮
第27章 程式規模對“構築”的影響
27.1 交流和規模
27.2 項目規模的範圍
27.3 項目規模對錯誤的影響
27.4 項目規模對生產率的影響
27.5 項目規模對開發活動的影響
活動比例和項目規模
程式、產品、系統和系統產品
方法論和規模
額外資源
關鍵點
第28章 管理“構築”
28.1 鼓勵良好的編碼實踐
設定標準的考慮事項
鼓勵良好的編碼實踐的技術
本書的角色
28.2 配置管理
什麼是配置管理?
需求變更和設計變更
軟體代碼變更
工具版本
機器配置
備份計畫
有關配置管理的額外資源
28.3 評估“構築”進度表
評估的方法
評估“構築”的工作量
對進度的影響
評估與控制
如果你落後了該怎么辦
有關軟體評估的額外資源
28.4 度量
有關軟體度量的額外資源
28.5 把程式設計師當人看
程式設計師們怎樣花費時間?
性能差異與質量差異
信仰問題
物理環境
有關“把程式設計師當人看”的額外資源
28.6 管理你的管理者
有關管理構造的額外資源
相關標準
關鍵點
第29章 集成
29.1 集成方式的重要性
29.2 集成頻率——階段式集成還是增量集成
階段式集成
增量集成
增量集成的益處
29.3 增量集成的策略
自頂向下集成
自底向上集成
三明治集成
風險導向的集成
功能導向的集成
T-型集成
集成方法小結
29.4 Daily Build與冒煙測試
哪種項目能用daily build過程?
持續集成
額外資源
關鍵點
第30章 編程工具
30.1 設計工具
30.2 原始碼工具
編輯
分析代碼質量
重構原始碼
Version Control
數據詞典
30.3 可執行碼工具
產生目標碼
除錯
測試
代碼微調
30.4 工具導向的環境
30.5 打造你自己的編程工具
項目特有的工具
腳本
30.6 工具幻境
額外資源
關鍵點
第7部分 軟體工藝
第31章 布局與風格
31.1 基本原則
布局的極端情況
格式化的基本原理
人和計算機對程式的解讀
好布局有什麼用?
把布局作為一種信仰
良好布局的目標
31.2 布局技術
空白區
括弧
31.3 布局風格
純塊結構
模仿純塊結構
使用begin - end對(大括弧)指定塊邊界
行尾布局
哪種風格最優?
31.4 控制結構的布局
格式化控制結構塊的要點
其他考慮
31.5 單條語句的布局
語句長度
用空格使語句顯得清楚
格式化後續行
每行僅寫一條語句
數據聲明的布局
31.6 注釋的布局
31.7 子程式的布局
31.8 類的布局
類接口的布局
類實現的布局
檔案和程式布局
更多資源
關鍵點
第32章 自說明代碼
32.1 外部文檔
32.2 編程風格作文檔
32.3 注釋或不注釋
32.4 高效注釋之關鍵
注釋種類
高效注釋
最佳注釋量
32.5 注釋技術
注釋單行
注釋代碼段
注釋數據聲明
注釋控制結構
注釋子程式
注釋類、檔案和程式
32.6 IEEE標準
軟體質量保證標準
更多資源
關鍵點
第33章 個人性格
33.1 個人性格是否和本書話題無關
33.2 聰明和謙虛
33.3 求知慾
33.4 誠實
33.5 交流與合作
33.6 創造力和紀律
33.7 偷懶
33.8 不像你想像中那樣起作用的性格
矜持
經驗
編程狂人
33.9 習慣
更多資源
關鍵點
第34章 軟體開發藝術的有關問題
34.1 克服複雜性
34.2 精選編程過程
34.3 為人寫程式,其次才是為機器
34.4 以所用語言編程,但思路不受其約束.. 843
34.5 藉助規範集中注意力
34.6 基於問題域編程
將程式劃分為不同層次的抽象
34.7 “當心落石”
34.8 反覆,再反覆
34.9 不要頑固不化
判斷
折中主義
試驗
關鍵點
第35章 何處有更多信息
35.1 關於軟體創建的信息
35.2 創建之外的話題
綜述資料
軟體工程綜覽
其他注釋過的參考書目
35.3 期刊
初級程式設計師雜誌
高級程式設計師雜誌
專題出版物
35.4 軟體開發者的讀書計畫
入門級
熟練級
精通級
35.5 參加專業組織
參考文獻
索引