出版時(shí)間:2012-8 出版社:電子工業(yè)出版社 作者:季奧米季斯·斯賓耐立思(Diomidis Spinellis) 頁數(shù):416 譯者:左飛,吳躍,楊寧
Tag標(biāo)簽:無
前言
原作者中文版序 中國是首個(gè)將我的“開源視角”系列作品再版的國家。這可能有很多原因,而其中一個(gè)特別吸引人的原因與孔子的著作有關(guān),他在《論語》中廣泛地強(qiáng)調(diào)了學(xué)習(xí)研究的重要性?;仡欀白珜憽洞a閱讀》和《代碼質(zhì)量》的歷程,我了解到,實(shí)際上,我鼓勵(lì)了那些從事開發(fā)工作的同事和學(xué)生借助研究學(xué)習(xí)軟件代碼來提升他們自身的知識和技能,這正是我遵循孔子金玉良言的一種方式?! 洞a閱讀》一書闡述了開發(fā)者應(yīng)當(dāng)如何閱讀已有的代碼。關(guān)于為何要進(jìn)行代碼閱讀,不少人也給出了許多現(xiàn)實(shí)中的原因:修正問題、添加特性、尋找有用的片段,或者作為你所在機(jī)構(gòu)質(zhì)量控制流程的一部分對其進(jìn)行復(fù)查。然而,進(jìn)行代碼閱讀最重要的原因其實(shí)是從中學(xué)習(xí)。從已有的高質(zhì)量代碼中,我們可以學(xué)習(xí)如何將嚴(yán)謹(jǐn)?shù)拇a風(fēng)格應(yīng)用于實(shí)踐,如何編寫有用的注釋,如何編排代碼以方便他人讀懂,如何選擇有意義的標(biāo)識符,以及如何將復(fù)雜的代碼組織為可管控的部分。另外,通過研究代碼,我們還可以學(xué)習(xí)到新的算法、API及架構(gòu)。簡而言之,閱讀代碼可以幫助我們成為更加優(yōu)秀的程序員。 《代碼質(zhì)量》一書,退后一步,方為大觀。當(dāng)代碼被組裝為程序時(shí)將會產(chǎn)生所謂的聚現(xiàn)屬性:可靠性、安全性、CPU利用率、空間占用率、可移植性及可維護(hù)性。盡管這些屬性可能看起來抽象且難以約束,但是諸多成功的經(jīng)驗(yàn)表明,借助研究專家級的代碼,我們可以學(xué)習(xí)到許多極好的提升代碼質(zhì)量的方法。我們可以從中發(fā)現(xiàn)嚴(yán)謹(jǐn)?shù)腻e(cuò)誤測試、安全證書的保守處理、高效的算法、靈巧的抽象技術(shù)及應(yīng)用于實(shí)踐中的基本設(shè)計(jì)模式。簡而言之,這將有助于我們成為極其優(yōu)秀的程序員?! ゴ蟮恼軐W(xué)家孔子曾經(jīng)提過:“學(xué)而不思則罔,思而不學(xué)則殆”。因此我推薦大家主動花些時(shí)間來研究已有的代碼并從中予以學(xué)習(xí)?! iomidis Spinellis 2011年9月于雅典 推 薦 序 今年恰逢“十二五”開局之年,在全球軟件技術(shù)和產(chǎn)業(yè)格局孕育重大調(diào)整之際,我國軟件產(chǎn)業(yè)也在工業(yè)化、信息化“兩化融合”的大背景下迎來了又一個(gè)快速發(fā)展的新階段,這其中機(jī)遇與挑戰(zhàn)并存。當(dāng)下軟件和信息服務(wù)業(yè)市場的規(guī)模不斷擴(kuò)大,物聯(lián)網(wǎng)作為又一個(gè)萬億元級別的產(chǎn)業(yè)將產(chǎn)生千億元級別的服務(wù)外包。預(yù)計(jì)到2020年,全球潛在的服務(wù)外包市場需求將達(dá)到1.65~1.8萬億美元,大力發(fā)展軟件業(yè)及信息服務(wù)業(yè)將成為各國抓住新機(jī)遇、全面深度參與全球化、提升軟件產(chǎn)業(yè)技術(shù)力量的重要途徑。目前我國軟件產(chǎn)業(yè)規(guī)模雖已過萬億元,但在核心技術(shù)、基礎(chǔ)軟件等方面仍有很大發(fā)展空間?! 「咚刭|(zhì)人才的儲備是推進(jìn)產(chǎn)業(yè)健康快速發(fā)展的根本保證。高端軟件人才的大量持續(xù)涌現(xiàn),關(guān)鍵在于教育,這其中高校無疑要發(fā)揮重要的作用。我們高校軟件教育者既要繼續(xù)貫徹黨的教育理念,進(jìn)一步深化我國高級軟件人才培養(yǎng)體系的發(fā)展進(jìn)程;同時(shí)又要看到我國與歐美等高水平軟件人才教育國家之間的距離,師夷長技,以求在全球化浪潮中謀得一席之地。作為一位優(yōu)秀的軟件教育者,Diomidis Spinellis教授的某些理念無疑是非常值得我們學(xué)習(xí)和借鑒的。他以人類學(xué)習(xí)自然語言的認(rèn)知規(guī)律為出發(fā)點(diǎn),獨(dú)辟新徑,強(qiáng)調(diào)借助代碼閱讀來提高編程能力。目前這一思潮也已逐漸由歐美向我國滲透。 代碼閱讀是每一個(gè)軟件從業(yè)人員經(jīng)常進(jìn)行的活動,其重要性對于每一個(gè)開發(fā)者不言而喻,但人們更多的是在本著修改前人代碼而進(jìn)行此項(xiàng)活動的,換言之,僅僅使用了代碼閱讀的工作屬性,而未見開發(fā)其學(xué)習(xí)屬性。其實(shí),代碼閱讀還幫助人們完成了“觀察-模仿-創(chuàng)造”這樣一個(gè)過程的初始階段。南朝劉勰《文心雕龍》里講“觀千劍而后識器”,與之類似,清乾隆年間蘅塘退士還說“熟讀唐詩三百首,不會作詩也會吟”,這都是強(qiáng)調(diào)了觀察對于之后創(chuàng)造的重要性(巧合的是寫詩和寫代碼的觀察都是借助閱讀來完成的)?! ×钊诉z憾的是,一直以來,許多人都認(rèn)為閱讀代碼不是件容易的事情,不僅不容易,很多時(shí)候還非??菰?;即使是自己寫的代碼,有時(shí)隔一段時(shí)間再回顧也會不知所云。很多人在自己的編碼生涯中都或多或少有過一些閱讀代碼的經(jīng)歷,有自己的一些方法,但也僅僅是一些個(gè)人實(shí)踐而已,缺乏對整體的把握,經(jīng)常是只見樹木不見森林(很多時(shí)候僅僅能看到一小部分樹木)。為了在學(xué)習(xí)的過程中少走一些彎路,業(yè)界代碼閱讀與質(zhì)量提升方面的開宗明義之作--Diomidis Spinellis教授所撰寫的兩部經(jīng)典之作《代碼閱讀》和《代碼質(zhì)量》無疑是推薦給每位從業(yè)人員的理想讀物。這兩部曾榮獲美國Jolt軟件開發(fā)震撼大獎(jiǎng)的作品,影響了一代程序員,是相關(guān)領(lǐng)域中的經(jīng)典名作?! ∥议喿x了兩部書的譯稿,并非常欣喜地將它們推薦給每一位讀者。該書譯者和編輯們嚴(yán)謹(jǐn)、認(rèn)真的工作使得本版最大程度地還原了作者的原意,相信經(jīng)由他們的辛勤努力,必將能為廣大讀者獻(xiàn)上一道驚艷的佳作?! W陽修說:“立身以立學(xué)為先,立學(xué)以讀書為本。”衷心希望廣大讀者借由本書立學(xué)解惑,提升自我?! ±顟?zhàn)懷 于2011歲末 譯 者 序 由國際知名的Addison-Wesley出版社推出的“高效軟件開發(fā)系列”叢書為現(xiàn)代軟件開發(fā)的方方面面提供了專業(yè)的建議和意見。收錄在該系列中的書籍本本都是技術(shù)方面聲名卓著的佳作,這些書籍的作者在創(chuàng)作時(shí)煞費(fèi)苦心,力求作品篇幅適中、易于閱讀,同時(shí)保證作品的價(jià)值能夠歷久彌新,不會隨時(shí)光的流逝而漸顯黯淡。系列中的每一本都描述了一項(xiàng)軟件開發(fā)的核心話題,這些內(nèi)容可能是業(yè)界專家們在開發(fā)中始終秉承的,也可能是需要本書的讀者們引以為戒的,而之所以這樣做,目的只有一個(gè),就是要?jiǎng)?chuàng)造出最杰出的軟件?! ∠ED教授Diomidis Spinellis的兩部著作《代碼閱讀》和《代碼質(zhì)量》均收錄在此系列中。其中,本書作為該領(lǐng)域的開山之作,曾榮獲美國第14屆“軟件開發(fā)”年度震撼大獎(jiǎng)。在IT產(chǎn)業(yè)蓬勃發(fā)展的今日,電子工業(yè)出版社順應(yīng)時(shí)代發(fā)展和廣大讀者希冀,隆重推出了《Jolt獲獎(jiǎng)系列》書叢,《代碼閱讀》和《代碼質(zhì)量》再次被收入其中。經(jīng)典之作《代碼閱讀》得以撥云開霧,同廣大中國讀者見面?! ‘?dāng)今世界,互聯(lián)網(wǎng)迅猛發(fā)展,開源軟件大行其道,海量的優(yōu)質(zhì)代碼猶如一座豐富的寶藏正熱切地等待著每一位開發(fā)人員去發(fā)掘,去閱讀。正如本書英文原版序言的作者Dave Thomas所說的那樣:“沒有哪位偉大的小說家從未讀過其他人的著作,也沒有哪位偉大的畫家從來沒有研究過他人的畫作。”閱讀代碼顯然是每個(gè)軟件開發(fā)人員都必須做的事情。一方面,可能是出于向優(yōu)秀范例程序?qū)W習(xí)的目的,另一方面,也可能是出于代碼復(fù)用的目的。于是,人們總會出于這樣或那樣的原因去閱讀代碼(有可能是別人的,也有可能是自己寫的)。然而,長久以來,“如何正確地閱讀代碼,實(shí)現(xiàn)去粗取精?如何高效地閱讀代碼,做到得心應(yīng)手?”始終沒有一套完備的指導(dǎo)法則?! ≈钡奖緯霈F(xiàn),我們才豁然開朗,原來代碼閱讀也是有章法可依的,也是一門學(xué)問。眾所周知,本書是第一部專門將代碼閱讀作為一項(xiàng)獨(dú)立活動加以論述的書籍,即使在其出版多年之后的今天,也依然是該領(lǐng)域的扛鼎之作。正如本書作者所說的那樣:“代碼閱讀應(yīng)該得到正確地訓(xùn)練,并用做提高編程能力的一種方法。”值得注意的是,目前,在國外先進(jìn)的計(jì)算機(jī)教育體系中,代碼閱讀課程、活動和實(shí)踐已納入到相應(yīng)的正規(guī)課程安排之中?! ≡谥袊?,各大技術(shù)論壇、專業(yè)網(wǎng)站也為廣大從業(yè)人員和程序設(shè)計(jì)愛好者提供了大量可交流的代碼資源。作為譯者,我們真誠地將該書推介給國內(nèi)的讀者,希望借由本書,可以推動開源運(yùn)動,使更多人獲益,也可以推動代碼共享與閱讀的方法與實(shí)踐,提高國人學(xué)習(xí)編程的效率,以期獲得事半功倍的效果?! ≌f到學(xué)習(xí)編程,我不禁想到了最近網(wǎng)上熱炒的“蹭課哥”。據(jù)悉,來自山東菏澤,現(xiàn)年27歲的農(nóng)村青年賈作勝,原本高中畢業(yè)后,由于家庭經(jīng)濟(jì)困難等原因,未能如愿繼續(xù)深造。后來,進(jìn)城打工的他成為了清華大學(xué)的一名普通的保安員。業(yè)余時(shí)間,他一直刻苦學(xué)習(xí),還常到教室旁聽各種課程和名家講座。天道酬勤,今年這位往日的“蹭課哥”,憑借旁聽和自學(xué),考上了山東師范大學(xué)。同樣是保安,我又不禁想到了一個(gè)我身邊的真實(shí)的例子。這個(gè)故事我不止一次講起,還曾經(jīng)在我的一本書的序言里引用過。若干年前,我所在公司樓下有一位與眾不同的小保安。說他與眾不同是因?yàn)楫?dāng)時(shí)經(jīng)常能看到他捧著一本厚厚的《Java編程思想》之類的書在啃讀,這種爭分奪秒、刻苦學(xué)習(xí)的形象當(dāng)時(shí)給我們很多人留下了深刻的印象。功夫不負(fù)有心人,這位保安后來順利轉(zhuǎn)型,成為了一名軟件工程師。 無論是過去還是現(xiàn)在,都有如此之多的形形色色的人因?yàn)楦鞣N原因前仆后繼地在努力鉆研編程。我也曾經(jīng)在文章中指出,研讀他人的代碼是學(xué)習(xí)編程的道路上,除動手實(shí)踐外最重要也最必要的學(xué)習(xí)方法之一。本書的讀者可能已經(jīng)在行業(yè)內(nèi)摸爬滾打多年,也可能初出茅廬,可能是高等院校計(jì)算機(jī)相關(guān)專業(yè)的學(xué)生,也可能只是某個(gè)角落里默默奮發(fā)的小保安。無論你是其中的哪一個(gè),我都真心地希望本書能夠在你成長為編程達(dá)人的道路上助一臂之力。我希望能夠有更多像小保安一樣的人得以華麗轉(zhuǎn)身。若能如此,我心足矣?! 汛е@樣的心情,我們始終秉持著一絲不茍的態(tài)度,力求把經(jīng)典之作原汁原味地帶給中國讀者。而一本專業(yè)技術(shù)領(lǐng)域的譯作得以成功問世,其中之波折也是再所難免。幸得多位業(yè)內(nèi)專家不吝指導(dǎo),使得我們的工作備感鼓舞。在本書翻譯之初,Diomidis Spinellis教授即給我們提出了許多寶貴的建議,他的指導(dǎo)給予了我們極大的幫助。此外,中國計(jì)算機(jī)學(xué)會數(shù)據(jù)庫專業(yè)副主任、西北工業(yè)大學(xué)博士生導(dǎo)師、計(jì)算機(jī)學(xué)院副院長李戰(zhàn)懷教授審閱了譯稿,并欣然為本書作序推薦,感激之情,溢于言表。 本書得以順利付梓,我們還要感謝中國航空工業(yè)集團(tuán)第一飛機(jī)設(shè)計(jì)研究院工程師張貴、西安市公安局網(wǎng)監(jiān)支隊(duì)秦磊、西安交通大學(xué)電信學(xué)院研究生楊驥。三人在各自的技術(shù)方向上擁有豐富的實(shí)踐經(jīng)驗(yàn),其中,張貴曾參與開發(fā)多個(gè)大型飛行模擬器項(xiàng)目,而楊驥和秦磊的研究方向則分別側(cè)重于嵌入式開發(fā)和網(wǎng)絡(luò)安全方面。以上諸位在百忙之中積極參與了本書的翻譯工作,對于他們嚴(yán)肅認(rèn)真的工作態(tài)度,筆者表示由衷敬佩?! ∽罡咂焚|(zhì)的圖書始終是作譯者永恒的追求。但有一千個(gè)讀者,就有一千個(gè)哈姆雷特。因此,我們也真誠地希望本書的讀者能夠把閱讀中的所想所得與我們分享,也歡迎就書中可能存在的紕漏與我們溝通交流,從而使本書日臻完善,以利來者?! ∽箫w 2011年秋
內(nèi)容概要
Jolt大獎(jiǎng)素有“軟件業(yè)之奧斯卡”的美稱,本叢書精選自Jolt歷屆獲獎(jiǎng)圖書,以植根于開發(fā)實(shí)踐中的獨(dú)到工程思想與杰出方法論為主要甄選方向。作者使用了超過600個(gè)現(xiàn)實(shí)的例子來向你展現(xiàn)如何甄別代碼的好壞;如何閱讀,應(yīng)當(dāng)注意什么,以及如何使用這些知識來改進(jìn)自己的代碼。本書在一些現(xiàn)實(shí)中的大型實(shí)例基礎(chǔ)上,論述了代碼閱讀的策略,并向讀者展示了如何將這些代碼閱讀和代碼理解的技藝運(yùn)用于實(shí)踐。
作者簡介
自1985年開始,本書作者Diomidis
Spinellis在開發(fā)大量開創(chuàng)性的,并受到極高評價(jià)的商業(yè)和開源項(xiàng)目的過程中,一直在鉆研、發(fā)展本書中所提及的各項(xiàng)技術(shù),期間他編寫和維護(hù)的代碼行數(shù)超過25萬行。他在英國倫敦帝國理工學(xué)院獲得了軟件工程方向的碩士學(xué)位及計(jì)算機(jī)科學(xué)博士學(xué)位。目前,他是希臘雅典經(jīng)濟(jì)與商業(yè)大學(xué)管理科學(xué)與技術(shù)系的教授。他曾撰寫過多部暢銷世界的計(jì)算機(jī)技術(shù)圖書,包括《架構(gòu)之美》、《代碼質(zhì)量》和《代碼閱讀》等。
書籍目錄
第1章 導(dǎo)論1
1.1 為何以及如何閱讀代碼2
1.1.1 將代碼作為文獻(xiàn)2
1.1.2 將代碼作為范例5
1.1.3 維護(hù)6
1.1.4 演進(jìn)6
1.1.5 重用8
1.1.6 檢查8
1.2 如何閱讀本書9
1.2.1 排版約定9
1.2.2 圖表11
1.2.3 練習(xí)12
1.2.4 輔助材料13
1.2.5 工具13
1.2.6 提綱13
1.2.7 關(guān)于“偉大語言”的爭論14
進(jìn)階閱讀15
第2章 基本編程元素17
2.1 一個(gè)完整的程序17
2.2 函數(shù)和全局變量22
2.3 while循環(huán)、條件和塊26
2.4 switch語句29
2.5 for循環(huán)31
2.6 break和continue語句34
2.7 字符和布爾表達(dá)式36
2.8 goto語句39
2.9 局部重構(gòu)41
2.10 do循環(huán)和整數(shù)表達(dá)式46
2.11 再論控制結(jié)構(gòu)49
進(jìn)階閱讀55
第3章 高級C數(shù)據(jù)類型57
3.1 指針57
3.1.1 鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)58
3.1.2 數(shù)據(jù)結(jié)構(gòu)的動態(tài)分配58
3.1.3 引用調(diào)用59
3.1.4 數(shù)據(jù)元素的訪問60
3.1.5 數(shù)組類型的參數(shù)和返回結(jié)果61
3.1.6 函數(shù)指針63
3.1.7 用做別名的指針65
3.1.8 指針和字符串67
3.1.9 直接內(nèi)存訪問69
3.2 結(jié)構(gòu)體70
3.2.1 組合數(shù)據(jù)元素70
3.2.2 從函數(shù)中返回多個(gè)數(shù)據(jù)元素71
3.2.3 映射數(shù)據(jù)的組織方式71
3.2.4 以面向?qū)ο蠓绞骄幊?3
3.3 聯(lián)合體75
3.3.1 有效利用內(nèi)存空間75
3.3.2 實(shí)現(xiàn)多態(tài)76
3.3.3 不同內(nèi)部表征的訪問77
3.4 動態(tài)內(nèi)存分配79
3.4.1 空閑內(nèi)存管理81
3.4.2 包含動態(tài)分配數(shù)組的結(jié)構(gòu)體83
3.5 typedef聲明85
進(jìn)階閱讀87
第4章 C數(shù)據(jù)結(jié)構(gòu)89
4.1 向量90
4.2 矩陣和表94
4.3 棧98
4.4 隊(duì)列100
4.5 映射103
4.5.1 散列表106
4.6 集合108
4.7 鏈表109
4.8 樹117
4.9 圖122
4.9.1 節(jié)點(diǎn)存儲122
4.9.2 邊的表示124
4.9.3邊的存儲127
4.9.4 圖的屬性129
4.9.5 隱含結(jié)構(gòu)129
4.9.6 其他表示方法130
進(jìn)階閱讀130
第5章 高級控制流程131
5.1 遞歸131
5.2 異常機(jī)制137
5.3 并行性141
5.3.1 硬件和軟件的并行性142
5.3.2 控制模型143
5.3.3 線程實(shí)現(xiàn)148
5.4 信號151
5.5 非局部跳轉(zhuǎn)154
5.6 宏替換157
進(jìn)階閱讀162
第6章 應(yīng)對大型項(xiàng)目163
6.1 設(shè)計(jì)和實(shí)現(xiàn)技術(shù)163
6.2 項(xiàng)目的組織165
6.3 編譯過程與makefile文件172
6.4 配置179
6.5 版本控制184
6.6 項(xiàng)目專用工具191
6.7 測試196
進(jìn)階閱讀203
第7章 編碼規(guī)范和約定205
7.1 文件的名稱和組織206
7.2 縮進(jìn)208
7.3 格式編排210
7.4 命名約定213
7.5 編程實(shí)踐217
7.6 過程規(guī)范219
進(jìn)階閱讀220
第8章 文檔221
8.1 文檔類型221
8.2 閱讀文檔222
8.3 文檔中存在的問題234
8.4 其他文檔來源236
8.5 常見的開源文檔格式239
進(jìn)階閱讀245
第9章 架構(gòu)414
9.1 系統(tǒng)結(jié)構(gòu)248
9.1.1 集中式存儲庫和分布式方法248
9.1.2 數(shù)據(jù)流架構(gòu)252
9.1.3 面向?qū)ο蠼Y(jié)構(gòu)254
9.1.4 分層架構(gòu)257
9.1.5 層次260
9.1.6 切片261
9.2 控制模型263
9.2.1 事件驅(qū)動系統(tǒng)263
9.2.2 系統(tǒng)管理器266
9.2.3 狀態(tài)轉(zhuǎn)移268
9.3 元素包裝270
9.3.1 模塊270
9.3.2 命名空間272
9.3.3 對象276
9.3.4 泛型實(shí)現(xiàn)287
9.3.5 抽象數(shù)據(jù)類型292
9.3.6 庫292
9.3.7 進(jìn)程和過濾器296
9.3.8 組件297
9.3.9 數(shù)據(jù)存儲庫299
9.4 架構(gòu)重用301
9.4.1 框架301
9.4.2 代碼向?qū)?02
9.4.3 設(shè)計(jì)模式303
9.4.4 領(lǐng)域?qū)S械募軜?gòu)305
進(jìn)階閱讀308
第10章 代碼閱讀工具311
10.1 正則表達(dá)式312
10.2 用編輯器瀏覽代碼314
10.3 用grep搜索代碼317
10.4 找出文件的差異325
10.5 開發(fā)自用工具326
10.6 借助編譯器閱讀代碼329
10.7 代碼瀏覽器與美化器333
10.8 運(yùn)行時(shí)工具338
10.9 非軟件工具342
可用工具與進(jìn)階讀物343
第11章 完整示例345
11.1 概況345
11.2 攻克計(jì)劃347
11.3 代碼重用348
11.4 測試與調(diào)試354
11.5 文檔361
11.6 觀察報(bào)告362
附錄A 源代碼致謝人員名單363
附錄B 源代碼致謝人員名單363
附錄C 源代碼致謝人員名單363
章節(jié)摘錄
版權(quán)頁: 插圖: 在分析一個(gè)重要的程序時(shí),最好先找出其最重要的部分。在本例中,這些部分是全局變量(圖2—2:1)和函數(shù)main(圖2—3)、getstops(見圖2—5:1)以及usage(見圖2—5:8)。 整型變量nstops和整型數(shù)組tabstops聲明為全局變量,它們的作用域在函數(shù)體之外。因此,它們對于所分析文件中的所有函數(shù)都是可見的。 緊接著的三個(gè)函數(shù)聲明聲明了該文件內(nèi)之后將出現(xiàn)的函數(shù)。由于其中的一些函數(shù)可能會在其定義之前使用,因此在C/C++程序中,這些聲明允許編譯器校驗(yàn)傳遞給函數(shù)的參數(shù)以及其返回值,并生成相應(yīng)的正確代碼。如果沒有給出前置聲明,那么C編譯器會依據(jù)函數(shù)第一次被使用的情形來做出關(guān)于函數(shù)返回值類型和參數(shù)的假設(shè);C++編譯器將這種情況標(biāo)記為錯(cuò)誤。如果接下來的函數(shù)定義與這些假設(shè)不相符,那么編譯器將給出一條警告或錯(cuò)誤信息。然而,若定義于另一個(gè)文件中的函數(shù)匹配這個(gè)錯(cuò)誤的聲明,則該通過,程序或許能夠編譯,但是在運(yùn)行時(shí)會失敗。 值得注意的是,兩個(gè)函數(shù)被聲明為static,而變量沒有。這就是說這兩個(gè)函數(shù)僅僅在該文件中可見,而那些變量則有可能對組成該程序的所有文件都可見。因?yàn)閑xpand僅由一個(gè)文件組成,所以這一差別在本例中并不重要。多數(shù)連接器(用來合并編譯后的C文件)都十分原始,對所有程序文件都可見的那些變量(即沒有被聲明為static的變量),可能會與定義于其他文件中的同名變量進(jìn)行讓人吃驚的交互。因此,在審查代碼時(shí),最好確保所有只用于單個(gè)文件的變量都聲明為static。 下面一起來看一下組成expand的函數(shù)。想要了解一個(gè)函數(shù)(或方法)在做什么,可以采用如下策略之一。 根據(jù)函數(shù)名猜測。 閱讀函數(shù)開頭的注釋。 分析該函數(shù)是如何被使用的。 閱讀函數(shù)體內(nèi)的代碼。 查詢外部程序文檔。 在本例中,可以很肯定地猜出函數(shù)usage將展示有關(guān)程序用法的信息然后退出;許多命令行程序都有與之具有同樣功能和名稱的函數(shù)。當(dāng)你分析大量的代碼時(shí),你將會逐漸得出變量和函數(shù)的名稱以及命名規(guī)范。這些將會幫助你正確的猜出它們的用途。然而,你應(yīng)當(dāng)做好準(zhǔn)備,根據(jù)代碼閱讀過程中必然會出現(xiàn)的一些新證據(jù)來隨時(shí)對最初的猜測做出修改。另外,基于猜測修改代碼時(shí),應(yīng)當(dāng)設(shè)計(jì)一個(gè)流程來驗(yàn)證最初的假設(shè)。這一流程可以包括用編譯器檢查、引入斷言或執(zhí)行恰當(dāng)?shù)臏y試用例。 getsopts的角色比較難于理解。這里沒有任何注釋,函數(shù)體中的代碼比較復(fù)雜,其名稱也可以多種方式解讀。注意它被用在程序中一個(gè)單獨(dú)的部分(圖2—3:3),這可以幫助我們做進(jìn)一步的分析。使用到getopt的部分在程序中負(fù)責(zé)處理程序選項(xiàng)(圖2—3:2)。因此,可以肯定地(在本例中也是正確地)認(rèn)為getopt將處理制表位說明選項(xiàng)。在閱讀代碼時(shí),這種漸進(jìn)式的理解較為常見;理解了某一部分的代碼可以使得其他部分變得容易理解。基于這種漸進(jìn)式的理解方式,在理解較為困難的代碼時(shí),可以采用類似組合拼圖游戲時(shí)的策略:從容易的部分開始。
編輯推薦
《Jolt大獎(jiǎng)精選叢書:代碼閱讀》榮獲2003年Jolt世界圖書大獎(jiǎng),參閱《代碼閱讀》對于大專院校相關(guān)專業(yè)的師生、計(jì)算機(jī)領(lǐng)域的從業(yè)人員或稗序設(shè)計(jì)愛好者都大有裨益。
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載