《我的設(shè)計(jì)模式》完結(jié)篇:如何閱讀代碼
前言
有經(jīng)驗(yàn)的開發(fā)者都清楚,我們大多數(shù)情況下都是基于別人的框架和系統(tǒng)來開發(fā)代碼。
比如開發(fā)一個應(yīng)用,是基于OS來開發(fā);開發(fā)一個游戲基于一個游戲引擎來開發(fā);進(jìn)入到公司里面以后開發(fā)一個業(yè)務(wù)邏輯也是基于公司的框架代碼來開發(fā)。
正因?yàn)槿绱耍喿x別人的代碼,就顯得非常重要。

1 學(xué)會閱讀代碼的好處有哪些?
用好別人的代碼,能節(jié)約成本,而閱讀代碼強(qiáng),就是用好的關(guān)鍵
我們把別人寫好的,成熟的代碼用到項(xiàng)目中能節(jié)約很多開發(fā)成本,縮短項(xiàng)目的周期,所以用好別人的代碼變的很重要。
你能快速地把第三方開源代碼用到項(xiàng)目當(dāng)中,把一個模塊移植過來,這些都能節(jié)約大量成本。
能做到這些,就需要有閱讀代碼的能力和功底。
閱讀代碼能力強(qiáng),就能快速從別人的代碼里找到使用的方法,并把內(nèi)在的邏輯串聯(lián)起來。
別人問我為什么那么快就會用一個框架和庫,我告訴他就是源于閱讀代碼,閱讀代碼的接口組織布局等。

2 閱讀別人的代碼,能學(xué)習(xí)到很多設(shè)計(jì)技巧和模式
我們都喜歡看名人故事,聽名人訪談,想通過名人的一些故事來學(xué)習(xí)一些東西。
對于程序員而言,學(xué)習(xí)大師的開發(fā)技巧,不是看大師的Blog和故事,而是閱讀大師寫的代碼。
比如Linus是如何設(shè)計(jì)內(nèi)核把成千上萬的設(shè)備驅(qū)動管理起來的等等,這些思想我們都可以學(xué)習(xí)。
在閱讀大師寫的代碼的同時,自己也能領(lǐng)會到很多代碼智慧與設(shè)計(jì)哲學(xué)。

3 閱讀別人的代碼,更容易讓我們掌握相關(guān)的知識
當(dāng)我們有了某個領(lǐng)域或模塊的一些基礎(chǔ)知識,就需要更好結(jié)合實(shí)踐來把知識理解透徹。
比如我們學(xué)習(xí)多媒體的時候,IDCT反離散余弦變換等,結(jié)合ffmepg一遍視頻編碼解碼流程,一遍結(jié)合ffmeg來閱讀與學(xué)習(xí),能加深對知識點(diǎn)的理解與掌握;比如我們學(xué)習(xí)設(shè)計(jì)線程池的知識,結(jié)合線程池的代碼來學(xué),更容易讓我們把問題分析的更透徹。

4 閱讀別人的代碼能讓我們積累很多代碼工具模塊
閱讀不同代碼時,我們可以從代碼框架里面獲取寫的好的代碼模塊用到我們的項(xiàng)目中,比如紅黑樹。我一般就使用linux內(nèi)核的紅黑樹,鏈表這些經(jīng)典高效的數(shù)據(jù)結(jié)構(gòu)都來自于一些經(jīng)典的代碼庫。
每每發(fā)現(xiàn)好的代碼的時候,我都會把它們記錄起來,以后可以用到自己的項(xiàng)目框架體系中。
如何閱讀代碼
要閱讀一個龐大的代碼或代碼庫,弄懂里面的內(nèi)部邏輯,并很好的掌握他們用到項(xiàng)目中并不是一件簡單的事情,那么如何搞懂搞透一個代碼庫呢?
代碼相關(guān)的編程語言一定要過關(guān),能清楚的在腦袋里面執(zhí)行代碼
編程語言的核心機(jī)制一定要熟悉,這個是閱讀別人代碼的第一個關(guān)鍵的點(diǎn)。
如果很多語法在你的腦子里面都不熟悉,看不懂,那么能讀懂別人的代碼幾乎是不可能的。
閱讀代碼的時候,每行代碼跑出一個什么樣的結(jié)果,要在腦子里面做到心中有數(shù)。

