[美] Steve,[美] McConnell 著,金戈,湯凌,陳碩,張菲 譯
代碼構(gòu)建也兼具藝術(shù)性和思想性!
《代碼大全(第二版)》經(jīng)典重塑,2011版,仍然是一本完整的軟件構(gòu)建手冊,涵蓋了軟件構(gòu)建過程中的所有細節(jié)!是著名IT暢銷書作者Steve McConnell十一年前的經(jīng)典著作的全新演繹,該作者是兩屆Software Development Magzine Jolt Award震撼大獎得主。兩屆震撼大獎得主,數(shù)十年軟件開發(fā)智慧,十二年前的經(jīng)典,十二年后再鑄輝煌!
代碼大全(第2版)是著名Ⅱ暢銷書作者、《IEEESoftware》雜志前主編、具有20年編程與項目管理經(jīng)驗的SteveMcConneU十余年前的經(jīng)典著作的全新演繹:第2版做了全面的更新,增加了很多與時俱進的內(nèi)容,包括對新語言、新的開發(fā)過程與方法論的討論,等等。這是一本百科全書式的軟件構(gòu)建手冊,涵蓋了軟件構(gòu)建活動的方方面面,尤其強調(diào)提高軟件質(zhì)量的種種實踐方法。
作者特別注重源代碼的可讀性,詳細討論了類和函數(shù)命名、變量命名、數(shù)據(jù)類型和控制結(jié)構(gòu)、代碼布局等編程的基本要素,也討論了防御式編程、表驅(qū)動法、協(xié)同構(gòu)建、開發(fā)者測試、性能優(yōu)化等有效開發(fā)實踐,這些都服務(wù)于軟件的技術(shù)使命:管理復(fù)雜度。為了培養(yǎng)程序員編寫高質(zhì)量代碼的習(xí)慣,書中展示了大量高質(zhì)量代碼示例(以及用作對比的低質(zhì)量代碼),提高軟件質(zhì)量是降低開發(fā)成本的重要途徑。除此之外,本書歸納總結(jié)了來自專家的經(jīng)驗、業(yè)界研究以及學(xué)術(shù)成果,列舉了大量軟件開發(fā)領(lǐng)域的真實案例與統(tǒng)計數(shù)據(jù),提高本書的說服力。
本書中所論述的技術(shù)不僅填補了初級與高級編程實踐之間的空白,而且也為程序員們提供了一個有關(guān)軟件開發(fā)技術(shù)的信息來源。本書對經(jīng)驗豐富的程序員、技術(shù)帶頭人、自學(xué)的程序員及沒有太多編程經(jīng)驗的學(xué)生都是大有裨益的。可以說,只要您具有一定的編程基礎(chǔ),想成為一名優(yōu)秀的程序員,閱讀本書都不會讓您失望。
Steve,Mc Connell,被公認為軟件開發(fā)社區(qū)中的首要作者和發(fā)言人之一。他是ConstruxSoftware公司的首席軟件工程師。他所編著的圖書包括曾被SoftwareDevelopment雜志授予優(yōu)異產(chǎn)品震撼大獎(JoltAwardforproductexcellence)的《代碼大全》(CodeComplete)和《快速軟件開發(fā)》(RapidDevelopment),以及《軟件項目生存指南》(SoftwareProtectSurvivalGuide)和《專業(yè)軟件開發(fā)》(ProfessionalSoftwareDevelopment)等等。
“《代碼大全》第1版在我看來堪稱軟件工程領(lǐng)域的經(jīng)典之作——而第2版則更棒!”
——Ralph Johnson,伊利諾伊州立大學(xué);《設(shè)計模式》(Design Pattems)作者之一
“無論您是新手還是經(jīng)驗豐富的開發(fā)人員, 《代碼大全》(第2版)都能教會您思考編程的方法?!?/p>
——Jeffrey Richter,《Microsoft.NET框架實用編程》(Applied Microsoft.NET Framework Programming)作者
“這本書是講述軟件構(gòu)建的指南——準(zhǔn)備孤身前往荒島的程序員只要帶上這本書就足夠了。”
——Diomidis Spinellis,《代碼閱讀方法與實踐》(Code Reading:The Open Source Perspective)作者
“Steve McConnell是一位既在一線實踐,又能把其中奧妙講明白的少數(shù)人之一?!?/p>
——John Vlissides,IBM研究院;《設(shè)計模式》(Design Patterns)作者之一
”Steve McConnell比任何人都懂得如何構(gòu)建軟件;我們十分慶幸他能把其所有的深邃見解和實踐經(jīng)驗寫成這樣一本重要而新穎的圖書?!?/p>
——“Visual Basic之父”Alan Cooper,《軟件觀念革命》(About Face 2.0)作者
前言
鳴謝
核對表目錄
表目錄
圖目錄
第1部分 打好基礎(chǔ)
第1章 歡迎進入軟件構(gòu)建的世界“
1.1 什么是軟件構(gòu)建
1.2 軟件構(gòu)建為何如此重要
1.3 如何閱讀本書
第2章 用隱喻來更充分地理解軟件開發(fā)
2.1 隱喻的重要性
2.2 如何使用軟件隱喻
2.3 常見的軟件隱喻
第3章 三思而后行:前期準(zhǔn)備
3.1 前期準(zhǔn)備的重要性
3.2 辨明你所從事的軟件的類型
3.3 問題定義的先決條件
3.4 需求的先決條件
3.5 架構(gòu)的先決條件
3.6 花費在前期準(zhǔn)備上的時間長度
第4章 關(guān)鍵的“構(gòu)建”決策
4.1 選擇編程語言
4.2 編程約定
4.3 你在技術(shù)浪潮中的位置
4.4 選擇主要的構(gòu)建實踐方法
第5章 軟件構(gòu)建中的設(shè)計
5.1 設(shè)計中的挑戰(zhàn)
5.2 關(guān)鍵的設(shè)計概念
5.3 設(shè)計構(gòu)造塊:啟發(fā)式方法
5.4 設(shè)計實踐
5.5 對流行的設(shè)計方法的評論
第6章 可以工作的類
6.1 類的基礎(chǔ):抽象數(shù)據(jù)類型(ADTs)
6.2 良好的類接口
6.3 有關(guān)設(shè)計和實現(xiàn)的問題
6.4 創(chuàng)建類的原因
6.5 與具體編程語言相關(guān)的問題
6.6 超越類:包
第7章 高質(zhì)量的子程序
7.1 創(chuàng)建子程序的正當(dāng)理由
7.2 在子程序?qū)由显O(shè)計
7.3 好的子程序名字
7.4 子程序可以寫多長
7.5 如何使用子程序參數(shù)
7.6 使用函數(shù)時要特別考慮的問題
7.7 宏子程序和內(nèi)聯(lián)子程序
第8章 防御式編程
8.1 保護程序免遭非法輸入數(shù)據(jù)的破壞
8.2 斷言
8.3 錯誤處理技術(shù)
8.4 異常
8.5 隔離程序,使之包容由錯誤造成的損害
8.6 輔助調(diào)試的代碼
8.7 確定在產(chǎn)品代碼中該保留多少防御式代碼
8.8 對防御式編程采取防御的姿態(tài)
第9章 偽代碼編程過程
9.1 創(chuàng)建類和子程序的步驟概述
9.2 偽代碼
9.3 通過偽代碼編程過程創(chuàng)建子程序
9.4 偽代碼編程過程的替代方案
第3部分 變量
第10章 使用變量的一般事項
10.1 數(shù)據(jù)認知
10.2 輕松掌握變量定義
10.3 變量初始化原則
10.4 作用域
10.5 持續(xù)性
10.6 綁定時間
10.7 數(shù)據(jù)類型和控制結(jié)構(gòu)之問的關(guān)系
10.8 為變量指定單一用途
第11章 變量名的力量
11.1 選擇好變量名的注意事項
11.2 為特定類型的數(shù)據(jù)命名
11.3 命名規(guī)則的力量
11.4 非正式命名規(guī)則
11.5 標(biāo)準(zhǔn)前綴
11.6 創(chuàng)建具備可讀性的短名字
11.7 應(yīng)該避免的名字
第12章 基本數(shù)據(jù)類型
12.1 數(shù)值概論
12.2 整數(shù)
12.3 浮點數(shù)
12.4 字符和字符串
12.5 布爾變量
12.6 枚舉類型
12.7 具名常量
12.8 數(shù)組
12.9 創(chuàng)建你自己的類型(類型別名)
第13章 不常見的數(shù)據(jù)類型
13.1 結(jié)構(gòu)體
……
第4部分 語句
第5部分 代碼改善
第6部分 系統(tǒng)考慮
第7部分 軟件工藝
參考文獻
索引
數(shù)據(jù)純化論者有時爭論說,程序員應(yīng)該絕不使用全局數(shù)據(jù),但是按照“全局數(shù)據(jù)”這一術(shù)語的廣義解釋,大多數(shù)程序都使用了它。存在于數(shù)據(jù)庫中的數(shù)據(jù)是全局數(shù)據(jù),存在于配置文件如Windows注冊表中的數(shù)據(jù)也是。具名常量也是全局數(shù)據(jù),只不過不是全局變量罷了。
如果遵循使用的原則,那么全局變量在一些場合下也是有用的。
保存全局數(shù)值有時候你會有一些在概念上用于整個程序的數(shù)據(jù)。這可能是一個用于表示程序狀態(tài)的變量——例如,交互式模式或者命令行模式、正常模式或者錯誤恢復(fù)模式等的模式標(biāo)識。也可能是在整個程序里面要用到的信息——例如,程序中的每一個子程序都會用到的數(shù)據(jù)表。
模擬具名常量盡管C++、Java、Visual Basic和多數(shù)現(xiàn)代語言都支持具名常量,但是Python、Perl、Awk以及UNIX shell腳本等語言卻不支持。當(dāng)你的語言不支持具名常量的時候,你可以用全局變量代替它們。例如,你可以用取值分別為1和0的全局變量TRUE和FALSE來代替字面量1和0,或者用LINSES_PER_PAGE=66代表每頁行數(shù)的66。一旦采用了這種方法,那么日后再修改代碼就會更容易了,而且這樣的代碼會更方便閱讀。貫徹這種對全局數(shù)據(jù)的使用原則是在一種語言上編程(programming in a language)和深入一種語言去編程(programming into a language)之間差異的一個主要示例,第34.4節(jié)“深入一門語言去編程,不浮于表面”對此有深入探討。
模擬枚舉類型你還可以在Python等不直接支持枚舉類型的語言里用全局變量來模擬枚舉類型。
簡化對極其常用的數(shù)據(jù)的使用有的時候你會大量地引用一個變量,以致于它幾乎出現(xiàn)在你所編寫的每一個子程序的參數(shù)列表里。與其將它包含在每一個參數(shù)列表里面,不如把它設(shè)置成全局變量。不過,事實上很少會出現(xiàn)代碼到處訪問某一個變量的情形。通常該變量是由為數(shù)不多的一組子程序來訪問的,你可以把這些子程序以及它們所用到的數(shù)據(jù)整合進一個類里面。下面會就這一問題展開討論。
消除流浪數(shù)據(jù)有的時候你把數(shù)據(jù)傳遞給一個子程序或者類,僅僅是因為想要把它傳遞給另一個子程序或者類。例如,你可能有一個在每個子程序里都使用的錯誤處理對象。當(dāng)調(diào)用鏈中間的子程序并不使用這一對象的時候,這一對象就被稱為“流浪數(shù)據(jù)(tramp data)”。使用全局變量可以消除流浪數(shù)據(jù)。
Use Global Data Only as a Last Resort
只有萬不得已時才使用全局數(shù)據(jù)
在你選擇使用全局數(shù)據(jù)之前,請考慮下面這些替換方案。
首先把每一個變量設(shè)置為局部的,僅當(dāng)需要時才把變量設(shè)置為全局的 開始的時候先把所有的變量設(shè)置為單一子程序內(nèi)部的局部變量。如果你發(fā)現(xiàn)還需要在其他位置用到它們,那么在一舉把它們轉(zhuǎn)變成全局變量之前,先把它們轉(zhuǎn)變?yōu)轭惱锏膒rivate或者protected變量。如果你最終發(fā)現(xiàn)必須要把它們轉(zhuǎn)變成全局變量,那么就轉(zhuǎn)變它們。不過請先確定除此之外別無選擇。如果你一開始就把變量設(shè)置為全局的,那么你將永遠不可能把它轉(zhuǎn)變成局部的;反之,如果你開始時把變量設(shè)置為局部的,那么你可能永遠也不需要把它轉(zhuǎn)變成全局的。
區(qū)分全局變量和類變量有些變量由于要被整個程序訪問,因此是真正的全局變量。其他只在一組特定的子程序里被頻繁使用的實際是類變量。在頻繁使用某個類變量的子程序組里,你可以采用任何希望的方式來訪問它。如果類外部的子程序需要使用該變量,那么就用訪問器子程序來提供對該變量的訪問。不要直接訪問類變量——好像它們是全局變量一樣——即便你的編程語言允許你這么做。這一建議等價于高呼:“模塊化!模塊化!模塊化!”
使用訪問器子程序創(chuàng)建訪問器子程序是避免產(chǎn)生與全局數(shù)據(jù)相關(guān)問題的主要方法。下一節(jié)會對此做更多的討論。
……
更多建議: