簡介
程式開發領域,代碼中的任何可能導致深層次問題的症狀都可以叫做代碼異味。通常,在對代碼做簡短的反饋疊代時,代碼異味會暴露出一些深層次的問題,這裡的反饋疊代,是指以一種小範圍的、可控的方式重構代碼。基於這些暴露的問題,人們會進一步的檢查設計和代碼中是否還存在別的代碼異味,然後再做進一步的重構。從負責重構的開發者的角度來看,代碼異味可以啟發何時重構,如何重構。因此,可以說代碼異味推動著重構的進行。
該術語似乎由Kent Beck於90年代後期,在WardsWiki上首次使用。且自從在refactoring. Improving the Design of Existing Code.被提到過,使用率就大大的提高。代碼異味同時也是敏捷開發者常用的術語。
什麼是,或者不是代碼異味,是一個主觀的判斷,通常因語言、開發者、開發方法的不同而不同。對於Java開發語言,有些工具,比如Checkstyle、PMD和 FindBugs可以自動檢測一些代碼異味。
常見的代碼異味
重複代碼: 相同或者相似的代碼存在於一個以上的地方。
常方法: 一個非常長的方法、函式或者過程。
巨類: 一個非常龐大的類。
太多的參數: 函式或者過程的冗長的參數列表使得代碼可讀性和質量非常差。
特性依戀: 一個類過度的使用另一個類的方法。
親密關係: 一個類依賴另一個類的實現細節。
拒絕繼承: 子類以一種‘拒絕’的態度,覆蓋基類中的方法,換句話說,子類不想繼承父類中的方法,參考Liskov substitution principle。
冗餘類 / 寄生蟲: 一個功能太少的類。
人為的複雜: 在簡單設計已經滿足需求的時候,強迫使用極度複雜的設計模式。
超長標識符: 尤其,在軟體工程中,應該毫無保留的使用命名規則來消除歧義。
超短標識符: 除非很明顯,一個變數名應該反映它的功用。
過度使用字面值: 為提高可讀性和避免編碼錯誤,應該使用命名常量。此外,字面值可以且應該在可能的情況下,獨立存放於資源檔案或者腳本中,在軟體部署到不同區域時,可以很方便的本地化。