代碼重複檢測:
cpd --minimum-tokens 100 --files g:\source\python\ --language python >log.txt
輸出類似:
重複代碼檢測工具
何謂重複代碼
簡單說,就是指重複或近似的代碼。程式猿在碼代碼時,往往使用cp(copy and paste)大法,飛快的完成開發任務。不經意間代碼中充斥着大量的重複、相似的代碼。重複代碼不僅讓代碼量大增,造成編譯速度慢,而且占用大量存儲空間,更嚴重的後果是造成了代碼可維護性差,代碼品質下降。
重複可能是軟體中一切邪惡的根源,許多原則與實踐規則都是為了控制與消除重複而建立。……軟體開發領域的所有創新都是不斷在嘗試從源代碼中消除重複。——《代碼整潔之道》 馬丁
重複代碼都有哪些類型?
最簡單明了的是完全一樣的代碼片段。此外,還有如下類型的重複代碼:
類型Ⅰ,代碼片段中除了空格、注釋以及換行以外的内容完全一緻
類型Ⅱ,代碼片段中除了空格、注釋、換行以及變量名以外的内容完全一緻
類型Ⅲ,代碼片段中除了空格、注釋、換行以及變量名以外的語句可能有增删改,功能不變
類型Ⅳ,兩個或更多個代碼段執行相同的運算,但通過不同的文法和變量來實作。
不同的重複代碼檢測工具,由于在實作算法上有所不同,其所能檢測的重複代碼類型也不盡相同,如下表所示。
<col>
名稱
simian
pmd-cpd
clonedr
cccd
ccfinder
bauhaus
codepro
檢測類型
Ⅰ
Ⅰ,Ⅱ
Ⅰ,Ⅱ,Ⅲ
支援語言
c/c++,java
c,java
java
授權類型
商用,可免費
開源
推薦星級
**
***
*
怎麼消除重複代碼?
《代碼大全》在第七章“高品質的子程式”中指出,建立子程式是消除重複代碼的有效方法。
在《重構——改善既有代碼的設計》一書中,建議如下方法消除重複代碼:
提取類,如果多個類中含有相同或相似的成員變量,方法,可以定義一個新的類來實作這些功能。原有的類可以作為子類繼承。
提取函數,如果多個類中含有相同或相似的方法,可以把這些方法集中到新的類,供其他類調用。
替換函數,相同或相似的代碼可以通過調用實作該功能的函數來實作。