官术网_书友最值得收藏!

4.如何閱讀項目源碼?

每一個程序員都有閱讀項目源碼的經歷,很多初學者在第一次閱讀項目源碼時都會產生一個疑問,面對規模龐大的項目源碼,到底應該從何處下手?本節要回答的便是如何閱讀源碼這個問題。

明確目的

在開始之前,我們應該首先明確自己閱讀項目源碼的目的。有些程序員是需要維護這個項目,例如修正項目中的bug,或是為項目擴展新的功能;有些程序員是需要對這個項目加以利用,避免重復造輪子;有些程序員是為了提高自己的代碼質量,而去閱讀優秀項目的源碼。首先要說明的是,盡管我們將優秀的代碼比作文章,但代碼畢竟不是小說一樣的讀物,如果是為了讀代碼而去讀代碼,在一個龐大的項目面前,相信很難有人能夠堅持下來。因此我們必須要明確自己閱讀源碼的目的,這樣才能有針對性地解決問題,同時,明確的需求也是我們閱讀源碼的動力來源。

閱讀方法

閱讀源碼遵循的一個原則是自頂向下,首先樹立對項目的整體認識,然后進入項目的模塊乃至函數層面的細節部分。因此,如果擁有項目相關的資料與文檔,例如概要設計文檔、詳細設計文檔、測試文檔等,閱讀源碼就可以事半功倍。如果沒有項目文檔,我們可以首先查看項目的架構,項目中文件夾的劃分往往表示模塊劃分,通過對目錄結構的梳理我們也能對項目形成初步認識。另外,當前層級目錄中的readme文件也是重要的說明文件。

在閱讀了項目相關的資料與文檔之后,我們對項目整體有了初步的認識,下面就要開始源碼的閱讀了。從哪里開始閱讀呢?首先需要明確我們關心的模塊,找到項目中相關的功能模塊,從該模塊開始閱讀,而不是閱讀與所需功能無關的模塊。在鎖定了模塊之后,就要開始尋找程序入口的地方,例如對于C++和Java,入口函數是main函數,找到了程序開始的地方,我們就能順著程序的主線梳理核心的代碼邏輯了。

閱讀源代碼應該遵循先整體后部分的原則,而不是一頭扎入細節,即閱讀的方法應類似于廣度優先遍歷,而不提倡深度優先遍歷。程序的主體是層次最高的代碼,往往比較簡單,調用的函數往往也較少,根據所調用的函數名以及層次關系一般可以確定每一個函數的大致用途。在理解了程序主體的核心邏輯之后,可以依次閱讀程序主體調用的層級較低的模塊和函數,分層閱讀時,需要注意區分系統函數和開發人員編寫的函數,注重閱讀開發人員編寫的函數。在閱讀代碼的過程中,不能指望閱讀一遍即能掌握,反復的閱讀可以加深對于代碼邏輯的理解。如果程序的邏輯較為復雜,還可以考慮畫出函數的調用關系圖,變量的變化方式等。

編譯運行

想要理解代碼,只通過閱讀是不夠的,最好的方式是運行代碼,這就需要我們學會調試,對調試的內容感興趣的讀者可以閱讀第5節。在閱讀代碼時,我們可以在關注的地方設置斷點,調試程序運行到斷點處,查看此時的調用棧以及各變量值的變化情況。單元測試是理解源碼的另一個有效渠道,單元測試中的測試用例能夠反映代碼作者對于測試用例經過程序執行后的期望結果,讀者往往可以通過單元測試加深對源碼程序邏輯的理解。

編碼之道

最后,每個程序員在閱讀項目源碼之后都應該學習其中優秀的代碼編寫之道,例如對于設計模式的應用,良好的編程習慣等。在之后自己編寫代碼的過程中,嚴格要求自己的代碼質量,因為我們的代碼一定會在將來被其他人或者自己反復閱讀。剛入門的程序員往往只將功能的實現放在第一位,而忽略了我們會花費很長時間閱讀我們自己寫過的代碼,忽視代碼質量只會讓一個項目變得越來越臃腫和耦合,想要再維護就會花費大量的精力。為了避免破窗效應,我們應該在編寫項目的最開始就嚴格要求代碼質量,并自始至終貫徹這一原則。

主站蜘蛛池模板: 灵宝市| 三亚市| 芦山县| 桃园市| 北宁市| 灵璧县| 丰原市| 拜城县| 潜山县| 商南县| 河西区| 昆明市| 山东| 吉木萨尔县| 海门市| 朝阳县| 泰安市| 鄄城县| 石景山区| 沐川县| 卓资县| 辉县市| 桦川县| 庆云县| 石台县| 壶关县| 云阳县| 东莞市| 偏关县| 儋州市| 钟山县| 旺苍县| 屏山县| 景泰县| 庆城县| 温宿县| 西昌市| 华亭县| 永康市| 元谋县| 西和县|