代码重复检查工具——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
输出类似:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ===================================================================== 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 |
授权类型 | 商用,可免费 | 开源 | 商用,可免费 | 开源 | 开源 | 商用,可免费 | 开源 |
推荐星级 | ** | *** | ** | * | * | ** | *** |
怎么消除重复代码?
《代码大全》在第七章“高质量的子程序”中指出,创建子程序是消除重复代码的有效方法。
在《重构——改善既有代码的设计》一书中,建议如下方法消除重复代码:
- 提取类,如果多个类中含有相同或相似的成员变量,方法,可以定义一个新的类来实现这些功能。原有的类可以作为子类继承。
- 提取函数,如果多个类中含有相同或相似的方法,可以把这些方法集中到新的类,供其他类调用。
- 替换函数,相同或相似的代码可以通过调用实现该功能的函数来实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」