代碼是形式,邏輯是神韻。
引子
通過過來人的經(jīng)驗,探討如何優(yōu)雅的閱讀成熟框架的源碼。
溫馨提示
欲速則不達。閱讀源碼很容易理解為就是直接去閱讀代碼本身。實際上,代碼只是形式,邏輯才是神韻。
凡是有助于去理解邏輯,理解其原理、架構(gòu)、實現(xiàn)的,都是值得閱讀的。包括而不限于官方文檔和 API 文檔、架構(gòu)設計分析文章、原理分析文章、源碼閱讀分析文章。磨刀不誤砍柴工。準備工作做充足,充分借助各種資源輔助,閱讀源碼才能事半功倍。
預思考
有需求才有目標,有目標才有設計,有設計才有框架。在閱讀某個源碼模塊之前,思考若干基本問題是必要的。
比如 模塊:
需求與目標
需求與目標往往容易混為一談。但需求不等于目標。
目標是功能與質(zhì)量的結(jié)合體;除了功能部分,確定質(zhì)量指標也是尤為關鍵的。
對于某個框架來說,需求、適用場景和核心優(yōu)勢,都是可以直接在官網(wǎng)或項目主頁獲取到的。如何還原框架的設計目標呢?可以從核心優(yōu)勢中獲取基本說明,更多的就要從 API 文檔里來提煉了。
方法
很多開發(fā)童鞋可能對閱讀源碼心生畏懼。其實讀源碼既不神秘也不復雜:寫個 Demo,打斷點,運行,然后細細揣摩。閱讀源碼就是觀摩高手出招的過程。
確立目標,通常是理解某個模塊的原理、設計或者為了解決實際問題;
寫個 demo,能夠?qū)⒅髁鞒踢\行起來;
找到框架運行的入口點,通過靜態(tài)代碼分析,大致了解整個實現(xiàn)流程;
在預估會經(jīng)過的關鍵地方打斷點,單步調(diào)試;
仔細查看主流程經(jīng)過的主路徑、每一個主要對象及其成員變量的值及變化,細細揣摩其設計意圖和方法技巧;
繪制整體流程框圖和類的交互圖;
學習和理解關鍵類及關鍵方法及實現(xiàn)(代碼)。
閱讀源碼,要把握主要與擴展:
閱讀源碼,常常要將“靜態(tài)代碼分析”和“單步調(diào)試”結(jié)合起來使用。
靜態(tài)代碼分析
靜態(tài)代碼分析,就是沿著方法調(diào)用鏈,“順藤摸瓜”一路點擊下去。通常能夠?qū)φw流程有一個大概的了解。
由于框架實現(xiàn)常常基于接口編程,有時會遇到有多個實現(xiàn)的情形。這時,可以根據(jù)直覺和經(jīng)驗,選擇一個最有可能的默認實現(xiàn)繼續(xù)跟下去,或者通過單步調(diào)試來弄清楚是哪個具體實現(xiàn)。
單步調(diào)試
單步調(diào)試,是看似笨拙卻很實用的源碼閱讀方法。單步調(diào)試在以下情形尤其有用:
框架解析
框架的設計實現(xiàn)通常包括三層:
閱讀順序是:抽象層 -> 封裝與交互層 -> 細節(jié)實現(xiàn)層 或者 抽象層 -> 細節(jié)實現(xiàn)層 -> 封裝與交互層。抽象層好比匣中的寶珠,不能干買櫝還珠的事情。
抽象層
抽象層即是問題求解層。技術面試中問到的原理或?qū)崿F(xiàn)機制,通常都屬于這一層。
由于封裝和交互、實現(xiàn)細節(jié)的大量代碼往往會將用于解決問題的核心代碼“淹沒”,因此,在探索抽象層時,要學會大膽過濾封裝和細節(jié),直接跳過大量的分支條件語句,暫時跳過令人疑惑的地方,始終聚焦和直擊解決問題的核心部分。用于解決基本問題的核心代碼通常是不多的。
比如,Bean 實例創(chuàng)建的核心代碼是 .(掃描資源路徑,生成 對象) 和. 方法(根據(jù) 創(chuàng)建 bean 實例)。
設計層
要弄明白設計層,就要先弄清楚框架的整體設計:
框架的設計實現(xiàn)常常會用到設計模式。
常用設計模式的使用場景:
理解基本設計模式的特征和適用場景微信關注代碼生成器,識別設計模式的使用,可以更自如地在框架源碼之間穿梭。
細節(jié)層
細節(jié)是最考驗源碼閱讀的心性了。細節(jié)藏魔鬼。關鍵細節(jié)考慮不周全,可能會導致整個設計的失敗。因此,細節(jié)層也是值得仔細推敲的。技術面試中也常常考察實現(xiàn)細節(jié)。如果能夠回答上來,大概率會讓面試官眼前一亮。
有時,一些實現(xiàn)細節(jié)可能讓人摸不到頭腦。此時,可以上網(wǎng)搜索一下,往往會“茅塞頓開”。
克服障礙
閱讀成熟框架源碼,遇到的一大挑戰(zhàn)就是對象之間的錯綜復雜的交互關系。令人生畏。這實際上考驗著開發(fā)者的抽象和建模能力。
原理流程圖
原理流程圖非常重要,就像地圖一樣,指引人更容易地在“代碼迷宮”中穿行而不迷失方向。
在閱讀源碼之前,設法弄到并理解框架的原理流程圖,往往能起到事半功倍的效果。就如行兵打仗,先弄清楚天時與地形。不可不重視之。
概念圖景
優(yōu)秀的軟件設計,往往是先建立一個比較完整的概念圖景。概念圖景微信關注代碼生成器,就是關于某個問題域的概念及其關聯(lián)關系的整體圖。
譬如蓋房子吧。有的人蓋房子就是:砌磚!砌磚!!砌磚!!!要安裝窗戶怎么辦?把其中一大塊磚墻錘空了再安。
有的人,則會“設計先行”:
如何理清其中的復雜交互關系,從而理解其中蘊含的設計思想呢?需要先理清楚框架的概念圖景。
有兩種技巧可以結(jié)合使用:
核心類成員
要深入到具體實現(xiàn),則無法避免核心類的閱讀。核心類往往擁有十幾個甚至幾十個成員及方法,展示出了十足的源碼閱讀勸退誠意。面對這種情況怎么辦呢?有三個技巧可以結(jié)合使用:
技術難點
技術難點也是理解源碼實現(xiàn)的一個主要障礙。技術難點主要有三類:
如何找到論述原理機制的相關文獻呢?有一些基本方法可循:
越到后面,就會發(fā)現(xiàn),真正需要仔細閱讀和鉆研的書籍和論文,其實并不多。花費很多時間閱讀網(wǎng)絡文章,這些偷懶和捷徑,反而是走了彎路。
耐心與意志
閱讀框架源碼需要很大的耐心和意志。有點像蠶寶寶吃桑葉,需要一點一點地啃。各個擊破。在這個過程中,需要克服不少障礙,才能“修得正果”。
可以使用多種輔助手段:
小結(jié)
源碼閱讀技能,可以說是程序員的“內(nèi)功心法”之一。若是能讀通優(yōu)秀源碼,則應對日常編程工作游刃有余,而應對難題則有路可循。
路漫漫其修遠兮,吾將上下而求索。
(感謝閱讀,希望對你所有幫助)來源://p/.html
-END- 如果看到這里,說明你喜歡這篇文章,請?轉(zhuǎn)發(fā)、點贊。微信搜索「web_resource」,關注后回復「進群」或者掃描下方二維碼即可進入無廣告交流群。
↓掃描二維碼進群↓
推薦閱讀?
1.??Nginx 常用配置清單
2.??拿下 Spring Boot !
5.??Java 日常開發(fā)的 21 個坑 喜歡文章,點個在看?