中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

學習開源框架源碼到底難不難?

發布時間:2020-05-23 17:08:40 來源:億速云 閱讀:779 作者:鴿子 欄目:編程語言

 學習開源框架源碼到底難不難?

那么,先跟小伙伴們聊聊學習開源框架源碼的感受,請問你們認為學習開源框架源碼到底難不難?這是一個開放的話題,可謂仁者見仁,智者見智。有一些開源大牛們會說,So easy!;有一些有源碼閱讀習慣且工作多年的小伙伴們會說,還好。;有一些剛開始學習源碼的小伙伴們會說,太難了!。是的,不同工作經驗不同技術層次的人的回答是不一樣的。

那么剛開始學習開源項目源碼難不難呢?應該對絕大部分小伙伴們來說應該是偏難的。為什么呢?可能有以下四點原因

  1. 一個能流行起來的成熟的開源項目必定功能齊全,可擴展,而功能齊全可擴展的開源項目必定很復雜,代碼量大。比如Spring5框架的源碼行數達到了六七十萬行,SpringBoot的源碼行數達到了25萬行左右,Dubbo和RocketMQ的源碼行數達到了10萬行。一個成熟的開源項目代碼量這么多,可以想象其有多復雜。
  2. 閱讀源碼時,我們有時候無法猜透源碼作者當時編碼時的想法。因為在剛開始閱讀源碼的過程中,我們肯定會遇到很不懂的代碼,不知道作者為何這么寫,為何在這個位置寫代碼,這些都是很正常的,因為當初作者為啥這么寫,可能是針對一些比較特殊的業務場景,或者為了某方面的性能等等,我們根本無法猜透。打個不太恰當的比喻,閱讀源碼猜測作者的心思就像當初遇到一個自己喜歡的姑娘,猜測她的心思一樣,比如猜測她喜歡什么,她的興趣愛好是什么。其實剛開始閱讀源碼也一樣,有些地方我們一開始是無法猜透作者的心思的。
  3. 有些開源框架可能集操作系統知識,數據結構,算法和設計模式于一身。是的,優秀的框架必定是集成了很多設計模式于一身,目前為止筆者還沒見過哪種流行的又沒有應用設計模式的框架哈。比如很多框架運用了單例模式,工廠模式,責任鏈模式,裝飾器模式和模板方法模式等,因為使用設計模式能讓框架易于擴展。同時,不乏一些框架應用了一些操作系統層面的知識,這一塊比較底層,相信很多學java的小伙伴沒接觸過。此外,開源框架某些地方會用到數據結構和算法,舉個栗子,比如Dubbo默認有四種負載均衡策略,而每種策略又對應一種算法,其中又數RoundRobinLoadBalance負載均衡策略最復雜,一開始實現RoundRobinLoadBalance負載均衡的方式并不太完美或者說有bug,Dubbo也是重寫過RoundRobinLoadBalance幾次,最終借鑒了Nginx的RoundRobinLoadBalance負載均衡算法

    這里好像扯的有點遠了,總之這里要說明的是閱讀優秀框架是有一定難度的。

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

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

前面跟小伙伴們聊了閱讀源碼的難度,千萬不要被嚇慌了。不可否認,剛開始閱讀某個開源項目的源碼是有一定的難度。注意,前面的用詞是剛開始剛開始哈。也就是說如果我們堅持閱讀源碼的話,養成閱讀源碼是陶冶情操的習慣的話,長期堅持下來再去閱讀其他項目的源碼,游刃有余不敢說,但肯定可以很快入手。

那么,我們該如何入手去分析開源框架源碼呢?

首先,結合前面所說的閱讀源碼之所以難的原因,我們就要有針對性的去克服解決。比如有空多學學設計模式,算法和英語。這些軟實力確實對閱讀源碼有很大幫助。

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

最后,我們閱讀源碼要注意一些技巧,現在根據自身經歷總結一下相關思路和技巧,如下:

  1. 開始閱讀源碼時,先對框架的模塊及其關系有一個整體的認識。我們要對框架項目的模塊和目錄要有一個全盤的了解,要知道每個模塊是干嘛的,然后要了解模塊與模塊之間的關系。

    舉個栗子,比如Dubbo的模塊分包核心的主要有以下八個,如下圖,我們要知道最基礎的的模塊應該是dubbo-common公共邏輯模塊,這個模塊作為最基礎的模塊,主要是提供了通用模型和工具類;然后dubbo-remoting是遠程通訊模塊,依賴于dubbo-common模塊,相當于Dubbo協議的實現;而dubbo-rpc則是遠程調用模塊,依賴于dubbo-remoting模塊,抽象各種協議,以及動態代理;dubbo-cluster是集群模塊,依賴于dubbo-rpc模塊,將多個服務提供方偽裝為一個提供方,包括:負載均衡, 容錯,路由等

  2. 分析源碼先從父類或父接口開始分析。因為父類或者父接口往往代表了一類功能,這些基類或基類接口往往抽象了各個具體子類共有的屬性和行為,一些比較基礎的方法都在父類中實現,然后留個模板方法給子類去實現即可(模板方法的應用)。

    舉個栗子,這里還是拿Dubbo的負載均衡來說吧,如下圖,LoadBalance是各種負載均衡策略的超級接口,定義了 select 方法用來實現選擇哪臺機器;然后AbstractLoadBalance是一個抽象類,實現了LoadBalance接口,在覆蓋了 select 方法后,其又增加了 calculateWarmupWeight 和 getWeight 權重相關的兩個方法,因為這些方法都跟具體的負載均衡策略類有關,故在父類實現了。值得注意的是AbstractLoadBalance抽象類的 select 方法中里留了個給子類覆蓋的 doSelect 方法,具體的負載均衡策略將在doSelect中實現。

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

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

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

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

4 學源碼,談實踐,論堅持

最后,我們學習源碼不是為了學習而學習,最理想的效果我們要學以致用。比如把從源碼中學習到的設計模式,接口設計方法,面向對象原則和相關算法等等都可以應用到我們手頭的項目中,這才是我們學習源碼的最終目的,也是源碼學習的最理想的效果。可能這里有些小伙伴會說,我平時參與的項目都是業務類的項目,而不是開發基礎框架,開發中間件,CRUD比較多,可能學習基礎框架的源碼對我們用處很少。其實不是的,只要你有參與項目,學習源碼我們學習的是思想,我們就可以把源碼框架設計中的思想應用到我們的項目中。

最后的最后,我們來談談堅持,這是最難能可貴的。很多大道理我們都懂,比如要堅持運動,堅持學習,堅持...,可是就是沒能堅持下來,包括我自己,嘿嘿。堅持這東西太南了,不過還是應該給自己立個flag吧,把自己有用到的框架比如SpringBoot,Spring,Mybatis,Dubbo,SpringCloud等框架源碼都閱讀分析一遍,加油,小伙伴們共勉!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

元谋县| 开原市| 定州市| 津市市| 西贡区| 远安县| 文水县| 汉川市| 桃园县| 海淀区| 邯郸市| 河东区| 沙坪坝区| 扬州市| 波密县| 饶阳县| 茶陵县| 丹东市| 启东市| 普兰店市| 阜康市| 黎平县| 贡嘎县| 吕梁市| 汉阴县| 绥江县| 商都县| 济阳县| 象州县| 乐安县| 顺义区| 汕尾市| 涞源县| 读书| 宝丰县| 珲春市| 房山区| 汤原县| 久治县| 建水县| 通辽市|