優雅的閱讀框架源碼

代碼是形式,邏輯是神韻。

引子

通過過來人的經驗,探討如何優雅的閱讀成熟框架的源碼。

溫馨提示

欲速則不達。閱讀源碼很容易理解爲就是直接去閱讀代碼本身。實際上,代碼只是形式,邏輯纔是神韻。

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

預思考

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

比如 SpringBean 模塊:

需求與目標

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

目標是功能與質量的結合體;除了功能部分,確定質量指標也是尤爲關鍵的。

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

方法

很多開發童鞋可能對閱讀源碼心生畏懼。其實讀源碼既不神祕也不復雜:寫個 Demo,打斷點,運行,然後細細揣摩。閱讀源碼就是觀摩高手出招的過程。

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

  2. 寫個 demo,能夠將主流程運行起來;

  3. 找到框架運行的入口點,通過靜態代碼分析,大致瞭解整個實現流程;

  4. 在預估會經過的關鍵地方打斷點,單步調試;

  5. 仔細查看主流程經過的主路徑、每一個主要對象及其成員變量的值及變化,細細揣摩其設計意圖和方法技巧;

  6. 繪製整體流程框圖和類的交互圖;

  7. 學習和理解關鍵類及關鍵方法及實現(代碼)。

閱讀源碼,要把握主要與擴展:

閱讀源碼,常常要將 “靜態代碼分析” 和“單步調試”結合起來使用。

靜態代碼分析

靜態代碼分析,就是沿着方法調用鏈,“順藤摸瓜” 一路點擊下去。通常能夠對整體流程有一個大概的瞭解。

由於框架實現常常基於接口編程,有時會遇到有多個實現的情形。這時,可以根據直覺和經驗,選擇一個最有可能的默認實現繼續跟下去,或者通過單步調試來弄清楚是哪個具體實現。

單步調試

單步調試,是看似笨拙卻很實用的源碼閱讀方法。單步調試在以下情形尤其有用:

框架解析

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

閱讀順序是:抽象層 -> 封裝與交互層 -> 細節實現層 或者 抽象層 -> 細節實現層 -> 封裝與交互層。抽象層好比匣中的寶珠,不能幹買櫝還珠的事情。

抽象層

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

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

比如,Bean 實例創建的核心代碼是 ClassPathBeanDefinitionScanner.doScan(掃描資源路徑,生成 beanDefinition 對象) 和 AbstractAutowireCapableBeanFactory.doCreateBean 方法(根據 beanDefinition 創建 bean 實例)。

設計層

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

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

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

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

細節層

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

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

克服障礙

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

原理流程圖

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

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

概念圖景

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

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

有的人,則會 “設計先行”:

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

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

核心類成員

要深入到具體實現,則無法避免核心類的閱讀。核心類往往擁有十幾個甚至幾十個成員及方法,展示出了十足的源碼閱讀勸退誠意。面對這種情況怎麼辦呢?有三個技巧可以結合使用:

技術難點

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

如何找到論述原理機制的相關文獻呢?有一些基本方法可循:

越到後面,就會發現,真正需要仔細閱讀和鑽研的書籍和論文,其實並不多。花費很多時間閱讀網絡文章,這些偷懶和捷徑,反而是走了彎路。

耐心與意志

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

可以使用多種輔助手段:

小結

源碼閱讀技能,可以說是程序員的 “內功心法” 之一。若是能讀通優秀源碼,則應對日常編程工作遊刃有餘,而應對難題則有路可循。

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

(感謝閱讀,希望對你所有幫助)

來源:cnblogs.com/lovesqcc/p/14403497.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/FOBvCCEa-cuDxEpbXo74xw