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

一瑜一琂發表於2022-03-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執行流程圖。

 

相關文章