一份擁有良好可讀性和拓展性的代碼是項(xiàng)目里的良藥,它不僅看著舒服,改起來也方便,甚至還能重用,各模塊邏輯分明。“見碼知功底”,而要達(dá)到高手那種簡潔有力的境界,需要進(jìn)行大量的總結(jié)和練習(xí),今天我們就來談?wù)勅绾螌懗鰞?yōu)美的代碼。
命名
好的命名應(yīng)該具有如下特征:
1,意思正確。這是最基本的要求,不要掛羊頭賣狗肉,詞不達(dá)意,要一眼就知道什么意思。就算一眼看不出來,復(fù)制到有道詞典翻譯一下也能知道什么意思;
2,單復(fù)數(shù)分明。如果是一個(gè)數(shù)組,要么加s/es結(jié)尾表明其是復(fù)數(shù),要么加入list表示它是一個(gè)數(shù)組。如cars,carList都可以表達(dá)一個(gè)車的列表;
3,慎用縮略詞。縮略詞可以讓我們的命名更加簡潔,但是一!定!要!是!業(yè)!界!通!用!縮!略!詞!比如info原意為information,msg原意為message,fn原意function,conf原意config等等,這些縮略詞都是業(yè)內(nèi)傳統(tǒng)了,大家都知道什么意思,切記不要自己亂造縮略詞;
4,有具體含義。根據(jù)業(yè)務(wù)場(chǎng)景去命名,而不是根據(jù)抽象命名;比如getUnreadMsgList,一看就知道是獲取未讀消息列表的意思,而getData這種說了跟沒說一樣,缺乏具體含義。
注釋
有表達(dá)力的代碼是不需要注釋的。比如一個(gè)init函數(shù),一看就知道是用于做一些初始化的工作,沒必要寫多余的注釋來說明。
但是有一些場(chǎng)景注釋是非常有必要的,下面幾種場(chǎng)景要添加注釋:
1,一些針對(duì)特殊業(yè)務(wù)場(chǎng)景而訂制的特殊邏輯。比如當(dāng)我們更新個(gè)人信息的時(shí)候,由于后端的問題,需要少傳一個(gè)諸如生日的信息,或者更新頭像時(shí)要多傳一個(gè)時(shí)間戳來供其他業(yè)務(wù)以后使用。這些莫名其妙的增刪屬性,如果不加以注釋,將導(dǎo)致后續(xù)自己都無法理解;
2,可能會(huì)出現(xiàn)隱患的代碼。由于自身水平所限,或者本身技術(shù)上就無法實(shí)現(xiàn),只能通過一些特殊技巧來仿制一些效果,往往會(huì)存在安全隱患,比如:用戶操作太快會(huì)出問題,網(wǎng)絡(luò)太慢會(huì)出問題,某個(gè)接口調(diào)不通這頁面會(huì)全掛了,一些特殊的操作會(huì)引起的暫時(shí)無法解決的bug等等場(chǎng)景,都需要注釋說明;
3,涉及到某些高深的或者生僻的技術(shù)知識(shí)。這種也要注釋,以提醒自己和其他開發(fā)者。
一般來說,注釋基本上都是在表達(dá)“這里我為什么這么做”,很少有注釋會(huì)去表達(dá)“我是一個(gè)什么玩意兒”,如果是后者的注釋,只能說明命名沒做好。
函數(shù)
函數(shù)是代碼的靈魂,也是寫邏輯的載體,以下幾個(gè)要求是判斷一個(gè)開發(fā)者函數(shù)寫的好不好的標(biāo)準(zhǔn)。
1,是不是單一職責(zé)。一個(gè)函數(shù)應(yīng)該只做一件事,而這件事應(yīng)該能通過函數(shù)名就可以清晰的展示。這是一個(gè)非常好的特性,一個(gè)辣雞的函數(shù)可能動(dòng)輒幾百行代碼,各種邏輯堆積在一起,看得人頭腦發(fā)暈,甚至開發(fā)者自己都理不清楚;判斷這個(gè)函數(shù)是不是單一職責(zé)的技巧很簡單:看看它還能不能再拆分。
2,有沒有層級(jí)之分。函數(shù)與函數(shù)之間是有身份地位之分的,有負(fù)責(zé)整體大局觀的高級(jí)函數(shù),也有專注細(xì)節(jié)的打工仔低級(jí)函數(shù)。如果不建立起層級(jí)結(jié)構(gòu),就容易迷失在細(xì)節(jié)的海洋里。比如:
對(duì)于做一頓飯這個(gè)函數(shù)來說,他不需要關(guān)心諸如買菜時(shí)反復(fù)挑選這種細(xì)節(jié),它只需要知道,大概有三個(gè)大步驟就行了。所以這段邏輯會(huì)根據(jù)其地位拆分出不同等級(jí)的函數(shù),假設(shè)沒有層級(jí)之分,那么從第一步的“搭公交”一直寫到最后一步的“倒垃圾”,這東西會(huì)變得極難維護(hù)。
3,承載的場(chǎng)景是否足夠簡單。有時(shí)候我們會(huì)遇到這樣一種場(chǎng)景:一個(gè)函數(shù)在很多地方都會(huì)用到,但是不同地方傳入的參數(shù)不一樣,這樣我們?yōu)榱撕瘮?shù)的通用性,就針對(duì)入?yún)⒆隽撕芏喾N場(chǎng)景的識(shí)別,導(dǎo)致入?yún)⒎浅6啵锩孢€需要根據(jù)不同的場(chǎng)景做邏輯上的細(xì)微調(diào)整。所以單單是取傳入?yún)?shù)都?jí)騿芰耍欢训膇f else或switch case。
這個(gè)函數(shù)太難了,而且這已經(jīng)違背了函數(shù)的單一職責(zé)原則,它在里面做了多種場(chǎng)景的判斷,從而表現(xiàn)出不同的行為,但這些行為又不是完全不同,而是“大體相同”,如果重寫好像又會(huì)增加很多的重復(fù)的代碼。解決的方法是做更小粒度的拆分,將那些真正與業(yè)務(wù)脫鉤的部分抽離出來,而不同場(chǎng)景對(duì)應(yīng)不同的處理函數(shù),剛剛抽離的業(yè)務(wù)脫鉤函數(shù)正好作為這些不同場(chǎng)景函數(shù)公共部分!
聯(lián)系客服