在三年前我就讀了《重構(gòu)改善既有代碼的設(shè)計(jì)》鼻疮,里面寫了很多有關(guān)代碼重構(gòu)的技巧琳水,知易行難!我整理了一下重構(gòu)給我的感悟吊档。
NO.1是什么導(dǎo)致的重構(gòu)篙议?
為業(yè)務(wù)的改變而調(diào)整
這是一個(gè)最合理的原因,我們無法預(yù)料到業(yè)務(wù)的發(fā)展怠硼,我們當(dāng)下制定的業(yè)務(wù)職責(zé)和邊界鬼贱,對于一個(gè)快速發(fā)展的項(xiàng)目,能應(yīng)對半年的情況香璃,已經(jīng)是一件相當(dāng)不容易的事情这难。正如我們業(yè)務(wù)發(fā)展開始的時(shí)候,能承受起幾千個(gè)用戶葡秒。而當(dāng)有十幾萬用戶的時(shí)候姻乓,系統(tǒng)承受的壓力是遠(yuǎn)遠(yuǎn)的不一樣的。
為自己or別人的錯(cuò)誤埋單眯牧!
代碼是由程序員創(chuàng)造糖权,我們?nèi)绻缓煤媒逃a,一旦讓它成為令人抓狂的“熊孩子”炸站,最終的惡果還是我們自己承受星澳。我也會吐槽自己寫過的代碼,畢竟編程技巧是一項(xiàng)技藝旱易,需要日復(fù)一日的不斷磨練禁偎,需要承受自己給自己帶來的坑腿堤,才會學(xué)會成長。作為一名及格的程序員不能把重構(gòu)時(shí)刻掛在嘴邊如暖,正如教育孩子更多是需要言傳身教笆檀,以身作則。所以我們要將重構(gòu)徹底融入到每一句代碼中盒至,我們既是在不斷寫新的業(yè)務(wù)酗洒,也是不斷在重構(gòu)我們的代碼。
“無奈”的架構(gòu)師
很多公司招了一個(gè)牛逼的架構(gòu)師枷遂,怎么可以在短時(shí)間內(nèi)向公司證明自己的能力樱衷?重構(gòu)無疑是一條快捷的出路。
因?yàn)楣局暗募軜?gòu)已經(jīng)不能適應(yīng)公司發(fā)展酒唉,導(dǎo)致了公司業(yè)務(wù)發(fā)展不順矩桂。聽說過有些創(chuàng)業(yè)公司,每招來一個(gè)架構(gòu)師痪伦,就把之前的代碼進(jìn)行重構(gòu)一次的事例侄榴。但是這種重構(gòu),更多的是重寫网沾,而不是重構(gòu)癞蚕。但這種重寫,往往由于架構(gòu)師對業(yè)務(wù)缺乏深度的認(rèn)識和充裕的時(shí)間辉哥,帶來了斷崖般的崩塌涣达,因?yàn)樵谥貙懙倪^程中,bug層出不窮证薇,導(dǎo)致業(yè)務(wù)極其不穩(wěn)定度苔。這也是一些人對重構(gòu)嗤之以鼻的情況的根源。
NO.2重構(gòu)前提條件是什么浑度?
全盤熟悉代碼寇窑,掌控業(yè)務(wù)。
接手別人的項(xiàng)目時(shí)箩张,在看到混亂不堪的代碼后甩骏,不要一上來就開始大動干戈。先熟悉代碼架構(gòu)先慷,如果一個(gè)代碼架構(gòu)都混亂不堪饮笛,那就多費(fèi)點(diǎn)勁,將代碼好好得梳理一遍论熙,如果有詳細(xì)地文檔的話福青,配合文檔一起閱讀的效果會更好。但是現(xiàn)實(shí)卻是,你不得不去閱讀一些令你感到莫名其妙的代碼无午,然后自己去整理文檔媒役。慢慢熟悉一個(gè)項(xiàng)目的業(yè)務(wù)邏輯,梳理清楚業(yè)務(wù)內(nèi)部之間的關(guān)系宪迟。如果你不熟悉業(yè)務(wù)酣衷,不熟悉代碼,來講重構(gòu)次泽,無疑是重寫的罷了穿仪。
時(shí)間!
在你尚沒能熟練《重構(gòu)》的各項(xiàng)技巧之前意荤,請首先明白你當(dāng)下是否有充足的時(shí)間啊片,畢竟高效完成工作才是最重要的。在工作中袭异,其他人更多只會關(guān)心的是程序員的產(chǎn)出:項(xiàng)目的穩(wěn)定快速迭代,但是熟練技巧需要大量的練習(xí)時(shí)間炬藤。而大型的重構(gòu)御铃,則需要更加多的人力物力的投入。
NO.4重構(gòu)的目標(biāo)是什么沈矿?
標(biāo)準(zhǔn)化
在不斷地編碼過程中上真,遇到的重復(fù)的問題會越來越多,而各類語言框架正是將標(biāo)準(zhǔn)化的一種體現(xiàn)羹膳。而對遇到的重復(fù)問題進(jìn)行標(biāo)準(zhǔn)化處理睡互,除了能讓我們避免重復(fù)勞動提高開發(fā)效率,及讓我們將一些業(yè)務(wù)進(jìn)行層次分工陵像。在標(biāo)準(zhǔn)化的過程中就珠,主要做的是將業(yè)務(wù)職責(zé)劃分清楚,避免混亂不堪的界面醒颖。
標(biāo)準(zhǔn)化是一個(gè)很漫長的過程妻怎,收益很明顯,但是正如企業(yè)的架構(gòu)一樣泞歉,當(dāng)面臨調(diào)整的時(shí)候逼侦,也會面臨重大的挑戰(zhàn)。當(dāng)我們面臨將已經(jīng)標(biāo)準(zhǔn)化的代碼架構(gòu)進(jìn)行重構(gòu)的時(shí)候腰耙,這樣的重構(gòu)成本會相當(dāng)?shù)母唛欢K栽谥贫?biāo)準(zhǔn)化中需要嚴(yán)格按照“SOLID”的原則下進(jìn)行。雖然這是有點(diǎn)古老的原則挺庞,但是沒有這些原則指導(dǎo)晰赞,制定的標(biāo)準(zhǔn)化,寸步難行。
更好宾肺,更快
無論在什么情況下溯饵,在編程里面完成任務(wù)是重中之重(重要的事情要重復(fù)一下)。只有先完成锨用,我們才能去說追求更多——讓程序運(yùn)行的更好丰刊,更快。要做到這個(gè)目標(biāo)增拥,必須要在時(shí)間復(fù)雜度和空間復(fù)雜度上下更多的功夫啄巧。這是《數(shù)據(jù)結(jié)構(gòu)》這門課程最基礎(chǔ)、最簡單掌栅,也是貫通全書的知識點(diǎn)秩仆。最近在閱讀《Redis設(shè)計(jì)與實(shí)現(xiàn)》一書的時(shí)候,更是充分地了解到這兩點(diǎn)的重要猾封,幾乎是所有操作都是O(1)的時(shí)間復(fù)雜度澄耍,在它各種數(shù)據(jù)結(jié)構(gòu)和對象的實(shí)現(xiàn)上,都體現(xiàn)了盡量少的存儲空間做盡量多的事情晌缘。Do less,get more!
我們雖然謹(jǐn)記時(shí)間復(fù)雜度和空間復(fù)雜度齐莲,但是不能絕對強(qiáng)調(diào)。更好磷箕、更快不是單單指這兩個(gè)基礎(chǔ)指標(biāo)选酗,還有代碼的可讀性、可擴(kuò)展性岳枷,還有業(yè)務(wù)之間的耦合度和業(yè)務(wù)自身的高內(nèi)聚芒填。如關(guān)系型的數(shù)據(jù)庫一樣,絕對的范式設(shè)計(jì)只會存在于實(shí)驗(yàn)室空繁。在現(xiàn)實(shí)的項(xiàng)目中殿衰,為了提高開發(fā)效率和查詢速度,我們會根據(jù)實(shí)際需要設(shè)計(jì)冗余的數(shù)據(jù)表盛泡。所以播玖,在實(shí)際開發(fā)中我們總要適當(dāng)?shù)倪M(jìn)行取舍,根據(jù)業(yè)務(wù)的特性和實(shí)際場景饭于,犧牲一些時(shí)間復(fù)雜度和空間復(fù)雜度蜀踏,以達(dá)到整體更高的收益。
NO.5重構(gòu)帶來了什么掰吕?
開發(fā)效率的極大提升
之前有一段時(shí)間果覆,有好幾個(gè)項(xiàng)目我需要同時(shí)開發(fā),但是我都可以完全輕松的掌控殖熟,而且是保質(zhì)保量地按時(shí)完成了開發(fā)任務(wù)局待。因?yàn)槲以诓粩嗟刂貥?gòu)中,整理出了一套自己的編碼標(biāo)準(zhǔn),在這套編碼標(biāo)準(zhǔn)下钳榨,設(shè)計(jì)好了代碼思路后舰罚,進(jìn)入了編程階段的我無需過多的進(jìn)行思考,只要我按照自己制定好的道路和代碼層次去簡單編碼即可薛耻。而在測試階段出了一些bug营罢,更多的是產(chǎn)品設(shè)計(jì)上的缺陷而需要產(chǎn)品完善的地方。
對于目前來說饼齿,寫一個(gè)新的業(yè)務(wù)饲漾,就是在一個(gè)零零散散的積木進(jìn)行快速拼湊,再為這個(gè)項(xiàng)目添加上它自身的特有的色彩即可缕溉。
開發(fā)思路的改變
對于我而言考传,我是在完善自己的代碼工具庫。首先如何將一些常見的代碼邏輯進(jìn)行不斷抽象進(jìn)行封裝证鸥,變成自己的工具僚楞;如何將自己的工具變得更加快捷便利,當(dāng)下的工具是否需要進(jìn)行調(diào)整來適應(yīng)業(yè)務(wù)發(fā)展枉层;在什么業(yè)務(wù)場景下泉褐,哪些工具可以復(fù)用或者抽取形成一個(gè)微服務(wù)。
NO.6重構(gòu)邊界
在《重構(gòu)》中說到返干,重構(gòu)是在時(shí)刻進(jìn)行著的兴枯。對于個(gè)人開發(fā)業(yè)務(wù)而言血淌,這是正確的矩欠,因?yàn)樾枨笥|發(fā)改變。但是對于整體架構(gòu)而言悠夯,我們更多的是在固定的框架下癌淮,默默耕耘。
正如在一棟樓房里面沦补,我們可以花一天的時(shí)間對其中一個(gè)房間進(jìn)行重新擺設(shè)乳蓄,而對整棟樓房的影響近乎微乎其微。因?yàn)槊總€(gè)人有自己的風(fēng)格夕膀,對房間按照自己的心意進(jìn)行重構(gòu)虚倒,無可厚非。但是要對整棟樓房進(jìn)行重構(gòu)产舞,那是一個(gè)極其漫長的過程魂奥,再者,如果業(yè)務(wù)沒有達(dá)到飛躍性的增長易猫,整棟樓房的堅(jiān)固穩(wěn)定尤其重要耻煤,畢竟人都要舒舒服服地住在里面,誰能容忍,三天兩頭在自己家里進(jìn)行裝修哈蝇?
故此棺妓,重構(gòu)的邊界顯而易見!其實(shí)當(dāng)“人口”激增了炮赦,一棟樓房不能再適應(yīng)的時(shí)候怜跑,如果有充裕的時(shí)間和地方,重建一棟無疑是最好的選擇眼五。