成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

學(xué)習(xí)開源框架源碼到底難不難?-創(chuàng)新互聯(lián)

 學(xué)習(xí)開源框架源碼到底難不難?

那么,先跟小伙伴們聊聊學(xué)習(xí)開源框架源碼的感受,請(qǐng)問(wèn)你們認(rèn)為學(xué)習(xí)開源框架源碼到底難不難?這是一個(gè)開放的話題,可謂仁者見仁,智者見智。有一些開源大牛們會(huì)說(shuō),So easy!;有一些有源碼閱讀習(xí)慣且工作多年的小伙伴們會(huì)說(shuō),還好。;有一些剛開始學(xué)習(xí)源碼的小伙伴們會(huì)說(shuō),太難了!。是的,不同工作經(jīng)驗(yàn)不同技術(shù)層次的人的回答是不一樣的。

創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為云龍等服務(wù)建站,云龍等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為云龍企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

那么剛開始學(xué)習(xí)開源項(xiàng)目源碼難不難呢?應(yīng)該對(duì)絕大部分小伙伴們來(lái)說(shuō)應(yīng)該是偏難的。為什么呢?可能有以下四點(diǎn)原因

  1. 一個(gè)能流行起來(lái)的成熟的開源項(xiàng)目必定功能齊全,可擴(kuò)展,而功能齊全可擴(kuò)展的開源項(xiàng)目必定很復(fù)雜,代碼量大。比如Spring5框架的源碼行數(shù)達(dá)到了六七十萬(wàn)行,SpringBoot的源碼行數(shù)達(dá)到了25萬(wàn)行左右,Dubbo和RocketMQ的源碼行數(shù)達(dá)到了10萬(wàn)行。一個(gè)成熟的開源項(xiàng)目代碼量這么多,可以想象其有多復(fù)雜。
  2. 閱讀源碼時(shí),我們有時(shí)候無(wú)法猜透源碼作者當(dāng)時(shí)編碼時(shí)的想法。因?yàn)樵趧傞_始閱讀源碼的過(guò)程中,我們肯定會(huì)遇到很不懂的代碼,不知道作者為何這么寫,為何在這個(gè)位置寫代碼,這些都是很正常的,因?yàn)楫?dāng)初作者為啥這么寫,可能是針對(duì)一些比較特殊的業(yè)務(wù)場(chǎng)景,或者為了某方面的性能等等,我們根本無(wú)法猜透。打個(gè)不太恰當(dāng)?shù)谋扔鳎喿x源碼猜測(cè)作者的心思就像當(dāng)初遇到一個(gè)自己喜歡的姑娘,猜測(cè)她的心思一樣,比如猜測(cè)她喜歡什么,她的興趣愛好是什么。其實(shí)剛開始閱讀源碼也一樣,有些地方我們一開始是無(wú)法猜透作者的心思的。
  3. 有些開源框架可能集操作系統(tǒng)知識(shí),數(shù)據(jù)結(jié)構(gòu),算法和設(shè)計(jì)模式于一身。是的,優(yōu)秀的框架必定是集成了很多設(shè)計(jì)模式于一身,目前為止筆者還沒(méi)見過(guò)哪種流行的又沒(méi)有應(yīng)用設(shè)計(jì)模式的框架哈。比如很多框架運(yùn)用了單例模式,工廠模式,責(zé)任鏈模式,裝飾器模式和模板方法模式等,因?yàn)槭褂迷O(shè)計(jì)模式能讓框架易于擴(kuò)展。同時(shí),不乏一些框架應(yīng)用了一些操作系統(tǒng)層面的知識(shí),這一塊比較底層,相信很多學(xué)java的小伙伴沒(méi)接觸過(guò)。此外,開源框架某些地方會(huì)用到數(shù)據(jù)結(jié)構(gòu)和算法,舉個(gè)栗子,比如Dubbo默認(rèn)有四種負(fù)載均衡策略,而每種策略又對(duì)應(yīng)一種算法,其中又?jǐn)?shù)RoundRobinLoadBalance負(fù)載均衡策略最復(fù)雜,一開始實(shí)現(xiàn)RoundRobinLoadBalance負(fù)載均衡的方式并不太完美或者說(shuō)有bug,Dubbo也是重寫過(guò)RoundRobinLoadBalance幾次,最終借鑒了Nginx的RoundRobinLoadBalance負(fù)載均衡算法。

    這里好像扯的有點(diǎn)遠(yuǎn)了,總之這里要說(shuō)明的是閱讀優(yōu)秀框架是有一定難度的。

  4. 有些開源框架注釋太少也增加了閱讀源碼的難度。說(shuō)到開源項(xiàng)目注釋,如果我們閱讀老外寫的的框架源碼可能還好,一般都會(huì)有大量注釋,比如Spring框架,可以說(shuō)幾乎每個(gè)方法都有注釋,這個(gè)就給我們閱讀源碼起了很大的幫助。不過(guò)唯一不好的可能就是英文注釋,閱讀對(duì)英語(yǔ)有一定的要求。其實(shí)英文注釋還好,遇到不懂的,百度翻一下就好了。其實(shí)比較頭疼的就是一些國(guó)內(nèi)優(yōu)秀的開源框架,其注釋可以說(shuō)是很少的,這無(wú)疑大大增加了閱讀的難度,甚至有些框架的文檔也不齊全,那就更加GG了。

 該如何入手去分析開源框架源碼?

