代碼異味

程式開發領域,代碼中的任何可能導致深層次問題的症狀都可以叫做代碼異味(Code smell)。

通常,在對代碼做簡短的反饋迭代時,代碼異味會暴露出一些深層次的問題,這裏的反饋迭代,是指以一種小範圍的、可控的方式重構代碼。基於這些暴露的問題,人們會進一步的檢查設計和代碼中是否還存在別的代碼異味,然後再做進一步的重構。從負責重構的開發者的角度來看,代碼異味可以啟發何時重構,如何重構。因此,可以說代碼異味推動着重構的進行。

該術語似乎由肯特·貝克於90年代後期,在WardsWiki上首次使用。且自從在Refactoring. Improving the Design of Existing Code.[1]被提到過,使用率就大大的提高。代碼異味同時也是敏捷開發者常用的術語。

什麼是,或者不是代碼異味,是一個主觀的判斷,通常因語言、開發者、開發方法的不同而不同。對於Java開發語言,有些工具,比如CheckstylePMDFindBugs可以自動檢測一些代碼異味。

常見的代碼異味

  • 代碼重複: 相同或者相似的代碼存在於一個以上的地方。
  • 長方法: 一個非常長的方法、函數或者過程。
  • 巨類: 一個非常龐大的類。
  • 太多的參數: 函數或者過程的冗長的參數列使得代碼可讀性和質素非常差。
  • 特性依戀: 一個類過度的使用另一個類的方法。
  • 親密關係: 一個類依賴另一個類的實現細節。
  • 拒絕繼承: 子類以一種『拒絕』的態度,覆蓋基礎類別中的方法,換句話說,子類不想繼承父類別中的方法,參考里氏替換原則
  • 冗餘類 / 寄生蟲: 一個功能太少的類。
  • 人為的複雜: 在簡單設計已經滿足需求的時候,強迫使用極度複雜的設計模式。
  • 超長識別碼: 尤其,在軟件工程中,應該毫無保留的使用命名規則來消除歧義。
  • 超短識別碼: 除非很明顯,一個變數名應該反映它的功用。
  • 過度使用字面值: 為提高可讀性和避免編碼錯誤,應該使用命名常數。此外,字面值可以且應該在可能的情況下,獨立存放於資原始檔或者指令碼中,在軟件部署到不同區域時,可以很方便地本地化。

參見

參照

外部連結