源碼怎麼看懂
㈠ 如何高效閱讀源代碼
下面是之前寫的一篇文章:《如何快速閱讀源碼》
本文探討在需要了解一個開源項目時,如何快速的理清開源項目的代碼邏輯!
以下是個人認為行之有效的方法:
本文以Mybatis為例來進行演示!
先「跑起來」程序界有個老傳統,學習新技術時都是從「Hello World」開始的!無論是學習新語言時,列印「Hello World」;還是學習新框架時編寫個demo!那為什麼這里的「跑起來」要打個引號呢?
實際上,當你想要閱讀一個開源項目的源碼時,絕大部分情況下,你已經能夠使用這個開源項目了!所以這里的「跑起來」就不是寫個「Hello World」,也不是能跑起來的程序了!而是能__在你的腦子里「跑起來」__!什麼意思?
Mybatis你會用了吧?那麼請問Mybatis是如何執行的呢?仔細想想,你能否用完整的語句把它描述出來?
這里是Mybatis的官方入門文章!你是如何看這篇文章的?讀一遍就行了嗎?還是跟著文章跑一遍就夠了嗎?從這篇文章里你能獲得多少信息?
我們來理一下:
回答出了上面這些問題!你也就基本能在腦子里把Mybatis「跑起來」了!之後,你才能正真的開始閱讀源碼!
當你能把一個開源項目「跑起來」後,實際上你就有了對開源項目最初步的了解了!就像「 書的索引 」一樣!基於這個索引,我們一步步的進行拆解,來細化出下一層的結構和流程,期間可能需要深入技術細節,考量實現,考慮是否有更好的實現方案!也就是說後面的三步並不是線性的,而是__不斷交替執行__的一個過程!最終就形成一個完整的源碼執行流程!
自頂向下拆解繼續通過Mybatis來演示(限於篇幅,我只演示一個大概流程)!我們現在已經有了一個大概的流程了:
雖說每個點都可以往下細化,但是也分個輕重緩急!
很明顯,sqlSession去執行 sql才是Mybatis的核心!我們先從這個點入手!
首先,你當然得先下載Mybatis的源碼了(請自行下載)!
我們直接去看SqlSession!它是個介面,裡面有一堆執行sql的方法!
這里只列出了一部分方法:
SqlSession就是通過這些方法來執行sql的!我們直接看我們常用的,也是Mybatis推薦的用法,就是基於Mapper的執行!也就是說「SqlSession通過Mapper來執行具體的sql」!上面的流程也就細化成了:
那SqlSession是如何獲取Mapper的呢?Mapper又是如何執行sql的呢?
深入細節我們來看SqlSession的實現!SqlSession有兩個實現類SqlSessionManager和DefaultSqlSession!通過IDE的引用功能可以查看兩個類的使用情況。你會發現SqlSessionManager實際並沒有使用!而DefaultSqlSession是通過DefaultSqlSessionFactory構建的!所以我們來看DefaultSqlSession是如何構建Mapper的!
它直接委託給了Configuration的getMapper方法!
Configuration又委託給了MapperRegistry類的getMapper方法!
在MapperRegistry類的getMapper中:
在這里knowMappers是什麼?MapperProxyFactory又是什麼?mapperProxyFactory.newInstance(sqlSession)具體做了什麼?
其實很簡單,knowMappers是個Map,裡麵包含了class與對應的MapperProxyFactory的對應關系!MapperProxyFactory通過newInstance來構建對應的Mapper(實際上是Mapper的代理)!
快接近真相了,看mapperProxyFactory.newInstance(sqlSession)里的代碼:
這里幹了什麼?
最終實際還是委託給了sqlSession去執行具體的sql!後面具體怎麼實現的就自行查看吧!
延伸改進現在我們的流程大概是這樣的一個過程:
現在我們大概知道了:
那麼,
這個問題列表可以很長,可以按個人需要去思考並嘗試回答!可能最終這些問題已經和開源項目本身沒有什麼關系了!但是你思考後的收獲要比看源碼本身要多得多!
再循環一輪結束後,可以再次進行:
不斷的拆解->深入->改進,最終你能__通過一個開源項目,學習到遠比開源項目本身多得多的知識__!
最重要的是,你的流程是完整的。無論是最初的大致流程:
還是到最終深入的細枝末節,都是個完整的流程!
這樣的好處是,你的時間能自由控制:
而不像debug那樣的方式,需要一下子花費很長的時間去一步步的理流程,費時費力、收效很小,而且如果中斷了就很難繼續了!
總結本文通過梳理Mybatis源碼的一個簡單流程,來講述一個個人認為比較好的閱讀源碼的方式,並闡述此方法與傳統debug方式相比的優勢。
閱讀源碼是每個優秀開發工程師的必經之路,那麼這篇文章就來講解下為什麼要閱讀源碼以及如何閱讀源碼。
首先來說下為什麼要讀源碼,有學習源碼的必要嗎?
為什麼要閱讀源碼?
關於為什麼閱讀和學習源碼,我個人認為可能有以下幾點:
(一)吊打面試官,應對面試
為了找到更好的工作,應對面試,因為在面試中肯定會問到源碼級別的問題,比如:為什麼 HashMap 是線程不安全的?
如果你沒有閱讀過源碼,面試官可能會對回答的結果不滿意,進而導致面試結果不太理想,但如果你對源碼有所研究,並能夠很好地問答面試官的問題,這可能就是你的加分點,可以形成自己獨特的競爭力,吊打面試官,升職加薪不是夢。
(二)解決問題(bug)
在開發過程中,我們或多或少會遇到 bug,比如:在 foreach 循環里進行元素的 remove/add 操作,為啥有可能會報 異常?
我們可以先在 Google、Stack Overflow 以及對應項目的 Issues 里看有沒有類似問題以及解決辦法,如果沒有的話,我們只能通過閱讀源碼的方式去解決了。如果我們對相關源碼有所涉獵,就可以快速定位到問題所在。
(三)提升編程能力
和閱讀一本好書一樣,閱讀源碼就是和編程大牛面對面交流的機會,在許多優秀的開源項目中,它們的編碼規范和架構設計都是很棒的,另外在設計上也使用了大量的設計模式,通過閱讀和學習源碼,能夠快速提升我們的編碼水平,以及對設計模式有更深的理解。
同時,在我們閱讀完一個源碼後,可以觸類旁通,能夠快速地對其他框架的源碼進行閱讀和學習,減少時間成本。
除了上述提到的原因之外,可能還有許多,在這里就不一一贅述了,那麼在確定了要閱讀源碼之後,就讓我們看下如何閱讀源碼吧!
如何閱讀源碼?
如何閱讀源碼取決於你為什麼要讀源碼,比如:
下面大概說下閱讀源碼的幾點建議:
在閱讀之前,可以先從開源項目的官網上看它的架構設計和功能文檔,了解這個項目的 整體架構、模塊組成以及各個模塊之間的聯系 。
如果沒有對應的項目文檔,可以根據代碼的模塊進行梳理,以形成對項目的初步了解,或者 查看已有的源碼解析文章或者書籍 ,在閱讀源碼之前,了解項目的架構和思路會使閱讀源碼事半功倍。
在了解一個類的時候,可以使用 ctrl+F12 來查看類中的成員變數和方法。
可以通過 IDEA 的 Diagrams 功能去了解一個類的繼承關系。
多打 斷點調試 ,斷點追蹤源碼是很好的閱讀源碼的方式,可以先通過 debug 了解下調用邏輯,都和哪些類有關聯,有大致了解後再通過 debug 了解整體代碼的功能實現,各個類都起到了什麼作用,有沒有涉及到設計模式等。
另外,優秀的開源項目中肯定會有許多地方應用到了 設計模式 ,建議在閱讀源碼之前,需要對常用的設計模式有大致的了解,不然閱讀源碼的效率會大大降低。
如果遇到讀不懂某部分源碼的時候,可以先跳過,之後再回來看,如果屬於搞不懂這部分就茶不思飯不想的人,可以在網上找是否有該部分源碼的解析或者文檔,也可以自己通過 源碼注釋和測試用例 去閱讀學習。
一般優秀的開源項目都會有 單元測試 ,可以通過對應類的單元測試去了解方法的含義和用法,加深對源碼邏輯的理解。
在閱讀源碼的時候,可以在代碼上加上 注釋和總結 ,同時還可以畫出 時序圖和類圖 ,這樣對閱讀源碼有很大的幫助,可以很清楚地知道類之間的調用關系和依賴關系,也方便以後回顧,重新閱讀。
在這里推薦大家一個 IDEA 插件 SequenceDiagram,可以根據源碼生成調用時序圖,便於閱讀源碼。
剛開始閱讀源碼,不建議直接看框架源碼,可以先從 jdk 源碼看起:
jdk 源碼也是非常龐大的,可以分模塊來閱讀,下面是建議的閱讀順序:
其他包下的代碼也可以做下了解,JDK源碼閱讀筆記:https://github.com/wupeixuan/JDKSourceCode1.8
再有了一定的源碼閱讀經驗後,可以再去學習 Spring、Spring Boot、Dubbo、Spring Cloud 等框架的源碼。
總結主要介紹了為什麼讀源碼以及如何讀源碼,供大家參考,每個人都有適合自己的閱讀源碼的方式,希望可以在學習中去摸索出一套屬於自己的方式。
閱讀源碼不是一蹴而就的,這是持久戰,只要你能夠堅持下來,肯定受益匪淺。閱讀源碼的過程比較枯燥,可以在社群里一起討論學習,這樣可能效率更高些。
沒看過源代碼,都不好意思出來說了,最近剛好在看一些,來說一個。
先看使用 https://element.eleme.cn/#/zh-CN/component/installation
先看一下這個庫是做什麼用的,然後提供了哪些功能。
看GitHub https://github.com/elemefe
一般會看下項目最新的情況,然後沒有關閉的issue,看下wiki,大家在討論什麼。
再看代碼
clone 一份到本地,然後先看下目錄結構,然後根據文檔看幾個簡單的組件的時候,一邊看掘金上的分析,一邊自己看下實現。
e le
餓了么這個框架代碼結構還是很清楚的,基本上每個組件都是分開的,所以你只要看其他的一個文件夾就行。然後一些工具的都在src文件夾。
要學會看issue,一般開源的項目都有人會來提建議,有些是bug,有些是功能,你可以看看自己是否有能力去解決,如果可以的話,你可以去fork代碼,然後自己修改,再提pr。
我最近恰好找摸索出一個梳理遺留系統架構的技巧:自底向上 找到一個典型的切面 沿著調用和回調的路徑 在代碼中添加結構化注釋(比如eclipse中加//TAG 流程A1.1 甲->>乙),這樣便得到了一個code地圖,並且在tasks視圖中看起來很直觀(看起來跟書的目錄一樣)可快速跳轉。將目錄到有道雲筆記的markdown序列圖中 就自動生成了一個序列圖。
我覺得這基本上就是可縮放的可視化架構地圖了,對維護一個比較亂和龐大的遺留系統非常有幫助,定位代碼 修改維護都方便多了。
1、需要過硬的基礎知識,這個前提。不然基本語法、常用的模式都不曉得怎麼讀。
2、多參考 歷史 版本和更新變化,好的源碼都是反復迭代出來的精華,開始就讀精華是很不明智的,所以看看版本更新說明,版本的 歷史 演變。就想人一樣是怎樣進化過來的。
3、參考別人閱讀注釋,想必在你讀源碼之前也有人讀過了源碼,並且總結,注釋。和分享原理,可供你參考,畢竟每個人讀一篇文章,理解的東西是有差異化的。
4、直接買書,有些作品直接出書就是源碼精解
5、找個大神給你慢慢分析,這個最快。娓娓道來,直接面授比啥都強。缺點是,你容易跟著他的思維走下去。
我覺得閱讀代碼就不應該高效,而應該像看小說一樣,看的過程就像是在和作者交流,有趣才是看代碼的動力。
畫圖,看數據走向,邏輯走向
先弄清楚這些代碼實現了哪些功能,然後從主線開始往下看,好的代碼光看變數和介面名稱就能明白是什麼意思?扒出源碼實現的整體框架邏輯,然後再對自己感興趣的模塊進行剖析,還是從整體把握,細節深入,慢慢地整個框架就被豐滿了。
接下來是思考為什麼要如此設計,這樣設計的好處是什麼?如果是你來做應該怎麼設計,把你覺得源碼缺點的地方進行仔細研究,了解裡面是否包含自己不清楚的細節,避免遺漏。
接下來就是根據代碼改造或者是調試錯誤,對於源碼中遇到的不理解的地方一定要弄明白,有的確實是畫蛇添足,有的有獨特的作用。
多多學習,對每一種主流框架銘記於心,對主流設計模式了如指掌,萬變不離其宗,源碼看多了,跟看一個電視機遙控器的操作說明一樣。
1、一邊閱讀代碼一邊寫注釋。這是我用過的最好的方法,對代碼理解得更深入,看一些重要代碼或者特別難懂的代碼時挺有用。更何況,注釋也是一種文檔嘛。
2、一邊閱讀代碼一邊繪制UML。這個方法適用於類之間的關系較復雜和調用層次較深的情況,我一般都是先繪制順序圖,然後為順序圖中的類繪制關系圖。
3、通過Debug來跟蹤程序的主要執行過程,這樣就可以分清主次了,閱讀的時候更有針對性。
4、類的快速閱讀。先弄清楚它在繼承鏈中的位置,看看它的內部狀態,也就是成員變數,一般來說,類的對外介面都是對成員變數的訪問、加工、代理等,然後看看它的對外介面,也就是公有成員函數,識別核心的一個或多個函數,這時候你應該可以大概了解這個類的職責或作用了。可能這個類是某個設計模式中的一個組成部分,所以,設計模式的掌握對代碼的快速閱讀也是很有幫助的。
5、帶著問題去閱讀。比如想了解android中的消息機制,那麼看看Looper、Handler、MessegeQueue這幾個類就可以了,其他的不要去看,要不然就跑題了。
下面列幾個閱讀源碼時所處的情景,在特定場景下用哪些方法: 不太熟悉業務邏輯,還不是很清楚它是幹啥的,可以用3、5。 代碼量很大,有幾十萬行,甚至百萬行,可以用2、3、5。 你無法看見程序的運行過程,比如沒有用戶界面,也有可能是無法運行的,可以用3、5。 設計復雜,用了大量的設計模式,調用鏈很深,可以用1、2、3、4、5。 時間有限,沒有那麼多時間讓你看源碼,可以用3、5。
畫出邏輯流程圖,先了解整體流程,再詳解具體函數
㈡ 如何快速讀懂項目源碼javaWeb
一:學會如何讀一個JavaWeb項目源代碼 步驟:表結構->web.xml->mvc->db->spring
ioc->log-> 代碼
1、先了解項目資料庫的表結構,這個方面是最容易忘記 的,有時候我們只顧著看每一個方法是怎麼進行的,卻沒
有去了解資料庫之間的主外鍵關聯。其實如果先了解數據 庫表結構,再去看一個方法的實現會更加容易。
2、然後需要過一遍web.xml,知道項目中用到了什麼攔
截器,監聽器,過濾器,擁有哪些配置文件。如果是攔截 器,一般負責過濾請求,進行AOP 等;如果是監 可能是定時任務,初始化任務;配置文件有如使用了 spring
後的讀取mvc 相關,db 相關,service 相關,aop 相關的文件。
3、查看攔截器,監聽器代碼,知道攔截了什麼請求,這
個類完成了怎樣的工作。有的人就是因為缺少了這一步, 自己寫了一個action,配置文件也沒有寫錯,但是卻怎麼
調試也無法進入這個action,直到別人告訴他,請求被攔
4、接下來,看配置文件,首先一定是mvc相關的,如 springmvc
中,要請求哪些請求是靜態資源,使用了哪些 view 策略,controller 註解放在哪個包下等。 然後是db 相關配置文件,看使用了什麼資料庫,使用了
什麼orm框架,是否開啟了二級緩存,使用哪種產品作 為二級緩存,事務管理的處理,需要掃描的實體類放在什 么位置。最後是spring 核心的ioc
功能相關的配置文件, 知道介面與具體類的注入大致是怎樣的。當然還有一些如 apectj 置文件,也是在這個步驟中完成
5、log
相關文件,日誌的各個級別是如何處理的,在哪些 地方使用了log 記錄日誌
6、從上面幾點後知道了整個開源項目的整體框架,閱讀 每個方法就不再那麼難了。
7、當然如果有項目配套的開發文檔也是要閱讀的。
㈢ 如何看c語言標准庫函數的源代碼
1、首先標准只是規定了這些函數的介面和具體的運行效率的要求,這些函數具體是怎麼寫得要看各個編譯器的實現和平台。
2、例如使用的編譯器是visual studio,微軟提供了一部分C運行時(CRT)的源碼,裡面會有memcpy,strcpy之類的函數的實現,在visual studio 2005下的路徑是C:Program FilesMicrosoft Visual Studio 8VCcrtsrc。
㈣ 如何正確地查看源代碼
一。先把源代碼安裝起來編譯起來,結合它的文檔和手冊,熟悉其功能和它的應用方式。如果遇到的是英文文檔,那麼首先恭喜你,如果硬著頭皮看下來,不僅能在國內開此系統或框架的先河,而且能讓你閱讀英文的水平大幅提升。
二。瀏覽源代碼的目錄結構,了解各個目錄的功能。從整體上觀察這個工程是有哪些模塊組成的,最好能畫一畫圖。
三。經過以上兩步後你對這份源代碼有了一個初步的了解了,現在開始分析它的源碼吧。這一步我們開始分析源代碼框架。例如入口方式是單入口還是多入口,頁面之間的調用規則,能根據規則找出某個功能用到的頁面。
四。熟悉源代碼的代碼寫作風格,例如縮進方式,排版格式,變數命名,函數命名等。
五。熟悉一下源代碼用到的資料庫和表,可以參考它的技術支持文檔。
六。經過以上幾步相信已經對源代碼有了更深刻的了解,不過這種了解還只是表面的,下來我們從7個方面具體的去分析它吧:
1.入口構造以及頁面調用方式的具體實現,如果閱讀時看到工具類和工具函數,盡量去熟悉一下。這一步的分析可以學習到源代碼的系統架構方式。
2.分析源代碼用到的工具類和工具函數,這樣可以學到很多程序編寫技巧。可以提升自己編程功力。
3.結合一些安全規則,研究這個源代碼是怎樣實現安全方面的設計的。這樣可以提高自己在安全方面的意識和功力。
4.如果有模板引擎的話,研究一下源代碼的模板引擎。大致從實現方式,效率,易用性等幾個方面去考慮。
5.研究系統的各個功能模塊,這樣既能學習編程技巧還能打開自己的編程思路,下次遇到類似的東東就心裡有譜了。
6.研究系統所用到設計模式,一樣的功能實現,用到的設計模式可能相差很多,對比我們之前所作的東東分析設計模式,是提升我們駕馭代碼的不二法門。
7.研究源代碼對訪問壓力,執行效率,系統效率,資料庫查詢的優化。
七。做筆記,把這個開源代碼實現的功能,實現方式、設計框架、模塊組織、以及代碼技巧等記錄下來。邊記錄邊總結整理,對學習的東西更容易消化吸收。
八。實踐是檢驗真理的唯一標准,修改一些比較簡單地功能,或者寫一些簡單的sample,並且調試出來,這樣才能做到更加理解代碼。同時框架性的源代碼里一般都有自帶的實例,修改使用這些實例,可以快速了解框架的使用。
㈤ 初學者怎樣看懂代碼
初學者要看懂代碼首先從要需求分析了解,然後是系統分析,最後是塊的理解。看懂代碼其實不難,大抵不過是選擇,分支,循環。語法如果看不懂,那就需要補補基礎,先弄清楚這段代碼要做什麼,有說明最好,可以幫助理解,沒有說明就試著過一下代碼流程。
(5)源碼怎麼看懂擴展閱讀:
最重要的是學會寫程序
C語言也好,python也好,得學會思考用程序實現,舉個例子,想制定計劃表,安排時間,那這個問題就可以寫個程序來實現;你想做筆記、管理自己的文件,這也是一個程序。
從簡單的、直接的幾行十幾行程序開始,比如計算器;到復雜的小工具,比如大數計算器,這個過程中你逐漸明白數組、指針、內存布局、函數,了解遞歸、棧、鏈表,然後學基本的數據結構,之後再寫程序,你需要考慮代碼的優雅、簡單、時間空間效率高,使用什麼樣的方式來實現最好,最後學會了復用,學會了調用系統API,學會了想什麼就能用代碼實現什麼或者知道它不能被實現,就學會了編程。
㈥ 怎麼看一個網站的源代碼,網頁源代碼怎麼看
怎麼看一個網站的源代碼?很簡單,現在的瀏覽器基本上都支持枝念查猛彎困看鬧族源代碼的,下面我們來看一下。
- 01
先打開要查看源代碼的網站,比如搜狗搜索。
- 02
右鍵點擊頁面空白地方,然後點擊菜單上的『顯示網頁源代碼』。
- 03
點擊後,就會在新標簽上打開顯示網頁的代碼了。
- 04
如果你只要查看某個部分的源代碼,我們可以先在網頁上該部分控制項上右鍵點擊,然後點擊『檢查』。
- 05
點擊後,就會在瀏覽器下方顯示出該部分所在的代碼了。