代碼異味
![本頁使用了標題或全文手工轉換](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() | 此條目可參照英語維基百科相應條目來擴充。 |
程序開發領域,代碼中的任何可能導致深層次問題的症狀都可以叫做代碼異味(Code smell)。
通常,在對代碼做簡短的反饋迭代時,代碼異味會暴露出一些深層次的問題,這裡的反饋迭代,是指以一種小範圍的、可控的方式重構代碼。基於這些暴露的問題,人們會進一步的檢查設計和代碼中是否還存在別的代碼異味,然後再做進一步的重構。從負責重構的開發者的角度來看,代碼異味可以啟發何時重構,如何重構。因此,可以說代碼異味推動着重構的進行。
該術語似乎由肯特·貝克於90年代後期,在WardsWiki上首次使用。且自從在Refactoring. Improving the Design of Existing Code.[1]被提到過,使用率就大大的提高。代碼異味同時也是敏捷開發者常用的術語。
什麼是,或者不是代碼異味,是一個主觀的判斷,通常因語言、開發者、開發方法的不同而不同。對於Java開發語言,有些工具,比如Checkstyle、PMD和 FindBugs可以自動檢測一些代碼異味。
常見的代碼異味
- 代碼重複: 相同或者相似的代碼存在於一個以上的地方。
- 長方法: 一個非常長的方法、函數或者過程。
- 巨類: 一個非常龐大的類。
- 太多的參數: 函數或者過程的冗長的參數列表使得代碼可讀性和質量非常差。
- 特性依戀: 一個類過度的使用另一個類的方法。
- 親密關係: 一個類依賴另一個類的實現細節。
- 拒絕繼承: 子類以一種『拒絕』的態度,覆蓋基類中的方法,換句話說,子類不想繼承父類中的方法,參考里氏替換原則。
- 冗餘類 / 寄生蟲: 一個功能太少的類。
- 人為的複雜: 在簡單設計已經滿足需求的時候,強迫使用極度複雜的設計模式。
- 超長標識符: 尤其,在軟件工程中,應該毫無保留的使用命名規則來消除歧義。
- 超短標識符: 除非很明顯,一個變量名應該反映它的功用。
- 過度使用字面值: 為提高可讀性和避免編碼錯誤,應該使用命名常量。此外,字面值可以且應該在可能的情況下,獨立存放於資源文件或者腳本中,在軟件部署到不同區域時,可以很方便地本地化。
參見
引用
- ^ Fowler, Martin. Refactoring. Improving the Design of Existing Code. Addison-Wesley. 1999. ISBN 0-201-48567-2.