在《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的演示,來詳細的說明每一個步驟的具體做法。