前面跟小伙伴們聊了閱讀源碼的難度,千萬(wàn)不要被嚇慌了。不可否認(rèn),剛開始閱讀某個(gè)開源項(xiàng)目的源碼是有一定的難度。注意,前面的用詞是剛開始,剛開始哈。也就是說(shuō)如果我們堅(jiān)持閱讀源碼的話,養(yǎng)成閱讀源碼是陶冶情操的習(xí)慣的話,長(zhǎng)期堅(jiān)持下來(lái)再去閱讀其他項(xiàng)目的源碼,游刃有余不敢說(shuō),但肯定可以很快入手。

那么,我們?cè)撊绾稳胧秩シ治鲩_源框架源碼呢?

首先,結(jié)合前面所說(shuō)的閱讀源碼之所以難的原因,我們就要有針對(duì)性的去克服解決。比如有空多學(xué)學(xué)設(shè)計(jì)模式,算法和英語(yǔ)。這些軟實(shí)力確實(shí)對(duì)閱讀源碼有很大幫助。

其次,閱讀源碼的前提是什么?當(dāng)然,閱讀源碼是要建立在會(huì)使用的基礎(chǔ)上,就像若還不會(huì)走路就學(xué)騎單車一樣,若連用都不會(huì)就去鉆研源碼可能會(huì)適得其反。

最后,我們閱讀源碼要注意一些技巧,現(xiàn)在根據(jù)自身經(jīng)歷總結(jié)一下相關(guān)思路和技巧,如下:

  1. 開始閱讀源碼時(shí),先對(duì)框架的模塊及其關(guān)系有一個(gè)整體的認(rèn)識(shí)。我們要對(duì)框架項(xiàng)目的模塊和目錄要有一個(gè)全盤的了解,要知道每個(gè)模塊是干嘛的,然后要了解模塊與模塊之間的關(guān)系。

    舉個(gè)栗子,比如Dubbo的模塊分包核心的主要有以下八個(gè),如下圖,我們要知道最基礎(chǔ)的的模塊應(yīng)該是dubbo-common公共邏輯模塊,這個(gè)模塊作為最基礎(chǔ)的模塊,主要是提供了通用模型和工具類;然后dubbo-remoting是遠(yuǎn)程通訊模塊,依賴于dubbo-common模塊,相當(dāng)于Dubbo協(xié)議的實(shí)現(xiàn);而dubbo-rpc則是遠(yuǎn)程調(diào)用模塊,依賴于dubbo-remoting模塊,抽象各種協(xié)議,以及動(dòng)態(tài)代理;dubbo-cluster是集群模塊,依賴于dubbo-rpc模塊,將多個(gè)服務(wù)提供方偽裝為一個(gè)提供方,包括:負(fù)載均衡, 容錯(cuò),路由等


  2. 分析源碼先從父類或父接口開始分析。因?yàn)楦割惢蛘吒附涌谕砹艘活惞δ?,這些基類或基類接口往往抽象了各個(gè)具體子類共有的屬性和行為,一些比較基礎(chǔ)的方法都在父類中實(shí)現(xiàn),然后留個(gè)模板方法給子類去實(shí)現(xiàn)即可(模板方法的應(yīng)用)。

    舉個(gè)栗子,這里還是拿Dubbo的負(fù)載均衡來(lái)說(shuō)吧,如下圖,LoadBalance是各種負(fù)載均衡策略的超級(jí)接口,定義了 select 方法用來(lái)實(shí)現(xiàn)選擇哪臺(tái)機(jī)器;然后AbstractLoadBalance是一個(gè)抽象類,實(shí)現(xiàn)了LoadBalance接口,在覆蓋了 select 方法后,其又增加了 calculateWarmupWeight 和 getWeight 權(quán)重相關(guān)的兩個(gè)方法,因?yàn)檫@些方法都跟具體的負(fù)載均衡策略類有關(guān),故在父類實(shí)現(xiàn)了。值得注意的是AbstractLoadBalance抽象類的 select 方法中里留了個(gè)給子類覆蓋的 doSelect 方法,具體的負(fù)載均衡策略將在doSelect中實(shí)現(xiàn)。


  3. 閱讀源碼前首先要找到啟動(dòng)類。閱讀分析源碼時(shí)要先從啟動(dòng)類開始,因此找到框架啟動(dòng)的入口很重要。

  4. 閱讀源碼時(shí)要分清主干和枝節(jié)代碼。找到啟動(dòng)入口后,然后就可以順著啟動(dòng)入口一步一步調(diào)試來(lái)閱讀源碼了。不過(guò)在初次調(diào)試源碼時(shí)值得注意的是一定要分清主次代碼,即要先閱讀主干代碼,其他枝枝節(jié)節(jié)的代碼沒(méi)明白的可以放一邊。切忌一開始就深入細(xì)節(jié)然后出不來(lái)了,這樣就會(huì)造成只見冰山一角而看不到全貌的感覺。
  5. 閱讀源碼前要分清主次模塊。即閱讀分析源碼不能漫無(wú)目的,全盤通讀,我們要從我們平時(shí)有用到的模塊開始分析。每個(gè)人的時(shí)間都很寶貴,我們要把時(shí)間花在刀刃上。比如SpringBoot增加的新特性中有自動(dòng)配置,而自動(dòng)配置特性又非常重要,因此可以挑選自動(dòng)配置來(lái)進(jìn)行源碼分析。
  6. 要充分利用源碼項(xiàng)目的測(cè)試類。之前也說(shuō)過(guò),一個(gè)框架之所以能流行,必定是經(jīng)過(guò)大量測(cè)試的。因此如果我們像具體了解某個(gè)類和某個(gè)方法,我們可以充分利用這些測(cè)試類來(lái)輔助我們?cè)创a分析。
  7. 要學(xué)會(huì)一些調(diào)試技巧。這一點(diǎn)也很重要,比如在調(diào)試過(guò)程中如何查看調(diào)用關(guān)系等等,這里不多說(shuō),如何高效學(xué)習(xí)和閱讀源碼這篇文章中分享了大量調(diào)試的干活,小伙伴們可以瞅瞅。此外,還要學(xué)會(huì)有技巧的搜索源碼,說(shuō)到這里,下面舉個(gè)栗子。

    舉個(gè)Spring事件監(jiān)聽的栗子。比如我們現(xiàn)在要知道哪個(gè)監(jiān)聽器監(jiān)聽了ContextRefreshedEvent事件,此時(shí)我們可以通過(guò)idea全局搜索"(ContextRefreshedEvent"關(guān)鍵字,得到以下截圖:從下圖可以看到spring-webmvc模塊的FrameworkServlet,spring-context模塊的ScheduledAnnotationBeanPostProcessor,和spring-jms模塊的JmsListenerEndpointRegistry等類訂閱了ContextRefreshedEvent事件,那么在容器刷新的時(shí)候這幾個(gè)類將會(huì)監(jiān)聽到ContextRefreshedEvent事件,執(zhí)行一些初始化邏輯

  8. 肯定還有大量的閱讀源碼技巧,希望本文能起到拋磚引玉的作用,期待小伙伴們可以留言分享下,讓筆者也收益一下。

