如何閱讀別人的代碼
代碼閱讀的必要性
閱讀別人的代碼作為開發人員是一件經常要做的事情。一個是學習新的編程語言的時候,通過閱讀別人的代碼是一個最好的學習方法,另外是積累編程經驗。如果你有機會閱讀一些操作係統的代碼會幫助你理解操作係統一些基本的原理。還有就是在你作為一個質量保證人員或一個小領導的時候,如果你要做白盒測試的時候沒有閱讀代碼的能力是不能完成相應的任務。最後一個就是如果你中途接手一個項目的時候或給一個項目做售後服務的時候是要有閱讀代碼的能力的。
收集所有可能收集的材料
閱讀代碼要做的第一件事情是收集所有和項目相關的資料。比如你要做一個項目的售後服務,那麼你首先要搞明白項目做什麼用的,那麼調研文檔、概要設計文檔、詳細設計文檔、測試文檔、使用手冊都是你要最先搞到手的。如果你是為了學習,那麼盡量收集和你的學習有關的資料,比如你想學習linux的文件係統的代碼,那麼最好要找到linux的使用手冊、以及文件係統設計的方法、數據結構的說明等資料。(這些資料在書店和網上都可以找到)。
材料的種類
1、基礎資料
比如你閱讀turbo c2的源代碼,你應該準備turbo c2的函數手冊,使用手冊等專業書籍,如果是msc 6.0或者java ,此時不但要有函數手冊,還要有類庫函數手冊。這些資料都是你的基礎資料。另外你要有一些關於uml的資料可以作為查詢手冊也是一個不錯的選擇。
2、和程序相關的專業資料
每一個程序都是和相關行業相關的。比如我閱讀過一個關於氣象分析方麵的代碼,因為裏邊用到了一個複雜的數據轉換公式,所以不得不把自己的大學時候課本找出來 來複習一下高等數學的內容。如果你想閱讀linux的文件管理的代碼,那麼找一本講解linux文件係統的書對你的幫助會很大。
3、相關項目的文檔資料
這一部分的資料分為兩種,一個是相關行業的資料,比如你要閱讀一個稅務係統的代碼,那麼有一些財務/稅務係統的專業資料和國家的相關的法律、法規的資料是必不可少的。此外就是關於這個項目的需求分析報告、概要設計報告、詳細設計報告,使用手冊、測試報告等,盡量多收集對你以後的代碼閱讀是很重要的。
知識準備
了解基礎知識,不要上來就閱讀源代碼,打好基礎可以做到事半功倍的效果
留備份,構造可運行的環境
代碼拿到手之後的第一件事情是先做備份,最好是刻在一個光盤上,在代碼閱讀的時候一點不動代碼是很困難的一件事情,特別是你要做一些修改性或增強性維護的時候。而一旦做修改就可能發生問題,到時候要恢複是經常發生的事情,如果你不能很好的使用版本控製軟件,那麼先留一個備份是一個最起碼的要求了。
在做完備份之後最好給自己構造一個可運行的環境,當然可能會很麻煩,但可運行代碼和不可運行的代碼閱讀起來難度會差很多的。所以多用一點時間搭建一個環境是很值得的,而且我們閱讀代碼主要是為了修改其中的問題或做移植操作。不能運行的代碼除了可以學到一些技術以外,用處有限。
找開始的地方
做什麼事情都要知道從哪裏開始,讀程序也不例外。在c語言裏,首先要找到main()函數,然後逐層去閱讀,其他的程序無論是vb、delphi都要首先找到程序頭,否則你是很難分析清楚程序的層次關係。
分層次閱讀
在閱讀代碼的時候不要一頭就紮下去,這樣往往容易隻見樹木不見森林,閱讀代碼比較好的方法有一點象二叉樹的廣度優先的遍曆。在程序主體一般會比較簡單,調用的函數會比較少,根據函數的名字以及層次關係一般可以確定每一個函數的大致用途,將你的理解作為注解寫在這些函數的邊上。當然很難一次就將全部注解都寫正確,有時候甚至可能是你猜測的結果,不過沒有關係這些注解在閱讀過程是不斷修正的,直到你全部理解了代碼為止。一般來說采用逐層閱讀的方法可以是你係統的理解保持在一個正確的方向上。避免一下子紮入到細節的問題上。在分層次閱讀的時候要注意一個問題,就是將係統的函數和開發人員編寫代碼區分開。在c, c++,java ,delphi中都有自己的係統函數,不要去閱讀這些係統函數,除非你要學習他們的編程方法,否則隻會浪費你的時間。將係統函數表示出來,注明它們的作用即可,區分係統函數和自編函數有幾個方法,一個是係統函數的編程風格一般會比較好,而自編的函數的編程風格一般比較會比較差。從變量名、行之間的縮進、注解等方麵一般可以分辨出來,另外一個是象msc6++會在你編程的時候給你生成一大堆文件出來,其中有很多文件是你用不到了,可以根據文件名來區分一下哪些是係統函數,最後如果你實在確定不了,那就用開發係統的幫助係統去查一下函數名,對一下參數等來確定即可。
寫注解
寫注解是在閱讀代碼中最重要的一個步驟,在我們閱讀的源代碼一般來說是我們不熟悉的係統,閱讀別人的代碼一般會有幾個問題:1.搞明白別人的編程思想不是一件很容易的事情,即使你知道這段程序的思路的時候也是一樣。2.閱讀 代碼的時候代碼量一般會比較大,如果不及時寫注解往往會造成讀明白了後麵忘了前麵的現象。3.閱讀代碼的時候難免會出現理解錯誤,如果沒有寫注解很難及時地發現這些錯誤。4.不寫注解經常導致忘記函數的特性,如它的功能是什麼,從而經常會發生重複閱讀、理解的現象。
好了,說一些寫注解的基本方法:
1.猜測地去寫,剛開始閱讀一份源代碼的時候,你很難一下子就確定所有的函數的功能,不妨采用猜測的方法去寫注解,根據函數的名字、位置寫一個大致的注解,當然一般會有錯誤,但你的注解實際是動態調整的,直到最後你理解了全部代碼。
2.按功能去寫,別把注解寫成語法說明書,千萬別看到 fopen就寫“打開文件”,看到fread就寫“讀數據”,這樣的注解一點用處都沒有,而應該寫“在此處打開參數配置文件(****.conf),讀取係統初始化參數......”。這樣才是有用的注解。
3.在寫注解的同時,另外要注意的一個問題是分清楚係統自動生成的代碼和用戶自己開發的代碼,一般來說沒有必要寫係統自動生成的代碼。像delphi的代碼,我們往往要自己編寫一些自己的代碼段,還要對一些係統自動生成的代碼段進行修改,這些代碼在閱讀過程是要寫注解的,但有一些沒有修改過的自動生成的代碼就沒有必要寫注解了。
4.對於主要代碼段,較為詳細的注解是必要的。有一些函數或類在程序中起關鍵的作用,那麼要寫比較詳細的注解。這樣對於理解代碼有很大的幫助。
5.在理解起來比較困難的地方,要寫詳細的注解,在這些地方往往會有一些編程的技巧。不理解這些編程技巧對你以後的理解或移植會有問題。
6.寫中文注解。如果你的英文足夠的好,不用看這條了,但很多的人英文實在不怎麼樣,那就寫中文注解吧,我們寫注解是為了加快自己的理解速度。中文在大多數的時候比英文更適應中國人。與其寫一些誰也看不懂的英文注解還不如不寫。
重複閱讀
一次就可以將所有的代碼都閱讀明白的人是沒有的。至少我還沒有遇到過。反複的去閱讀同一段代碼有助於得代碼的理解。一般來說,在第一次閱讀代碼的時候,你可以跳過很多一時不明白的代碼段,隻寫一些簡單的注解,在以後的重複閱讀過程中,你對代碼的理解會比上一次理解得更深刻,這樣你可以修改那些注解錯誤的地方以及上一次沒有理解的對方。一般來說,對代碼閱讀3,4次基本可以理解代碼的含義和作用。
運行並修改代碼
如果你的代碼是可運行的,那麼先讓它運行起來,用單步跟蹤的方法來閱讀代碼,會提高你的代碼速度。代碼通過中間變量了解代碼的含義,而且對以後的修改會提供很大的幫助。
最後更新:2017-04-03 05:40:00