如何高效、優(yōu)雅、愉快地閱讀項(xiàng)目源碼?
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
引子
能夠讀懂獨(dú)立類和基本容器的實(shí)現(xiàn); 能夠讀懂小型的基礎(chǔ)庫和框架; 通過源碼閱讀來調(diào)試和解決實(shí)際中的問題。
預(yù)思考
需求是什么?用一句話說清楚; 設(shè)計(jì)目標(biāo)是什么?用一句話說清楚; 核心優(yōu)勢(shì)和適用場(chǎng)景是什么?分別用一句話說清楚; 基本原理是怎樣的?先自己思考怎么實(shí)現(xiàn),然后閱讀框架原理文章; 整體設(shè)計(jì)是怎樣的?先自己思考怎么設(shè)計(jì),然后閱讀架構(gòu)設(shè)計(jì)的文章; 技術(shù)難點(diǎn)是什么?先自己思考其中的難點(diǎn)及解決方案,然后閱讀相關(guān)文章; 數(shù)據(jù)結(jié)構(gòu)及算法流程是如何設(shè)計(jì)的?閱讀框架的源碼解析文章。
需求:有一套通用機(jī)制去創(chuàng)建和裝配應(yīng)用所需要的完整的 Bean 實(shí)例,使得應(yīng)用無需關(guān)注 Bean 實(shí)例的創(chuàng)建和管理,只要按需獲??; 設(shè)計(jì)目標(biāo):根據(jù)指定的配置文件或注解,生成和存儲(chǔ)應(yīng)用所需要的裝配完整的 Bean 實(shí)例,并提供多種方式來獲取 Bean 實(shí)例; 核心優(yōu)勢(shì):支持多種裝配方式、自動(dòng)裝配、依賴關(guān)系自動(dòng)注入;支持不同作用域的 Bean 實(shí)例創(chuàng)建和獲取;穩(wěn)定高效; 適用場(chǎng)景:有大量的 Bean 需要?jiǎng)?chuàng)建,這些 Bean 存在復(fù)雜的依賴關(guān)系; 基本原理:反射機(jī)制 + 緩存; 算法流程:創(chuàng)建 bean 工廠對(duì)象 -> 掃描資源路徑,獲得 bean 的 class 文件 -> 生成 bean 定義的 beanDefinition 實(shí)例 -> 根據(jù) beanDefinitioin 實(shí)例創(chuàng)建 bean 實(shí)例并緩存到 bean 工廠對(duì)象 -> 依賴自動(dòng)注入 -> 執(zhí)行鉤子方法 -> 完整的 bean 實(shí)例準(zhǔn)備就緒。 技術(shù)難點(diǎn):依賴自動(dòng)裝配、循環(huán)引用;解決自動(dòng)依賴注入和循環(huán)引用問題需要用到緩存機(jī)制。
需求是寬泛的,目標(biāo)是具體的; 目標(biāo)是需求的一種實(shí)現(xiàn)途徑,往往是設(shè)計(jì)一個(gè)具備某些關(guān)鍵特性的系統(tǒng)或產(chǎn)品。
方法
確立目標(biāo),通常是理解某個(gè)模塊的原理、設(shè)計(jì)或者為了解決實(shí)際問題; 寫個(gè) demo,能夠?qū)⒅髁鞒踢\(yùn)行起來; 找到框架運(yùn)行的入口點(diǎn),通過靜態(tài)代碼分析,大致了解整個(gè)實(shí)現(xiàn)流程; 在預(yù)估會(huì)經(jīng)過的關(guān)鍵地方打斷點(diǎn),單步調(diào)試; 仔細(xì)查看主流程經(jīng)過的主路徑、每一個(gè)主要對(duì)象及其成員變量的值及變化,細(xì)細(xì)揣摩其設(shè)計(jì)意圖和方法技巧; 繪制整體流程框圖和類的交互圖; 學(xué)習(xí)和理解關(guān)鍵類及關(guān)鍵方法及實(shí)現(xiàn)(代碼)。
首先把主流程及涉及到的主要類弄透徹; 理解其擴(kuò)展機(jī)制; 理解主要擴(kuò)展實(shí)現(xiàn)(需要的時(shí)候徐圖之)。
接口調(diào)用有多個(gè)實(shí)現(xiàn),難以確定是哪個(gè)是具體實(shí)現(xiàn)時(shí); 查看某個(gè)比較復(fù)雜的具體類的成員時(shí); 理解實(shí)現(xiàn)細(xì)節(jié)時(shí)。
框架解析
問題域及解決方案構(gòu)成的抽象層,解決問題的核心部分; 封裝和交互構(gòu)成的設(shè)計(jì)層,確保靈活性、可擴(kuò)展性和應(yīng)用集成; 各種細(xì)節(jié)構(gòu)成的實(shí)現(xiàn)層,用于保證性能和容錯(cuò)等。
有哪些子模塊,子模塊的設(shè)計(jì)意圖是什么; 子模塊之間的關(guān)聯(lián)是怎樣的,如何串聯(lián)成一個(gè)完整的設(shè)計(jì)意圖。
常用設(shè)計(jì)模式:工廠、單例、外觀、策略、適配器、裝飾、代理、模板、組合、觀察者、迭代器; 不同問題域可能會(huì)用到的設(shè)計(jì)模式,比如 DB 驅(qū)動(dòng)接口實(shí)現(xiàn)會(huì)用到生成器模式和橋接模式,web 請(qǐng)求處理用到職責(zé)鏈模式。
如果需要?jiǎng)?chuàng)建實(shí)例,則通常離不開工廠和單例模式; 如果涉及較為復(fù)雜的算法流程,部分算法需要在子類實(shí)現(xiàn),則會(huì)用到模板方法模式; 如果需要多種實(shí)現(xiàn),并依據(jù)特定場(chǎng)景來選取使用,則會(huì)用到策略模式; 如果要將客戶端接口及實(shí)現(xiàn)與框架的調(diào)用隔離,則會(huì)用到動(dòng)態(tài)代理模式; 如果要靈活疊加多種功能,則會(huì)用到裝飾器模式; 如果涉及到事件機(jī)制,則離不開觀察者模式; 如果需要在庫實(shí)現(xiàn)的基礎(chǔ)上提供簡(jiǎn)潔接口,則通常用到外觀模式; 如果要將多種實(shí)現(xiàn)與多種接口定義進(jìn)行連接,則會(huì)用到橋接模式; 如果需要涉及大量配置(規(guī)格)并生成實(shí)例,則通常用到生成器模式; 如果涉及容器元素訪問,則離不開迭代器模式; 如果需要以統(tǒng)一接口訪問整體與部分的行為,且整體由部分組成,則通常用到組合模式。
克服障礙
原材料 => 子部件 => 組合與集成。 原材料:磚、石、木、鋁、銅、玻璃等; 子部件:墻、窗框、窗戶、門、地板、樓梯、鎖、通道等; 房子:由子部件進(jìn)行組合和集成而成; 機(jī)制:子部件的組合與集成的原理支撐,比如形狀的組合與契合、承壓計(jì)算等。
如何理清其中的復(fù)雜交互關(guān)系,從而理解其中蘊(yùn)含的設(shè)計(jì)思想呢?需要先理清楚框架的概念圖景。
由于接口定義了具體類的行為規(guī)范,可以通過閱讀接口定義及文檔來了解其設(shè)計(jì)思路和骨架; 查看具體類的實(shí)例成員(暫不涉及方法),根據(jù)經(jīng)驗(yàn)揣摩其設(shè)計(jì)意圖。
按快捷鍵 Alt+7,可以查看該類的所有成員及方法,概覽一下,大致猜測(cè)其意圖; 首先只關(guān)注那些對(duì)核心問題求解有重要影響的成員,暫時(shí)忽略那些用來提升性能、可擴(kuò)展性等方面的成員; 單步調(diào)試,仔細(xì)看看運(yùn)行時(shí)的成員對(duì)象如何,這樣會(huì)更加直觀具體一些。比如 DefaultListableBeanFactory 這個(gè)類,單步調(diào)試后得到如下圖示:
數(shù)據(jù)結(jié)構(gòu)與算法:比如 HashMap 用到了哈希表和紅黑樹,需要先閱讀文獻(xiàn)(比如《算法導(dǎo)論》)理解其結(jié)構(gòu)與算法; 原理機(jī)制:比如 IO 讀寫、內(nèi)存管理、文件系統(tǒng)、編譯原理、網(wǎng)絡(luò)協(xié)議,先學(xué)習(xí)相關(guān)的原理機(jī)制,夯實(shí)基礎(chǔ); 編程模型:特別的編程手法和技巧,比如讀 hystrix 源碼,就要先熟悉函數(shù)式編程和響應(yīng)式編程。
經(jīng)典書籍:比如數(shù)據(jù)結(jié)構(gòu)與算法,就有《算法導(dǎo)論》、《算法》、《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》(排序與查找)等; 經(jīng)典論文:一些還沒來得及寫入書籍的論文解讀,比如 Raft 算法等; 技術(shù)書籍:比如 Linux 操作系統(tǒng)內(nèi)核實(shí)現(xiàn),TCP 協(xié)議詳解等; 官方文檔:優(yōu)秀項(xiàng)目主頁的文檔部分,往往有相關(guān)原理機(jī)制的介紹,比如 ES 的官方文檔; JavaDoc:優(yōu)秀源碼的 Java Doc 往往會(huì)引用相關(guān)出處,比如 AQS 的源碼; 優(yōu)秀博文:優(yōu)秀博文往往有一些文獻(xiàn)引用,可以閱讀相關(guān)文獻(xiàn)引用; 百科與搜索:在維基百科上搜索出處和引用來源;或者使用搜索引擎。
邊聽音樂邊閱讀代碼; 拉取代碼分支,邊讀邊做標(biāo)記并提交; 閱讀原理、架構(gòu)及源碼分析文章。
小結(jié)
作者 | 琴水玉
來源 | cnblogs.com/lovesqcc/p/14403497.html

評(píng)論
圖片
表情
