本篇是專題《如何高效閱讀源碼》的第一篇,來聊一聊閱讀源碼的錯誤姿勢!以及本專題的內容及章節。
似曾相識的場景
你聽說Spring已經有一段時間了,它已經是Java企業級開發事實上的標准。你覺得自己應該讀一讀Spring的源碼,深入理解一下Spring的實現,這能使自己更好的使用Spring,同時也能提高自己項目設計和編碼能力。
於是你泡了一杯咖啡,從github上下載最新的Spring源碼,導入到IDE中,寫了一個demo,然后就開始debug。你一邊StepOver,一邊嘴里嘟囔着「A類的a方法調用了B類的b方法,然后又調用了C類的c方法,然后又執行到了這里」。嗯,很清晰嘛,喝口咖啡。咦,剛才看到哪里了?!沒辦法,只好重新debug!
「A類的a方法調用了B類的b方法,然后又調用了C類的c方法。。。。。。這里是個接口,要執行的是子類,子類在哪里呢」?你在IDEA里按下ALT+F7,發現有幾十個實現,到底是哪個實現呢?你按下F7 StepIn想確認下。我去,一堆AOP的包裝方法,按了半天,就是進不到最終的類!
最后,好不容易找到了執行的類。咦,剛才看的是什么來着?!唉,算了,看不下去了,先來把王者吧!然后,就沒有然后了!!!
為什么你沒辦法把源碼讀下去呢?因為你的方法不對:
-
不了解項目就讀源碼
-
一上來就讀最新版本的源碼
-
直接讀完整的源碼
-
通過debug的方式閱讀源碼
我們一個個的來說!
不了解項目就讀源碼
首先,你了解項目了嗎?你有實際使用過項目嗎?你對項目的執行流程了解多少?如果你還沒有熟練的使用項目,那你就不要急着去讀項目源碼。
讀源碼需要在熟練使用的基礎上進行。為什么呢?
你想想你讀源碼的目的是什么?你是希望能了解這個項目是如何設計實現的,代碼如何組織的,有哪些技巧或思路可以學習。但是你連項目都不了解,你怎么去理解這個項目是怎么設計的?
就像上面,你只知道Spring是目前企業級開發事實上的標准,但是你不知道原因,也不知道它解決了什么問題,以及解決問題的方式。那你如何能理解代碼為什么要這么寫?!假如你最終千辛萬苦的終於將Spring源碼讀完了,你也只知道Spring構建了Bean塞到了容器中,然后使用的時候獲取這個Bean,而不清楚深層次的用意。
一上來就讀最新版本的源碼
很多開源項目經歷了很多年,代碼量成指數級增長。版本越新,代碼量也就越多。以Spring來說,現在Spring已經到了5.*版本,從git上下載下來的spring-framework的源碼大小有200多兆,你能想象這得有多少代碼嗎?一上來就讀這種龐然大物,心里不瘮得慌才怪!
所以從相對老一點的版本入手,代碼量上會少很多,閱讀起來也會容易很多。但是版本也不能太老,太老的版本可能使用的技術已經過時了,讀了也沒有什么太大的用處。
直接看完整代碼
雖然老版本的代碼量相對少一點,但是一個相對較大一點的項目的代碼量還是比較多的。比如Spring3的代碼量也已經很多了。
所以,無論是哪個版本的源碼,你都不應該看完整的代碼。那該怎么去讀源碼呢?這就是本專題要解決的問題之一,在后面的章節中會進行詳細的講解。
通過debug的方式閱讀源碼
很多源碼分析的博客都是通過debug的方式來講述源碼。也有不少教讀源碼的文章,也是建議通過debug的方式來進行閱讀。但是,實際上通過debug的方式來閱讀源碼不是一個好方法,至少一上來就進行debug,是個很不好的習慣。
大部分人應該都知道,人的記憶可以分為「短時記憶」和「長時記憶」!對於「短時記憶」來說,一般正常人一次只能記憶7(加減2)個左右的無規律信息。對於通過debug進行源碼閱讀的方式,每一次的方法跟進,實際就是一次信息記憶,所以最多7次左右的StepOver,你就沒法記住所有的調用關系了。所以你就會出現看了后面忘了前面的情況。
同時像Spring這種使用了AOP的項目,由於在運行時有多層的代理,所以debug的層級更多,也就更加的難以閱讀了。
再加上眾多的子類實現,很容易就迷失在了一堆沒用的代碼中。
專題內容
既然已經知道了錯誤的閱讀源碼的方式,那正確的閱讀源碼的方式是什么呢?這就是本專題的內容!
本專題包括四部分內容:
-
錯誤的閱讀源碼的方式
-
提高閱讀效率的方法
-
高效閱讀源碼的步驟
-
以及一個完整的演示實例
看完本專題,你將學會:
-
一種高效閱讀源碼的方法
-
理解閱讀源碼的目的是什么
-
理解設計模式的用途
-
理解如何從架構層面看源碼
預備知識
為了更好的理解本專題,你最好需要:
-
至少掌握一門編程語言,本專題使用Java語言講解,故掌握Java語言最佳
-
了解UML,本專題會繪制一些簡單的UML圖
-
了解常用設計原則
-
了解常用設計模式,了解設計原則和設計模式能更快的理解項目
-
熟練使用一款IDE,本專題使用Intellij IDEA演示,故熟悉Intellij IDEA最佳
-
熟練使用紙和筆或熟悉一款繪圖軟件,本專題使用draw.io進行繪圖
-
熟練使用你需要閱讀源碼的項目,本專題使用JUnit進行講解,故熟練使用JUnit最佳
適用人群
-
想快速了解一個項目的源碼結構的開發人員
-
想閱讀源碼,但是一直找不到方法,讀不下去的開發人員