天天看點

代碼重複檢查工具——python的使用CPD比較好用,clone digger針對py2,其他有名的如Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro

代碼重複檢測:

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

授權類型

商用,可免費

開源

推薦星級

**

***

*

怎麼消除重複代碼?

《代碼大全》在第七章“高品質的子程式”中指出,建立子程式是消除重複代碼的有效方法。

在《重構——改善既有代碼的設計》一書中,建議如下方法消除重複代碼:

提取類,如果多個類中含有相同或相似的成員變量,方法,可以定義一個新的類來實作這些功能。原有的類可以作為子類繼承。

提取函數,如果多個類中含有相同或相似的方法,可以把這些方法集中到新的類,供其他類調用。

替換函數,相同或相似的代碼可以通過調用實作該功能的函數來實作。