代码整洁之道小结
以下總結(jié)一些不好的代碼規(guī)范, 借此警示自己不要犯這種錯誤
注釋
1.不恰當(dāng)?shù)淖⑨?/strong>
注釋應(yīng)該僅用來描述有關(guān)代碼和設(shè)計的技術(shù)性信息。像修改歷史等信息不應(yīng)出現(xiàn)在注釋中
2.廢棄的注釋
過時、無關(guān)或錯誤的注釋就是廢棄的注釋,不要寫這種注釋,如果發(fā)現(xiàn)了請盡快更新或刪除,否則它會越來越遠離它開始描述的代碼
3.多余的注釋
如果代碼自身就能說明,就不要去寫注釋,例如:
i++; // i自增注釋應(yīng)該說明代碼自身沒有提到的事情。
4.注釋掉的代碼
一般注釋掉的代碼,很可能已經(jīng)與現(xiàn)有系統(tǒng)無關(guān)了,它調(diào)用的變量或函數(shù)可能已經(jīng)改名,變得毫無用處
函數(shù)和類
1.過多的參數(shù)
一個函數(shù)的參數(shù)個數(shù)最好為零,如果有三個以上,可能就要考慮封裝了
2.標(biāo)識參數(shù)
如果函數(shù)的參數(shù)存在布爾值,只會讓人迷惑,完全可以將其拆分為兩個函數(shù),枚舉也是同樣的道理
3.死函數(shù)
沒有被用到的函數(shù),應(yīng)該盡早刪除
4.死代碼
死代碼就是不會被執(zhí)行到的代碼,它可能出現(xiàn)在不會觸發(fā)的if語句中,或者不會拋出異常的try catch中。如果找到這樣的代碼,請今早刪除。
5.垂直距離
變量應(yīng)該在首次使用的上面聲明。函數(shù)應(yīng)該放到首次被調(diào)用的下面一點點
6.前后不一致
如果在某個地方把響應(yīng)對象命名為response, 則在其他地方也應(yīng)該如此命名。如果把某個方法命名為getCommonModule, 則處理相似事情的方法應(yīng)該取相似的名字,如:getUserModule。這會讓代碼扔易于閱讀和修改。
7.錯誤位置的安放
對于一個函數(shù)或常亮的位置,應(yīng)該放在讀者自然而然期待它出現(xiàn)的地方
8.不恰當(dāng)?shù)撵o態(tài)方法
如果一個方法被命名為靜態(tài)方法,說明它所需要的變量全部來源與參數(shù),而不是對象的屬性,同時也不會用到多態(tài)的特性。
當(dāng)然有些方法命名為靜態(tài)是有必要的,如:Math.max(a,b), 如果還需要 new Math().max(a,b), 也太蠢了
9.不恰當(dāng)?shù)暮瘮?shù)名
如果看到一個函數(shù)名之后,仍然對其意圖存在疑惑,甚至還要去查看源碼,那么請換個名字吧。
10.錯誤的抽象層級
編寫方法時,很容易想到,函數(shù)應(yīng)該是一層一層往下調(diào)用的,不應(yīng)該出現(xiàn)地層函數(shù)調(diào)用高層函數(shù)的現(xiàn)象,就像是基類不應(yīng)該依賴于派生類一樣。
11.封裝條件
在if, while等條件語句中,下面這種寫法:
if(shouldBeDeleted(timer)){}明顯要好于:
if(timer->hasExpired() && !timer->isRecurrent()){}12.隱藏調(diào)用順序
在一個類中,有這樣一段代碼:
public function eat(Person $p){buyGreens();makeDinner();eatDinner($p); }這段代碼很好理解,先買菜,然后做飯,最后吃飯。很顯然,買菜的時候會對類的菜品屬性進行賦值,在做飯的時候使用。但如果他們的調(diào)用順序?qū)戝e了,就會使用到未初始化的變量。如果改成下面這樣:
public function eat(Person $p){$greens = buyGreens();$dinner = makeDinner($greens);eatDinner($dinner, $p); }這樣通過函數(shù),暴露了調(diào)用順序,每個函數(shù)都產(chǎn)出下一個函數(shù)所需要的結(jié)果,這樣一來就沒理由不按照順序調(diào)用了吧。
總結(jié)
- 上一篇: 23种设计模式之享元模式
- 下一篇: 虚拟内存分页机制的地址映射