閱讀代碼要善于處理整體與局部的關(guān)系,先建立全局觀
閱讀代碼時,首先基于函數(shù)、模塊等先把整個邏輯捋清楚,再去看具體的實(shí)現(xiàn)細(xì)節(jié)。
邏輯流程最好是通過函數(shù)名字,模塊名字等來判斷,先把整體的流程搞明白再深入進(jìn)去代碼細(xì)節(jié),不要一開始就深入細(xì)節(jié),這樣你沒有一個全局觀念。
閱讀代碼時要學(xué)會用腦圖記錄起來整個的流程,一邊閱讀一邊把邏輯捋清楚。捋清完邏輯后,就對哪些環(huán)節(jié),哪些入口就有了比較清晰的認(rèn)識,然后結(jié)合數(shù)據(jù)和打印,把整個流程驗(yàn)證一遍。

閱讀代碼一定要先找好入口,找出閱讀的線索
做任何事情要從一個入口開始,入口找的好,后續(xù)就會很順利。
比如我們代碼從main開始跑起,那么你從main函數(shù)開始,就能把整個的邏輯看清楚,所以找到一個合適的入口是非常重要的。
有時候有些代碼不像從main函數(shù)開始那么簡單,可能有多個接口和入口,那么我們就可以把它們作為線索來進(jìn)行分析。把整個代碼框架里面的代碼分成幾條代表性的線索,每次帶著這些線索去閱讀,把內(nèi)部的結(jié)構(gòu)和流程搞明白。

閱讀代碼要學(xué)會搜索,從搜索的結(jié)果中找到邏輯
比如我們看到一個函數(shù)or類,,我們想要看看整個都怎么使用,通過這個函數(shù),把整個流程找出來。那么我們就要從定義在哪里,調(diào)用在哪里都過一遍。
你可以采用搜索的辦法,把項(xiàng)目里面所有的代碼都搜索一遍。
搜索出來結(jié)果以后,就知道在哪些地方調(diào)用了,然后一個一個分析,一個一個看,找出邏輯與線索。
有時候我們的變量被賦值給其他的人,這個時候要搜索其他的,所以一個好的代碼搜索閱讀工具是非常必要的,我這邊用的比較多的是sublime 和source Insight, 一般大項(xiàng)目我都用source Insight。
開始閱讀代碼之前一定要具備相關(guān)的基礎(chǔ)知識
開始閱讀代碼之前還是要準(zhǔn)備好自己的知識認(rèn)知,如果自己什么相關(guān)知識都沒有就去閱讀代碼,搞不出來是正常的。
還是要先積累相關(guān)的知識、基本概念再去閱讀別人的源碼。
具備了相關(guān)的知識以后,腦袋里面基本就知道這個事情大致是怎么完成的,你再去閱讀代碼,你就能很輕松的讀懂了。
比如要你讀懂一個地圖編輯器的工具代碼,如果有做地圖編輯器的步驟和思路,就可以帶著思路去找代碼。
比如地圖數(shù)據(jù)如何編輯生成?生成后的格式是怎么樣的?格式生成后數(shù)據(jù)如何讀取的?讀取到哪里?尋路的時候采用什么算法?尋路的路徑出來后,怎么控制在路徑上行走的?
帶著這些問題去閱讀地圖編輯器的代碼,就能掌握好整個代碼框架庫。雖然不是你寫的,但還是比較清楚的。
總之閱讀好別人的代碼取決你的基礎(chǔ)、知識體系、以及耐心,并非一下就能提升,需要在代碼閱讀中不斷總結(jié),閱讀更多代碼以及積累更多的行業(yè)知。
希望大家堅(jiān)持下來,因?yàn)槟菦Q定了你能否走到系統(tǒng)分析師架構(gòu)師,這個級別閱讀代碼是一個很重要的分水嶺。

不知不覺,《我的設(shè)計(jì)之道》迎來了完結(jié)的時刻。
感謝所有朋友給予的關(guān)注和支持。
結(jié)束并不意味著消散,我認(rèn)為恰恰是一種新生。
在未來的日子里,我將依然會在此分享各種有關(guān)游戲開發(fā)技術(shù)方面的觀點(diǎn)文章,希望新老朋友持續(xù)留意收看。
今天的分享就到這里,下期再見。