昨天和部分網友進行了線上的交流,交流中有不少網友提到閱讀原始碼比較難,不知道怎麼上手。胖哥分享了一些個人經驗,這裡總結一下。
閱讀原始碼實際上是Debug原始碼
其實所謂的閱讀原始碼並不是單純的閱讀,而是除錯原始碼。光看不動手,啥也不會有。除錯原始碼我一般會從這幾個方面著手。
樣例和單元測試
很多原始碼都是samples樣例專案以及單元測試,你可以從這些可執行的程式碼入手。例如Spring Authorization Server中的單元測試和樣例。
這種樣例和單元測試都非常容易,可以作為上手入門專案。
重視日誌
日誌作為了解邏輯執行的記錄,每個程式設計師都應該知道它的重要性。線上故障排除,大多都靠日誌來定位追蹤,因此在看原始碼的時候更應該去看日誌。學會看日誌,重視日誌不僅僅對看原始碼有幫助,對日常開發也很有幫助。一個優秀的開發者一定是一個優秀的日誌閱讀者,所以你要把看日誌這個事重視起來。
目標明確
閱讀的時候一定要有目標地去閱讀,比如今天的閱讀是為了搞清楚某個類的初始化流程,或者弄明白某個機制等等。不在這個目標之內的細節和概念都可以先放到一邊,比如下面的這個片段:
我只想單純瞭解這個過濾器的過濾流程,我就把它的流程標記清楚,我不會去糾結每一行的細節。細節裡面還有細節,這樣你就陷入了無限的細節之中了。瞭解整體流程了之後,再去看關鍵步驟的細節,比如裡面的步驟②。以搞清楚步驟②為目標再去了解AuthenticationConverter
的機制。然後我只看AuthenticationConverter
,其它的同樣不關心。如法炮製把幾個步驟都搞明白,然後串起來就相當於把整個流程的細節給搞清楚了。
先看抽象再看實現
靈活的Java框架都是面向介面程式設計,這個介面抽象了什麼一定要搞清楚,介面一般會有一個到幾個方法,例如AuthenticationProvider
只有兩個方法:
假如我現在也不知道它幹嘛的,我要搞明白它,我應該怎麼入手?我是這麼幹的:
- 先看註釋,看作者的設計意圖,這個比除錯重要,好的原始碼都有詳細的註釋,包括從命名上,一些詞彙都能反映這個東西是幹嘛的。
- 再看每個方法的入參和返回值,瞭解這些返回值的詳細資訊。
- 看誰引用了這個抽象介面。
- 最後再看看它都有哪些實現。
根據上面幾個步驟瞭解的一些資訊,打一些斷點,去觀察分析。
學會拆解目標
很多人上來就要研究什麼Spring Bean生命週期,Spring Boot啟動流程,這個太過於巨集大了,不是一時半會能夠掌握的。你要把這個大目標拆成很多的小目標。比如Spring Bean是如何註冊的?註冊前幹了什麼?註冊後幹了什麼?一個一個來,分而治之,最後把它們串起來。這樣不但降低了難度,而且提高了成就感。你看見別人寫的一文搞定XXXX,文章是一文,可他分析的時間可不止一天,很多都是幾個目標的成果彙總。
拆解目標在任何工作中都非常有用,學會了之後收益無窮。
必須總結
筆記是必須的,我沒有見過不記筆記的大牛。程式設計這東西靠的不是死記硬背。新框架層出不窮,新概念日新月異,你腦子記得住?反正我是記不住,包括Spring Security的東西我都記不住。不過我會記筆記啊,又不是閉卷考試,用得到時候翻一翻,又回來了。這裡推薦使用markdown,語法簡單,排版有條理。可以說我所有的創作都是markdown。
一些除錯技巧
其它的我暫時想不到,這裡就分享一些IDEA除錯技巧。
學會看呼叫幀
學會看下面這個Frames:
這個要從下往上看,這是你執行的一些程式碼的記錄幀,你可以用滑鼠選中檢視每一幀的執行情況。
這有點像視訊剪輯,找到關鍵幀去處理一些東西。
增加Watches
選中一個變數,Add to Watches,你就可以在整個流程中觀察這個變數的變化情況,生命週期。多用於觀察一些關鍵引數。
表示式操作
你還可以選中一個變數,按下Alt+F8後就可以在對話方塊中操作這個變數,比如獲取當前的屬性,別隻會System.out.println
!就像下面的一樣:
你還可以通過它提供的方法來改變一些值,來驗證你的一些推斷。
總結
原始碼分析能力是你進階的關鍵。調包每個開發都會,能夠掌控自如的永遠都是那些善於鑽研的人。
關注公眾號:Felordcn 獲取更多資訊