無論是分析一個(gè)大型框架隅俘,還是局部功能绝编,都會(huì)用到這種分析方法风纠。
靜態(tài)分析是指不運(yùn)行代碼查看對(duì)象之間的調(diào)用關(guān)系和實(shí)現(xiàn)方法等內(nèi)容恬砂。這是學(xué)習(xí)優(yōu)秀框架和提升自身技術(shù)功底的好方法碑隆。
分析可以是多角度的:
自上而下:特別適合看某一個(gè)大型的框架技術(shù)拇惋。例如:我們要學(xué)習(xí)netty框架炼七,首先,我們了解這個(gè)是一個(gè)網(wǎng)絡(luò)通訊框架,主要目的是實(shí)現(xiàn)端與端之間的通訊蛮穿。其次庶骄,該框架的主體運(yùn)行邏輯有哪些?例如:netty采用boss和worker線程分別處理TCP事務(wù)的監(jiān)聽和后續(xù)連接后的處理践磅,這些協(xié)議棧的處理采用鏈?zhǔn)教幚淼サ螅瑢?duì)于接收數(shù)據(jù),上一個(gè)處理器處理TCP數(shù)據(jù)協(xié)議府适,下一個(gè)協(xié)議使用上一個(gè)協(xié)議的處理結(jié)果繼續(xù)處理羔飞;對(duì)于發(fā)送數(shù)據(jù),和接收處理順序正好相反檐春。再次逻淌,深入到具體的主要功能和模塊進(jìn)行研究,這樣的方式就是自上而下疟暖。
自下而上:當(dāng)對(duì)一個(gè)大型框架研究遇到瓶頸的時(shí)候卡儒,可以像開采隧道一樣從兩邊挖起,先從具體模塊入手俐巴,研究他的運(yùn)轉(zhuǎn)流程和邏輯骨望。例如:netty里面有ChannelPipeline對(duì)象,該對(duì)象主要實(shí)現(xiàn)了鏈?zhǔn)絽f(xié)議棧的相關(guān)處理欣舵。我們就按照個(gè)方向進(jìn)行研究擎鸠。
抽絲剝繭:當(dāng)遇到一個(gè)復(fù)雜的邏輯很繞的功能或者模塊的時(shí)候,我們需要耐心和細(xì)心的去看缘圈,這個(gè)就是具體問題具體分析了劣光。例如:netty執(zhí)行生命周期ServerBootstrap→group→channel→closeFuture→sync
。這個(gè)流程里面我們研究一下group
糟把,進(jìn)入group()
里面是parentGroup
和childGroup
的初始化操作赎线,childGroup
這個(gè)對(duì)象還是可選的,如果沒有初始化糊饱,默認(rèn)使用parentGroup
垂寥,那么parentGroup
保存在config
里面,config
里面持有了ServerBootstrap
對(duì)象另锋,當(dāng)調(diào)用config.group()
的時(shí)候滞项,實(shí)際就是調(diào)用ServerBootstrap
對(duì)象的group()
。這么說是不是有點(diǎn)復(fù)雜和難易理解夭坪。我們還可以采用更好的方法文判。首先,關(guān)注相關(guān)對(duì)象
ServerBootstrap室梅、AbstractBootstrap(它里面持有parentGroup對(duì)象)戏仓、ServerBootstrapConfig(config對(duì)象疚宇,被ServerBootstrap對(duì)象持有)、AbstractBootstrapConfig(持有ServerBootstrap對(duì)象)赏殃,而他們之間是子類父類關(guān)系敷待,和相互持有關(guān)系,當(dāng)調(diào)用config.group()的時(shí)候仁热,實(shí)際調(diào)用持有對(duì)象的方法榜揖,這種你中有我,我中有你的關(guān)系在程序?qū)崿F(xiàn)的技巧里面非常常見抗蠢,主要是為了方便查找和使用举哟。雖然沒有采用弱引用,可能使用另外的方法進(jìn)行了處理迅矛,不會(huì)產(chǎn)生內(nèi)存泄露妨猩。
順藤摸瓜:很多時(shí)候,我們不是想要理解一個(gè)功能如何實(shí)現(xiàn)秽褒,可能是需要快速的問題定位册赛,這時(shí)候,快捷高效的方法一般采用順藤摸瓜震嫉,順著問題發(fā)生的原因的這個(gè)主線森瘪,尋找可能出現(xiàn)問題的環(huán)節(jié),中間可能遇到重重的障礙票堵,有些是熟悉的(自己實(shí)現(xiàn)的)扼睬,有些不熟悉(三方或者其他同事實(shí)現(xiàn)的),不要過多的去看不相關(guān)的內(nèi)容悴势,找到問題的癥結(jié)所在窗宇,在想辦法解決。一般來說特纤,問題里面军俊,功能的可復(fù)現(xiàn)的問題比較好解決,性能的內(nèi)存泄露類的長時(shí)間運(yùn)行的捧存,偶發(fā)的沒有找到問題出現(xiàn)規(guī)律的不好解決粪躬。具體問題的難易程度也不一樣,需要按需選擇方法昔穴,順藤摸瓜是大方向镰官。
避重就輕:程序員的特點(diǎn)就是喜歡研究技術(shù),在當(dāng)下研究代碼的時(shí)候吗货,往往跑偏泳唠,本來想要了解一下A功能,結(jié)果看著看著就去研究B功能了宙搬,當(dāng)下要緊的是研究好A功能笨腥,所以拓哺,需要適時(shí)適度的提醒自己,不要跑偏脖母,如果非常感興趣士鸥,可以先記下來,后續(xù)有時(shí)間在研究镶奉。對(duì)于一掃而過就能明白的功能或者問題,也可以及時(shí)研究崭放。
DEMO:好的demo可以讓我們快速的了解原理和功能哨苛,差的demo讓我們誤入歧途,檢驗(yàn)demo的辦法就是閱讀源碼币砂,并且運(yùn)行建峭,并且根據(jù)已有認(rèn)知對(duì)當(dāng)前的使用方法和技巧作出合適評(píng)價(jià)。對(duì)于不好的demo我們應(yīng)該摒棄决摧,對(duì)于好的demo應(yīng)該有價(jià)值的提取和學(xué)習(xí)。
大DEMO:這里的DEMO是泛化的,例如java的jvm是C++的優(yōu)秀學(xué)習(xí)示例挠进,dart語言采用C++做引擎是學(xué)習(xí)C++的優(yōu)秀示例矾麻,redis采用C語言也是C語言的優(yōu)秀學(xué)習(xí)示例,javascript的react框架的響應(yīng)式編程原理是其它語言也應(yīng)該學(xué)習(xí)的優(yōu)秀示例波岛,等等茅坛。這些框架級(jí)別的DEMO我們應(yīng)該多多學(xué)習(xí)。說不定哪天我們也會(huì)用到全部或者部分的內(nèi)容则拷。
代碼片段:好的學(xué)習(xí)方式是學(xué)習(xí)之后總結(jié)贡蓖,而不是學(xué)會(huì)了就完事,不總結(jié)煌茬,后續(xù)時(shí)間長了斥铺,要學(xué)習(xí)又要重新開始,從找資料坛善,找方法晾蜘,所有的曾經(jīng)經(jīng)過的步驟都要再來一遍。所以眠屎,我推薦學(xué)會(huì)一個(gè)框架一個(gè)功能的時(shí)候做總結(jié)笙纤。總結(jié)學(xué)習(xí)資料的獲取组力、學(xué)習(xí)方法的技巧省容、學(xué)習(xí)結(jié)果的驗(yàn)證、自己總結(jié)的總比別人的更加深刻燎字,做一個(gè)demo示例驗(yàn)證所學(xué)技能是否真的正確腥椒。
當(dāng)然如果有有人指導(dǎo)學(xué)習(xí)速度更快阿宅,但是副作用就是提升能力并不明顯,換個(gè)框架笼蛛,速度還是恢復(fù)如初洒放。所以,要兩種方式相結(jié)合來學(xué)習(xí)滨砍。
2021-09-24 11:48:29