在《原始碼閱讀四步走,這才是閱讀原始碼的正確姿勢》一文中,給出了原始碼閱讀的完整步驟。
本篇是《如何高效閱讀原始碼》專題的第四篇,正式開始講解閱讀原始碼的具體方法!
程式界有個老傳統,學習新技術時都是從「Hello World」開始的!無論是學習新語言時列印「Hello World」;還是學習新框架時編寫個demo!
對於瞭解語言或專案來說,編寫個demo可能就夠了。但是如果要閱讀專案原始碼,僅僅是編寫個demo是遠遠不夠,你需要通過demo構建「黑盒模型」!
本節內容如下:
-
什麼是黑盒模型,以及為什麼要構建黑盒模型
-
如何構建黑盒模型?
-
通過demo演示構建黑盒模型的具體流程
什麼是黑盒模型?
在測試裡有「黑盒測試」一說!黑盒測試也稱功能測試,它是通過測試來檢測每個功能是否都能正常使用。在測試中,程式被看作一個不能開啟的黑盒子,只對程式介面進行測試,它只檢查程式是否能適當地接收輸入資料而產生正確的輸出資訊。
而所謂「黑盒模型」,即先把我們要閱讀的專案看做一個黑盒子,基於這個黑盒子構建一個可以執行的模型。基於這個模型,我們可以大致的瞭解專案的功能流程。對專案流程有個整體的印象。
如何構建黑盒模型?
在有些講解物件導向設計的書裡,講了如何通過需求構建簡單物件模型的方法:
-
找出需求中的名詞,構建為物件
-
找出需求內的動詞,構建為方法
-
將物件和方法歸類組合,構成業務流程
構建黑盒模型的流程和上面的流程很類似,甚至更簡單,不需要你去設計,只需要梳理即可,大致流程如下:
-
編寫一個具有基本功能的demo
-
把專案本身當做黑盒子,找出demo中使用到的物件,同時補充可能會用到的物件
-
基於這些物件來繪製結構圖
-
基於demo梳理流程,將結構中的模組串聯起來
下面以JUnit4為例,來演示此流程。
編寫demo
假設,我們有一個包含say方法的Person類,這個方法接收一個String型別的引數,返回”Hello,”+arg,如下圖所示:
我們通過JUnit對此類進行測試,測試程式碼如下圖所示:
現在的IDE都整合了測試的執行環境,可以直接執行測試,這在執行測試時很方便,但是卻會隱藏了一些我們需要了解的內容。
為了能更清晰的梳理測試的執行流程,我們通過命令列來執行測試(建議在執行其它專案的demo時也通過命令列執行):
java org.junit.runner.JUnitCore org.ivan.PersonTest
複製程式碼
執行結果如下:
JUnit version 4.12
tearDown invoke
Time: 0.014OK (1 tests)
複製程式碼
繪製結構圖
基於上面的demo,我們來繪製對應的結構圖!
上面的demo中我們可以很明顯的看到四個類:
-
Person
-
PersonTest
-
Assert
-
JUnitCore(如果使用IDE來執行,那你就看不到這個類了)
實際上,應該還有一個類,用於展示結果的物件,我們這裡暫且叫它Result。可能在JUnit中,它並不叫Result,但是沒關係,我們現在只要知道有這麼一個類即可。
找到類後,我們對這些類進行歸類:
-
很明顯,Person和PersonTest是我們自己編寫的程式碼,所以屬於自身專案
-
而JunitCore,Result和Assert是由JUnit提供的,所以屬於JUnit
最終結構圖看起來像這樣。
梳理流程
基於上面的結構圖並結合demo流程,我們來繪製執行流程:
-
首先,很明顯JUnitCore是入口類,因為它是被Java直接呼叫的
-
此類呼叫PersonTest來執行測試
-
PersonTest呼叫Person執行對應方法
-
並通過Assert類的方法判定結果是否和預期的相同
-
測試結果通過Result返回,輸出到命令列
這個流程是我們通過demo梳理出來的一個粗略的流程。它正確嗎?不一定,不過它給了我們一個專案流程概覽,我們可以基於這張圖來不斷的完善,從黑盒到灰盒最終到白盒,得到詳細的專案執行流程。
總結
本文梳理了閱讀原始碼的第一步「通過demo,構建黑盒模型」:
-
編寫一個具有基本功能的demo
-
將開源專案本身當做黑盒子,繪製結構圖
-
基於demo梳理流程,將結構中的模組串聯起來
後面的文章將基於上圖來不斷的完善,最終得到一個相對完整的JUnit執行流程圖。