本文是個人對書寫可維護(hù)代碼的一點(diǎn)點(diǎn)思考嫁审。
(一)整潔代碼的重要性。
《代碼整潔之道》赖晶、《實(shí)現(xiàn)模式》律适、《設(shè)計(jì)模式》、《重構(gòu)》遏插、《重構(gòu)和模式》這些書中捂贿,都指出書寫可維護(hù)代碼是十分重要的。想必每位開發(fā)者都能說出幾條原因吧胳嘲,這里我也梳理一下自己的邏輯厂僧。
什么是好代碼?概括地說就兩條:第一了牛,能實(shí)現(xiàn)需求颜屠,第二,可維護(hù)性高白魂。
1.1 能實(shí)現(xiàn)需求是第一要滿足的汽纤。
程序員工作的本質(zhì)是代碼交付。這是我們工作的基本福荸,若代碼不能實(shí)現(xiàn)需求蕴坪,肯定不是好的代碼。這一點(diǎn)是無需置疑的,任何其他方面的工作背传,都需要為它讓路呆瞻。因此有很多公司,把這一點(diǎn)作為績效考核的唯一要求径玖。
1.2 書寫可維護(hù)性代碼是老鳥和新手的本質(zhì)區(qū)別痴脾。
怎么衡量自己成長了呢?有一個看似開玩笑的方法是梳星,當(dāng)你去看自己以前寫的代碼赞赖,如果你覺得垃圾時,就表明自己進(jìn)步了冤灾。
那么前域,什么樣的代碼是可維護(hù)性高的代碼呢?《代碼整潔之道》給出的觀點(diǎn)是韵吨,代碼可維護(hù)性與其整潔度成正比匿垄。當(dāng)然也給出了整潔的代碼是什么樣的,并給出了原則和各種細(xì)則归粉。在我看來椿疗,作者只是把“可維護(hù)”重新定義成了“整潔”而已。
我總結(jié)的可維護(hù)性代碼的三大特點(diǎn)是:
- 可讀性高糠悼。
- 可擴(kuò)展性高届榄。
- 可復(fù)用性高。
1 代碼要可讀性高绢掰。
《代碼整潔之道》中說痒蓬,如果你把敲代碼的過程進(jìn)行錄屏,就會發(fā)現(xiàn)大部分時間都是讀代碼的過程滴劲。
往往大部分代碼都是自己最近寫的攻晒,因此沒有理解上的難度。此時班挖,我們很少去關(guān)注代碼是否具有高可讀性鲁捏。變量名字叫什么無關(guān)緊要,是否有注釋也無關(guān)緊要萧芙,是否有優(yōu)化的空間更無關(guān)緊要给梅。我們下意識的心理邏輯是這樣的:反正都是自己寫的代碼,自己看得懂双揪,明天看這個代碼的人還是自己动羽。而完成任務(wù)是首要的,畢竟公司看重的還是任務(wù)完成指標(biāo)渔期,因?yàn)檫@點(diǎn)是影響績效运吓。
對待自己的代碼是這個態(tài)度渴邦,而對待他人的呢?對于非自己寫的代碼拘哨,比如要使用別人的接口時谋梭,基本上會問一下同事,“發(fā)起某某請求的方法倦青,在哪個文件瓮床,叫什么名字?”产镐,因?yàn)槲覀冎肋@樣做來得快隘庄,要自己去找,那可費(fèi)勁了磷账。
但是一直這么做會有問題的峭沦。正如《第五項(xiàng)修煉》說的那樣,你要解決的問題逃糟,很可能于來自上一次其他問題的解決方案,其實(shí)它們原本就不該出現(xiàn)蓬豁。
問題出現(xiàn)的場景一般都發(fā)生在維護(hù)時绰咽。自己寫的代碼,半年后能會去讀它的人仍可能是你本人地粪。屆時取募,你會想,自己當(dāng)初為啥要這么寫呢蟆技?那么長的一坨玩敏,竟然還沒有注釋,當(dāng)初的思路又是什么呢质礼?這個變量名是什么意思呢旺聚?恨不能穿越回過去,告訴自己:你現(xiàn)在的偷懶眶蕉,以后還會由你來買單的砰粹。
最可怕的是,當(dāng)你去維護(hù)別人寫的垃圾代碼造挽,心里罵著別人時碱璃。其實(shí),很可能現(xiàn)在的你同樣會坑以后的另外一個人饭入。當(dāng)你每敲一段代碼時嵌器,都要想一想那句名言:
代碼是給人看的,只是偶爾運(yùn)行一下谐丢。
2 代碼要可擴(kuò)展性高爽航。
寫出來的代碼,不會一成不變的。在迭代過程中岳掐,可能會多次修改凭疮。所以寫代碼時,不能只聚焦于眼下串述,只要完成功能就行了执解。想一想,如果一個月后纲酗,Boss說你要在某某功能模塊里添加一個小功能時衰腌,要怎么能快速定位到你的代碼。此時就要考慮代碼的可讀性以及設(shè)計(jì)模式了觅赊。
這一點(diǎn)右蕊,其實(shí)目前流行的mvvm框架,本身就是為了解決此問題的吮螺。就跟畫畫一樣饶囚,別人畫好了輪廓,我們只需要去著色就行了鸠补。高內(nèi)聚低耦合的代碼萝风,一直是我們追求的設(shè)計(jì)目標(biāo)。封裝變化紫岩、多用組合等思想规惰,良好的框架在這點(diǎn)上幫我們解決了不少問題。
3 代碼要可復(fù)用性高泉蝌。
既然一些代碼能夠復(fù)用歇万,說明它們能解決一些通用的問題。比如流行的框架和庫勋陪,本身就是讓別人復(fù)用的贪磺。可復(fù)用也是設(shè)計(jì)模式存在的原因粥鞋。你遇到的問題缘挽,大多少數(shù)時,前人就遇到過呻粹,并且給出了通用方案壕曼。而我們要做的就是“拿來主義”。
具體到項(xiàng)目時等浊,項(xiàng)目結(jié)構(gòu)必然要分層腮郊,底層代碼自然要抽出來。這個道理我們都懂筹燕≡桑《代碼整潔之道》中說衅鹿,重復(fù)是軟件一切邪惡的根源。所以过咬,Dont repeat youself大渤。
(二) 為什么我們寫出的代碼不是整潔代碼。
養(yǎng)成寫整潔的代碼掸绞,需要形成習(xí)慣泵三。但是新習(xí)慣的養(yǎng)成就是要克服掉舊習(xí)慣。大道理衔掸,誰都懂烫幕。難的是,知行合一敞映。為何自己寫的代碼那么糟糕较曼,我們能找到兩個常見的原因是:沒時間和沒反饋。
2.1 沒時間振愿。
最常找的理由之一就是捷犹,時間不夠。
我們前端工作的時間比例大致是這么劃分的冕末。書寫代碼和調(diào)試代碼的比例大概是3:7伏恐。
想必我們都有這種經(jīng)驗(yàn)。要實(shí)現(xiàn)一個頁面栓霜,不到兩三個小時就能實(shí)現(xiàn)大部分功能,然后發(fā)現(xiàn)一些小問題横蜒,即那些難纏的bug胳蛮,此時我們剩下的大部分時間都在對付這些可惡的“蟲子”,代碼改來改去丛晌。有時一個問題的定位仅炊、技術(shù)調(diào)研和與人溝通時間就能占據(jù)整個下午。真等到解決完這些小問題時澎蛛,也差不多到下班的時間了抚垄。
這是我們常見的一天里,沒有讓代碼整潔的時間谋逻。
項(xiàng)目完事了呆馁,馬上開始又啟動下一個項(xiàng)目。當(dāng)你愁眉苦臉地思考當(dāng)前如何完成功能時毁兆,此時你被通知要維護(hù)一下之前的項(xiàng)目浙滤。再次修改自己之前的代碼,你可能會感慨气堕,以后這塊需要好好修正修正纺腊∨线郑可惜手里項(xiàng)目太緊了,沒有時間揖膜。事實(shí)上通常是真沒有時間了誓沸。
這是我們項(xiàng)目周期間,沒有讓代碼整潔的時間壹粟。
2.2 沒反饋拜隧。
比寫糟糕代碼的更糟糕的事情是:你不知道你寫的代碼很垃圾。每個人都很忙煮寡,沒人幫我看代碼虹蓄,我也覺得自己寫得不好,但我又不知道如何改進(jìn)幸撕。這是很多新人的困境薇组,沒有反饋的練習(xí),練習(xí)再多也成不了高手的坐儿。
(三) 如何書寫整潔代碼律胀。
沒時間,會導(dǎo)致代碼寫不好貌矿,代碼糟糕炭菌,會導(dǎo)致更沒時間,這是一個死循環(huán)逛漫。
沒反饋黑低,就不知如何提高代碼質(zhì)量,進(jìn)而一直這樣持續(xù)下去酌毡。把第一年的經(jīng)驗(yàn)再重復(fù)幾年克握。這是一汪死水。
如何破這個局呢枷踏?
3.1 微習(xí)慣菩暗。
其實(shí),代碼要保持整潔旭蠕,就跟你屋子里保持清潔的方法一樣停团。讓屋子清潔很容易,你只需要進(jìn)行一次大掃除就可以了掏熬。但是要一直保持清潔佑稠,那么需要養(yǎng)成微習(xí)慣∧踅看完的書讶坯,不能隨便在桌子上一擺,要換洗的衣物岗屏,要放到固定的地方等等辆琅。每一個都是微習(xí)慣漱办。
從小事做起,比如變量名或方法名婉烟。好的代碼是不需要大量注釋的娩井,因?yàn)楹玫淖兞棵Q就起到了注釋的效果∷圃《代碼整潔之道》一書中洞辣,給出各個方面的整潔代碼是什么樣的。比如函數(shù)該怎么寫昙衅,注釋該怎么寫等等需要養(yǎng)成的微習(xí)慣扬霜。
3.2 清單思維。
養(yǎng)成微習(xí)慣是重要的而涉,但如何養(yǎng)成呢著瓶?答案是清單思維。
清單啼县,除了我們熟悉的todo list之外材原,還又一種核查清單。在清單上列出哪些我們需要注意的地方季眷,然后我們一條條去核對余蟹。做到了就打勾,這點(diǎn)對形成微習(xí)慣很有幫助的子刮。
比如威酒,我每次出門都不會丟三落四。因?yàn)槲矣涀∫痪湓捦ο浚焓忠X買煙火兼搏。
這里,我建立了一個核查清單:身份證沙郭、手機(jī)、鑰匙裳朋、錢包病线、煙和打火。同樣的道理鲤嫡,在我們?nèi)粘4a的開發(fā)中送挑,提交代碼之前,拿出清單對一對暖眼,直到自己養(yǎng)成習(xí)慣惕耕。
3.3 code review。
旁觀者清诫肠,當(dāng)局者迷司澎。從人性的角度來說欺缘,每個人或多或少都有雙向標(biāo)準(zhǔn)。相對于自己挤安,要求別人就嚴(yán)苛一點(diǎn)谚殊。這一人性卻可以為我們所用。同事之間進(jìn)行代碼回顧蛤铜,是對每個人都有好處的嫩絮。開始時看似浪費(fèi)時間,其實(shí)減少日后不該浪費(fèi)的時間围肥。也可以配合利用核查清單剿干,畢竟每個人對一個個具體的核查點(diǎn)的理解程度時不一樣的,這樣能幫助彼此更快地成長穆刻。而不是你向他人請教時置尔,只會得到”你去看某某書就行了“這樣的答案。
本文完蛹批。
整潔代碼的核查清單:
https://github.com/ryanmcdermott/clean-code-javascript#introduction
vue代碼的核查清單:
https://cn.vuejs.org/v2/style-guide/