框架原始碼閱讀的方法與技巧

2022-01-13 07:03:54 字數 2660 閱讀 7833

**是形式,邏輯是神韻。

在 「解鎖優秀源**的基本方法與技巧」 一文中,**了閱讀優秀原始碼的基本步驟、方法、技巧、所面臨的障礙及克服之策。多加訓練,應該可以達成如下目標:

欲速則不達。閱讀原始碼很容易理解為就是直接去閱讀**本身。實際上,**只是形式,邏輯才是神韻。

凡是有助於去理解邏輯,理解其原理、架構、實現的,都是值得閱讀的。包括而不限於官方文件和 api 文件、架構設計分析文章、原理分析文章、原始碼閱讀分析文章。磨刀不誤砍柴工。準備工作做充足,充分借助各種資源輔助,閱讀原始碼才能事半功倍。

有需求才有目標,有目標才有設計,有設計才有框架。在閱讀某個原始碼模組之前,思考若干基本問題是必要的。

比如 springbean 模組:

需求與目標

需求與目標往往容易混為一談。但需求不等於目標。

目標是功能與質量的結合體;除了功能部分,確定質量指標也是尤為關鍵的。質量指標可參閱:「web服務端軟體的服務品質概要」

對於某個框架來說,需求、適用場景和核心優勢,都是可以直接在官網或專案主頁獲取到的。如何還原框架的設計目標呢?可以從核心優勢中獲取基本說明,更多的就要從 api 文件裡來提煉了。

確立目標,通常是理解某個模組的原理、設計或者為了解決實際問題;

寫個 demo,能夠將主流程執行起來;

找到框架執行的入口點,通過靜態**分析,大致了解整個實現流程;

在預估會經過的關鍵地方打斷點,單步除錯;

仔細檢視主流程經過的主路徑、每乙個主要物件及其成員變數的值及變化,細細揣摩其設計意圖和方法技巧;

繪製整體流程框圖和類的互動圖;

學習和理解關鍵類及關鍵方法及實現(**)。

閱讀原始碼,常常要將「靜態**分析」和「單步除錯」結合起來使用。

靜態**分析

靜態**分析,就是沿著方法呼叫鏈,「順藤摸瓜」一路點選下去。通常能夠對整體流程有乙個大概的了解。

由於框架實現常常基於介面程式設計,有時會遇到有多個實現的情形。這時,可以根據直覺和經驗,選擇乙個最有可能的預設實現繼續跟下去,或者通過單步除錯來弄清楚是哪個具體實現。

單步除錯

框架的設計實現通常包括三層:

抽象層

抽象層即是問題求解層。技術面試中問到的原理或實現機制,通常都屬於這一層。

由於封裝和互動、實現細節的大量**往往會將用於解決問題的核心**「淹沒」,因此,在探索抽象層時,要學會大膽過濾封裝和細節,直接跳過大量的分支條件語句,暫時跳過令人疑惑的地方,始終聚焦和直擊解決問題的核心部分。用於解決基本問題的核心**通常是不多的。

比如,bean 例項建立的核心**是 classpathbeandefinitionscanner.doscan(掃瞄資源路徑,生成 beandefinition 物件) 和abstractautowirecapablebeanfactory.docreatebean 方法(根據 beandefinition 建立 bean 例項)。

設計層

要弄明白設計層,就要先弄清楚框架的整體設計:

框架的設計實現常常會用到設計模式。

常用設計模式的使用場景:

理解基本設計模式的特徵和適用場景,識別設計模式的使用,可以更自如地在框架原始碼之間穿梭。

細節層

細節是最考驗原始碼閱讀的心性了。細節藏魔鬼。關鍵細節考慮不周全,可能會導致整個設計的失敗。因此,細節層也是值得仔細推敲的。技術面試中也常常考察實現細節。如果能夠回答上來,大概率會讓面試官眼前一亮。

有時,一些實現細節可能讓人摸不到頭腦。此時,可以上網搜尋一下,往往會「茅塞頓開」。

閱讀成熟框架原始碼,遇到的一大挑戰就是物件之間的錯綜複雜的互動關係。令人生畏。這實際上考驗著開發者的抽象和建模能力。

原理流程圖

原理流程圖非常重要,就像地圖一樣,指引人更容易地在「**迷宮」中穿行而不迷失方向。

在閱讀原始碼之前,設法弄到並理解框架的原理流程圖,往往能起到事半功倍的效果。就如行兵打仗,先弄清楚天時與地形。不可不重視之。

概念圖景

優秀的軟體設計,往往是先建立乙個比較完整的概念圖景。概念圖景,就是關於某個問題域的概念及其關聯關係的整體圖。

譬如蓋房子吧。有的人蓋房子就是:砌磚!砌磚!!砌磚!!!要安裝窗戶怎麼辦?把其中一大塊磚牆錘空了再安。

有的人,則會「設計先行」:

如何理清其中的複雜互動關係,從而理解其中蘊含的設計思想呢?需要先理清楚框架的概念圖景。

有兩種技巧可以結合使用:

核心類成員

技術難點

技術難點也是理解原始碼實現的乙個主要障礙。技術難點主要有三類:

程式設計模型:特別的程式設計手法和技巧,比如讀 hystrix 原始碼,就要先熟悉函式式程式設計和響應式程式設計。

耐心與意志

閱讀框架原始碼需要很大的耐心和意志。有點像蠶寶寶吃桑葉,需要一點一點地啃。各個擊破。在這個過程中,需要克服不少障礙,才能「修得正果」。

可以使用多種輔助手段:

原始碼閱讀技能,可以說是程式設計師的「內功心法」之一。若是能讀通優秀原始碼,則應對日常程式設計工作游刃有餘,而應對難題則有路可循。

路漫漫其修遠兮,吾將上下而求索。

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

原始碼閱讀技巧篇

說到讀原始碼,讓我想起來了讀書,古語有云 讀破萬卷書,下筆如有神 就拿rocketmq來說,它是如何實現高效能 高可用。之前寫過高可用的一些思考和理解裡面的特性他應該都滿足,rocketmq就是把這些很多零散的知識點整合運用之後寫出的非常牛逼的專案。依舊拿讀書來說,我們應該讀什麼書呢?讀名著,讀大師...

閱讀原始碼的意義與方法

思索了這兩個問題良久,也去知乎找了一些相關話題的問答,但並沒有標準答案。所以,我這裡也只是記錄一些我對此的看法,也許會隨著 rtfsc 閱歷的豐富而發生變化,我會記錄更新於 github.com mzlogin rtf 在我看來,閱讀原始碼的意義在於學習優秀的 套路 這裡的 套路 所指範圍很廣,大到...