在《15個小技巧,助你源碼閱讀事半功倍》一文中,給出了15個提高源碼閱讀效率的小技巧。
本文是《如何高效閱讀源碼》專題的第三篇,來聊一聊「閱讀源碼的具體步驟」!
在本專題第一篇,我們已經知道了不正確的閱讀源碼的方法,那正確的閱讀源碼的方式是什么呢?
其實很簡單,我總結為四步:
-
建模:基於源碼進行建模
-
梳理:基於模型進行流程的梳理
-
歸納:對梳理出的流程進行歸納,再整合進模型中
-
延伸:在建模、梳理、歸納中觸類旁通,與其它項目或技術點產生關聯,擴大知識面
這四步又可以細分為可操作的十個步驟(后面的十篇文章將對每一步進行詳細的講解,保證可操作性):
-
「通過demo,構建黑盒模型」:一般我們接觸項目的第一步都是編寫一個HelloWorld,我們應該如何看待這個HelloWorld小demo呢?跑起來就ok了嗎?你有沒有想過,你可能小看了這個demo?這個demo可能有你想象不到的大功效?本節將講解如何通過demo構建出黑盒模型,使你對項目有一個最初的了解。
-
「閱讀文檔,了解概念模型」:完善的開源項目都會有比較完善的文檔,你有沒有好好讀過項目文檔?該怎么讀項目文檔?你能從項目文檔里收獲到什么呢?本節將講解如何閱讀項目文檔,以及如何從項目文檔構建出概念模型。
-
「根據模塊依賴,找出核心模塊」:一般我們在項目的設計階段會繪制架構圖,架構圖一般表示的是模塊之間的關系。那我們在閱讀源碼時能反過來找到這些模塊嗎?又如何確定這些模塊之間的關系呢?本節將詳細講解如何通過源碼反推出模塊依賴,以及找出核心模塊的方法。
-
「根據類依賴,構建抽象模型」:我們在開發設計的時候一直說着建模建模,我們在閱讀源碼的時候有思考過如何找到這些模型嗎?我們該怎么找到這些模型呢?本節將詳細講解如何找出核心類,並通過核心類構建出抽象模型。這個模型就是項目的核心。
-
「根據抽象模型,梳理核心流程」:如果通過debug的方式不是梳理流程的好方法,那么什么樣的方式是梳理流程的好方法呢?本節將詳細講解如何基於核心模型快速的梳理出核心流程。
-
「畫圖加深理解」:我們90%的信息來源於眼睛,畫圖能加深我們對項目的理解,那我們在閱讀源碼的時候該如何畫圖呢?本節將詳細講解如何繪制核心流程圖,並將核心流程圖整合進概念模型中,得到一個更完整的模型。
-
「閱讀擴展模塊,補充執行流程」:核心模塊雖然是一個項目最重要的部分,但是必要的輔助流程也是整個項目流程中不可或缺的一部分。我們該如何梳理這些輔助流程呢?本節將詳細講解如何從核心流程梳理出輔助流程,以完善整個項目流程。
-
「理解核心流程設計」:我們梳理了核心流程,那為什么作者要這么設計呢?這么設計是基於哪些考量呢?本節將基於核心流程來理解具體的代碼設計。
-
「關聯延伸閱讀」:一個項目可能會和其它的項目有關系,那我們該如何梳理這些關系呢?比如:Spring中使用了JUnit,它們是如何關聯的呢?本節通過Spring使用JUnit的例子來講解如何進行關聯延伸閱讀,使得兩個項目的代碼邏輯串聯起來。
-
「不同版本之間源碼的閱讀」:一個項目會有很多的版本,我們讀了一個版本,其它的版本還需要讀嗎?該如何讀呢?本節通過JUnit3與JUnit4的源碼對比來講解不同版本之間的閱讀方法。
注意,上面的流程不一定按順序進行,比如:
-
有的人是實踐派,那么可以先「編寫demo,構建黑盒模型」;有的人是概念派,可以先「閱讀文檔,了解概念模型」
-
而「畫圖」則貫穿了源碼閱讀的整個過程
-
「關聯延伸閱讀」、「不同版本之間源碼的閱讀」則是非必選項
示例說明
專題后續的章節將使用JUnit來演示具體的流程。選擇JUnit來作為示例,主要基於如下幾個原因:
-
代碼量相對較少,便於講解:本專欄的目的是講解一種高效閱讀的方法,而不是對某個項目的源碼的具體講解,主要講的是方法。如果選擇代碼量很大的項目,比如Spring,那么講解代碼本身就要耗費很大的篇幅,而閱讀源碼的方法可能就被代碼給淹沒了。
-
結構清晰:好的項目,一般都有一個比較好的結構。JUnit自開發出來后,就被稱贊結構清晰,且使用了多種設計模式。在學習源碼的同時,可以理解設計模式在項目中的應用。
-
文檔齊全:好的項目,也應該是文檔齊全的。JUnit有官方網站,有較完善的文檔。對閱讀源碼有很大的幫助
-
測試框架事實上的標准:雖然在單元測試里,還有如TestNG這樣的開源項目,但是一般情況下,使用JUnit進行單元測試的項目更多。JUnit可以說就是測試框架事實上的標准。學習標准項目的收益更高,既學習到了知識,又能在實際工作中使用,加深印象。同時,后面如果要學習同類型項目也會輕松很多。
-
版本迭代:JUnit從JUnit3,JUnit4一直到JUnit5,新版本都對老版本做了兼容。多版本比較閱讀,能理解項目的發展,為什么會這么發展。由於JUnit5已經發展成了測試平台,這里不做討論,只討論JUnit3和JUnit4。
總結
本文給出了源碼閱讀的一個整體流程,后面的章節將通過基於JUnit的演示,來詳細的說明每一個步驟的具體做法。