4 學(xué)源碼,談實(shí)踐,論堅(jiān)持

最后,我們學(xué)習(xí)源碼不是為了學(xué)習(xí)而學(xué)習(xí),最理想的效果我們要學(xué)以致用。比如把從源碼中學(xué)習(xí)到的設(shè)計(jì)模式,接口設(shè)計(jì)方法,面向?qū)ο笤瓌t和相關(guān)算法等等都可以應(yīng)用到我們手頭的項(xiàng)目中,這才是我們學(xué)習(xí)源碼的最終目的,也是源碼學(xué)習(xí)的最理想的效果??赡苓@里有些小伙伴會(huì)說(shuō),我平時(shí)參與的項(xiàng)目都是業(yè)務(wù)類的項(xiàng)目,而不是開發(fā)基礎(chǔ)框架,開發(fā)中間件,CRUD比較多,可能學(xué)習(xí)基礎(chǔ)框架的源碼對(duì)我們用處很少。其實(shí)不是的,只要你有參與項(xiàng)目,學(xué)習(xí)源碼我們學(xué)習(xí)的是思想,我們就可以把源碼框架設(shè)計(jì)中的思想應(yīng)用到我們的項(xiàng)目中。

最后的最后,我們來(lái)談?wù)?strong>堅(jiān)持,這是最難能可貴的。很多大道理我們都懂,比如要堅(jiān)持運(yùn)動(dòng),堅(jiān)持學(xué)習(xí),堅(jiān)持...,可是就是沒(méi)能堅(jiān)持下來(lái),包括我自己,嘿嘿。堅(jiān)持這東西太南了,不過(guò)還是應(yīng)該給自己立個(gè)flag吧,把自己有用到的框架比如SpringBoot,Spring,Mybatis,Dubbo,SpringCloud等框架源碼都閱讀分析一遍,加油,小伙伴們共勉!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前名稱:學(xué)習(xí)開源框架源碼到底難不難?-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://jinyejixie.com/article32/hispc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、商城網(wǎng)站、品牌網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)面包屑導(dǎo)航、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
潮州市| 慈利县| 新丰县| 乌兰察布市| 盐津县| 五指山市| 东方市| 宿州市| 朝阳区| 甘洛县| 镶黄旗| 桂东县| 怀来县| 长寿区| 广平县| 芮城县| 仁寿县| 大渡口区| 车险| 五家渠市| 如东县| 西昌市| 舟曲县| 高台县| 黔西县| 达日县| 阿图什市| 肥西县| 乌拉特后旗| 会理县| 临清市| 老河口市| 泽库县| 镇平县| 巴彦淖尔市| 平武县| 永城市| 商都县| 平顶山市| 方山县| 石首市|