聚焦核心模塊,少閱讀80%的「無用」代碼

前面我們構建了項目的黑盒模型概念模型
本篇是《如何高效閱讀源碼》專題的第六篇,我們正式進入到代碼,找出項目中的核心模塊。

本節內容如下:

  • 爲什麼要找核心模塊?

  • 定位核心模塊的方法

  • 具體定位流程

爲什麼要找核心模塊?

相信大家都知道二八法則。二八法則又稱爲巴萊多定律,是19世紀末20世紀初意大利經濟學家巴萊多發現的。他認爲,在任何一組東西中,最重要的只佔其中的一小部分,約20%,其餘80%儘管是多數,卻是次要的。

二八法則適用於很多場景,當然也適用於項目代碼。前面已經說了,項目是爲了解決一個或幾個問題的,解決這些問題的代碼/模塊就是核心代碼/模塊,而輔助解決問題的代碼/模塊則是非核心代碼/模塊。根據二八法則,核心代碼/模塊佔總代碼量的20%,重要性卻佔80%

另外像Spring項目發展到今天已然是個龐然大物了,想要完整的讀完Spring源碼現在已經是個不可能完成的任務了,但是它的核心功能從項目創建之初一直到現在就基本沒變過:IOC和AOP!

同樣現在的Linux內核是一個更大的龐然大物,但是從0.0.1版本到現在的5.*版本,功能模塊也基本沒多少變化,就是操作系統相關的模塊。
所以我們只要理解核心模塊,也就理解了這個項目80%的邏輯!要理解核心功能,我們首先需要找到核心模塊。但是,怎麼找呢?

如何定位核心模塊?

一個設計良好的項目,模塊之間的依賴關係是明確的,且非核心模塊會依賴核心模塊。爲什麼呢?有如下幾個原因:

  • 核心模塊相對非核心模塊來說比較穩定。因爲它主要解決的是確定的問題,只要解決了問題,那它基本就不會變化了。

  • 非核心模塊則相對不穩定,因爲可能會有各種額外需求的變動。

  • 如果核心模塊依賴了非核心模塊,則會導致相對穩定的核心模塊也變得不穩定了

所以我們可以通過模塊之間的依賴關係來確定核心模塊
具體該怎麼做呢?我們通過JUnit4來演示定位核心模塊的流程。

具體操作流程

首先來看JUnit4的源碼結構:

從名字我們大致可以猜到哪些是核心包(你讀源碼的時候就能夠體會到取一個好的名字是一件多麼重要的事情了!):

  • junit.framework

  • junit.runner

  • org.junit.runner

  • org.junit.runners

這四個包應該是比較重要的。
但是這只是我們的猜測,有沒有辦法來確認呢?當然有。

假設大家使用的都是IDEA,那麼可以在junit包上右擊,選擇Diagrams,會得到junit包的包結構圖,然後將org.junit裏的包都拖進入,可以得到下圖:

 

 

從上圖中就可以看到各個包之間的一個繼承關係!對上面的關係進行裁剪,我們可以得到一個大致的核心包,我們從下往上看:

  • matchers和function包和其它包之間沒有繼承關係,我們可以先忽略

  • tests包裏都是測試,也可以忽略

  • samples包裏是示例,同樣忽略

  • extensions包是擴展包,因爲我們要找的是核心包,所以此包可以忽略

  • validator包看名字是驗證用的,也非核心邏輯,且和runner包之間是通過註解產生關聯的,忽略。

  • 在前面看文檔的時候,我們瞭解到rules是用於改變測試行爲的,也是一種擴展,所以也不是核心邏輯,且和runner包之間是通過註解產生關聯的,忽略。(閱讀文檔可以提高我們定位核心模塊的效率

  • internal包目前看不出來作用,看名字是內部使用的包,但是和runner包之間只是通過註解產生關聯的,暫時忽略。

剔除掉這些包後,我們最終得到如下核心包:

  • org.junit.runner

  • org.junit.runners

  • junit.framework

  • junit.runner

  • junit.textui

 

 

從依賴關係來看:

  • org.junit.runner和junit.framework都被兩個包依賴了,所以這兩個包是最核心的兩個包。但是junit.framework依賴了org.junit.runner,故org.junit.runner是最核心的包,junit.framework包次之。

  • junit.runner被一個包依賴,優先級低於前兩個包

  • junit.textui和org.junit.runners包沒有被任何包依賴,所以這兩個包的優先級最低

如果我們瞭解到JUnit4爲了兼容JUnit3,所以保留了junit包,那麼我們可以在org.junit.runner和junit.framework之間畫上一條邊界線,如下圖所示:

 

 

至此,我們就完成了對JUnit核心模塊的定位:

  • Junit4的核心包是org.junit.runner和org.junit.runners,且org.junit.runner包是更核心的包,org.junit.runners包次之。

  • junit.framework,junit.runner和junit.textui則是JUnit3的核心包,且junit.framework包是最核心的包。

總結

本文首先闡述了爲什麼要找核心模塊,然後通過模塊間的依賴關係來演示定位核心模塊的方法。
下文將深入到核心模塊內部,找出核心類,構建出抽象模型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章