代碼的壞味道

代碼首先是寫(xiě)給人看的,只是恰巧(incidentally)能夠運(yùn)行。 ----Paul Graham
現(xiàn)在寫(xiě)C++服務(wù)后端,工作內(nèi)容大部分是推薦系統(tǒng)后臺(tái)開(kāi)發(fā)。推薦系統(tǒng)算是公司技術(shù)架構(gòu)中比較基礎(chǔ)服務(wù)的模塊,所以對(duì)代碼質(zhì)量的要求比較高。之前做游戲很多時(shí)候代碼都是趕工的,也沒(méi)有很好的靜下來(lái)思考去重構(gòu),幾天沒(méi)事重構(gòu)了之前的一個(gè)模塊,重構(gòu)后,代碼可讀性有了很大提升。
我們都知道要追求高質(zhì)量的代碼,什么是高質(zhì)量的代碼,這個(gè)標(biāo)準(zhǔn)就比較高了,但我們需要至少保證不寫(xiě)出很難維護(hù)的代碼。平時(shí)每次的pr都需要被經(jīng)理review,自己寫(xiě)代碼的要求越來(lái)越高。

代碼的壞味道體現(xiàn)在:

1.注釋太多或者太少

整個(gè)代碼都是很多的注釋,整個(gè)屏幕沒(méi)幾行是代碼的,想要看個(gè)整個(gè)代碼還需要翻好幾頁(yè),能夠維護(hù)你的代碼的人,能力都是和你比較接近的,別人還不是那么蠢。
每個(gè)人負(fù)責(zé)的功能還是有一點(diǎn)的不同,有時(shí)候的確遇到一些功能,實(shí)現(xiàn)起來(lái)比較曲折,如果不是自己寫(xiě)的別人很難理解錯(cuò)誤,這時(shí)候需要額外注釋一下,利于后來(lái)人的維護(hù)。

2.代碼風(fēng)格不統(tǒng)一

這個(gè)一般出現(xiàn)在新人的代碼中,比如匈牙利命名和駝峰命名法交叉使用,看起來(lái)就讓人厭惡,代碼風(fēng)格整體必須保持統(tǒng)一,整體看起來(lái)不那么亂。

std::vector<int64_t> gid_list;
std::vector<int>  uidList;

3.函數(shù)命名

看一段代碼,首先看到的是代碼的函數(shù)名,好的代碼,一看函數(shù)名就知道函數(shù)的作用,爛的代碼,函數(shù)名字模棱兩可,讓人只能去讀函數(shù)的每一行代碼才能讀懂。

bool check(int64_t gid);       //1
bool isAvaliable(int64_t gid); //goods

對(duì)于一些檢測(cè)函數(shù),以肯定的語(yǔ)句更合適。

4.變量命名

初學(xué)者經(jīng)常容易用t1,t2,t3等以字母加數(shù)字組合的方式來(lái)命名。變量命寧愿長(zhǎng)點(diǎn)也不要太短。
比如要保存itemcf推薦的物品gid列表。

std::vector<int64_t> gids;        //1
std::vector<int64_t> itemcf_gids;  //goods

i,j,k一般僅用于for循環(huán)中的下標(biāo)。推薦換為具體的下表定義單詞。

5.代碼一行字符太多

有的函數(shù)聲明就好長(zhǎng)的一行,要看完還得需要移動(dòng)光標(biāo)到最后,繼續(xù)往后翻,這種看了就不想看,一般不要超過(guò)80字符,有些不可避免的過(guò)長(zhǎng),換行然后第二行插兩個(gè)tab對(duì)齊。

6.函數(shù)體函數(shù)太長(zhǎng)

一個(gè)函數(shù)體代表了一個(gè)模塊的封裝,如果函數(shù)的實(shí)現(xiàn)太長(zhǎng),有的甚至一屏幕都看不完,這時(shí)候你是不是需要考慮你的模塊劃分的有問(wèn)題了,一般來(lái)說(shuō)函數(shù)體平均不要超過(guò)50行,對(duì)于模塊進(jìn)行正確的劃分。完全能夠減少函數(shù)的行數(shù),使得函數(shù)實(shí)現(xiàn)更清晰明了。

7.重復(fù)的代碼

在實(shí)現(xiàn)功能的時(shí)候,完全只考慮怎么實(shí)現(xiàn)邏輯,完全沒(méi)去想結(jié)構(gòu)的調(diào)整,重復(fù)的邏輯出現(xiàn)了好幾次,代碼塊看起來(lái)臃腫不堪,需要很大力氣才能讀懂。
面向?qū)ο蟮睦^承,多態(tài),封裝這些的出現(xiàn)都是為了解決代碼復(fù)用的問(wèn)題,對(duì)于重復(fù)的邏輯完全可以將重復(fù)的功能提煉出來(lái),封裝成一個(gè)函數(shù),再去調(diào)用。

8.錯(cuò)誤的設(shè)計(jì)

本來(lái)可以有的更簡(jiǎn)潔的實(shí)現(xiàn),被實(shí)現(xiàn)的過(guò)于繁瑣,讓人看起來(lái)啰里啰嗦,打個(gè)簡(jiǎn)單的比方,需要保存一個(gè)列表,列表里每個(gè)元素只能唯一,如果被設(shè)計(jì)用vector去實(shí)現(xiàn),還需要自己每次push_back時(shí)還需要手動(dòng)去查找,如果一開(kāi)始用set來(lái)存儲(chǔ),代碼就會(huì)簡(jiǎn)潔很多。(這個(gè)例子貌似不大合適)

9.缺乏一定的抽象能力

主要體現(xiàn)在一個(gè)最初的一個(gè)簡(jiǎn)單需求,后來(lái)提了更多的需求,到最后一個(gè)功能有了好多的變種實(shí)現(xiàn),功能代碼很難復(fù)用,比如對(duì)于一個(gè)初期的推薦,最開(kāi)始需要保存的數(shù)據(jù)只是物品信息表以及一些操作一個(gè)類ReposManger就夠了,后期可能需要用戶的瀏覽記錄,心愿單,用戶畫(huà)像等,該類操作越來(lái)越多,需要管理的數(shù)據(jù)越來(lái)越龐大,架構(gòu)都不敢隨便動(dòng)。這個(gè)主要體現(xiàn)在項(xiàng)目組里開(kāi)發(fā)效率比較高的人,大量的業(yè)務(wù)開(kāi)發(fā)工作導(dǎo)致沒(méi)做過(guò)多的思考,要體會(huì)到這個(gè)壞味道需要一定的經(jīng)驗(yàn)。

要消除這些代碼的壞味道,只有通過(guò)多寫(xiě),多思考,多看好的代碼!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容