­

HelloWorld:通過demo,構建黑盒模型

  • 2022 年 3 月 12 日
  • 筆記

在《源碼閱讀四步走,這才是閱讀源碼的正確姿勢》一文中,給出了源碼閱讀的完整步驟。
本篇是《如何高效閱讀源碼》專題的第四篇,正式開始講解閱讀源碼的具體方法!

程式界有個老傳統,學習新技術時都是從「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執行流程圖。