代碼重復檢測:
cpd --minimum-tokens 100 --files g:\source\python\ --language python >log.txt
輸出類似:
===================================================================== Found a 381 line (1849 tokens) duplication in the following files: Starting at line 24 of xxxxalysis\policy_analysis.py Starting at line 30 of xxxxxis\policy_analysis_cluster_1.py logger = None logger_running = None COUNT = 2 SRC_IP = 0 SRC_PORT = 0 DEST_IP = 0 DEST_PORT = 0 PROTOCOL = 0 COMMAND = 0 COMMAND_ARGUMENT = 0 FATHER_PID = 0
重復代碼檢測工具
何謂重復代碼
簡單說,就是指重復或近似的代碼。程序猿在碼代碼時,往往使用CP(copy and paste)大法,飛快的完成開發任務。不經意間代碼中充斥着大量的重復、相似的代碼。重復代碼不僅讓代碼量大增,造成編譯速度慢,而且占用大量存儲空間,更嚴重的后果是造成了代碼可維護性差,代碼質量下降。
重復可能是軟件中一切邪惡的根源,許多原則與實踐規則都是為了控制與消除重復而創建。……軟件開發領域的所有創新都是不斷在嘗試從源代碼中消除重復。——《代碼整潔之道》 馬丁
重復代碼都有哪些類型?
最簡單明了的是完全一樣的代碼片段。此外,還有如下類型的重復代碼:
- 類型Ⅰ,代碼片段中除了空格、注釋以及換行以外的內容完全一致
- 類型Ⅱ,代碼片段中除了空格、注釋、換行以及變量名以外的內容完全一致
- 類型Ⅲ,代碼片段中除了空格、注釋、換行以及變量名以外的語句可能有增刪改,功能不變
- 類型Ⅳ,兩個或更多個代碼段執行相同的運算,但通過不同的語法和變量來實現。
不同的重復代碼檢測工具,由於在實現算法上有所不同,其所能檢測的重復代碼類型也不盡相同,如下表所示。
名稱 | Simian | PMD-CPD | CloneDR | CCCD | CCFinder | Bauhaus | CodePro |
---|---|---|---|---|---|---|---|
檢測類型 | Ⅰ | Ⅰ,Ⅱ | Ⅰ,Ⅱ | Ⅰ,Ⅱ | Ⅰ | Ⅰ,Ⅱ,Ⅲ | Ⅰ,Ⅱ,Ⅲ |
支持語言 | C/C++,Java | C/C++,Java | C/C++,Java | C,Java | C/C++,Java | C/C++,Java | Java |
授權類型 | 商用,可免費 | 開源 | 商用,可免費 | 開源 | 開源 | 商用,可免費 | 開源 |
推薦星級 | ** | *** | ** | * | * | ** | *** |
怎么消除重復代碼?
《代碼大全》在第七章“高質量的子程序”中指出,創建子程序是消除重復代碼的有效方法。
在《重構——改善既有代碼的設計》一書中,建議如下方法消除重復代碼:
- 提取類,如果多個類中含有相同或相似的成員變量,方法,可以定義一個新的類來實現這些功能。原有的類可以作為子類繼承。
- 提取函數,如果多個類中含有相同或相似的方法,可以把這些方法集中到新的類,供其他類調用。
- 替換函數,相同或相似的代碼可以通過調用實現該功能的函數來實現。