1. 程式人生 > >如何學習別人的程式程式碼

如何學習別人的程式程式碼

 只要是個程式設計師就會看程式碼,但是很多人,包括我在內,在看一些開原始碼的時候往往一頭霧水,不知從何看起。

    越是結構好的程式碼,如果不理解它的思想越是難得看懂,例如Qt、Agg、CryptPP等。這裡我將我的一些經驗寫在這裡,留個記錄吧。

    完善的開源工程都會有文件,即使沒有文件也應當有api-guid,那麼我們先找到它們,這時我們不要管它是怎麼設計的,先編譯一個,照著例子寫個程式執行一下吧,再試試一些高階功能。這時我們在心中先猜猜它應當是怎樣設計的(大多數情況是沒有想法)。好吧,我們再來看文件,文件中一般有靜態結構的說明,如模組劃分、類列表、每個類的成員列表。嗯,還是一頭霧水啊,沒辦法,我們開啟原始碼所在的資料夾,看看原始碼的組織方式。嗯,有點頭緒了,大多數情況下,目錄結構與工程結構是一致的,而我們編寫例子程式的時候使用的介面一般在原始碼的include目錄下。那好吧,我們根據標頭檔案名和目錄結構去找相應的實現檔案吧,但這往往相當困難,因為你會發現它根本就不是你所想的那樣。一個類或一個外部變數,你想找到它往往會動用Windows的搜尋。看了幾個小時還沒有太大的進展,仍然不知道它的頭(高層的入口)在哪,尾(底層的具體實現)在哪,不過你至少對那些地方有哪些檔案都熟悉了,那些零星的註釋也被你看了一遍。這時該把你寫的例子程式拿出來了,我們單步跟進去,跟的同時我們也注意一下所跟到的檔案的物理位置、它附近都有哪些檔案、哪些類或結構。一直跟下去,這樣我們往往會順藤摸瓜找到最底層的實現,並發現一條執行路徑(太變態的或用了一堆模板的除外)。由於你已經對工程的結構有了一定了解,這時你可以從頭和尾一起開始看程式碼(前提是你已經找到了一個頭和一個尾),將一條線弄清楚,那麼這個工程的其他線也應該是差不多的設計思路。

    有些開源工程裡面的巨集特別多,那你要當心,首先搞清楚這些巨集吧。

    用C寫的工程往往比用C++寫的容易懂,因為它最多有很多函式指標和extern變數,而後者則令人頭疼得多,如果你實在沒有辦法,那麼上網搜吧,很多著名的開源工程一般會有一些人將其研究心得放到blog上,看一看,說不定一下豁然開朗。

    好吧,就寫這麼多,真是亂七八糟。