代码重复检查工具——python的使用clone digger,其他有名的如Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro
时间:2019-06-18
本文章向大家介绍代码重复检查工具——python的使用clone digger,其他有名的如Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro,主要包括代码重复检查工具——python的使用clone digger,其他有名的如Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
重复代码检测工具
何谓重复代码
简单说,就是指重复或近似的代码。程序猿在码代码时,往往使用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 |
授权类型 | 商用,可免费 | 开源 | 商用,可免费 | 开源 | 开源 | 商用,可免费 | 开源 |
推荐星级 | ** | *** | ** | * | * | ** | *** |
怎么消除重复代码?
《代码大全》在第七章“高质量的子程序”中指出,创建子程序是消除重复代码的有效方法。
在《重构——改善既有代码的设计》一书中,建议如下方法消除重复代码:
- 提取类,如果多个类中含有相同或相似的成员变量,方法,可以定义一个新的类来实现这些功能。原有的类可以作为子类继承。
- 提取函数,如果多个类中含有相同或相似的方法,可以把这些方法集中到新的类,供其他类调用。
- 替换函数,相同或相似的代码可以通过调用实现该功能的函数来实现。
原文地址:https://www.cnblogs.com/bonelee/p/11045207.html
- 数字图像相关技术DIC分析介绍
- 3种提升云可扩展性的方法
- 用一个命令使用 Docker Compose 安装Mesos
- C语言/C加加新手入门学习经验资料分享,基础知识大汇总!
- 云数据服务蜂拥而至...好难选呀
- ASP.NET MVC的Razor引擎:View编译原理
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
- 自动驾驶车辆在2017年的七大光辉历史时刻
- 简单的实现Javascript的MVC
- 谷歌再出黑科技!人工智能模拟的人声和真人几乎难以分辨
- 【Scikit-Learn 中文文档】高斯混合模型 - 无监督学习 - 用户指南 | ApacheCN
- “E+单拼”组合域名eqi.com小六位结拍
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python-leetcode207-拓扑排序】课程表
- 定时任务最简单的3种实现方法(Java)
- 回顾通用链表(亲测代码示例)
- 【python-leetcode210-拓扑排序】课程表Ⅱ
- Java实现最小生成树算法之Kruskal算法
- 来我们再聊聊 KMP 算法 -- 我懂,你也得懂
- 【pytorch】简单的线性回归
- 简单的并查集的实现
- 【python-leetcode269-拓扑排序】火星字典
- 通俗点聊聊算法 - 排序(3)快速排序,亲测
- springmvc之如何对表单数据进行校验
- 基于TypeScript封装Axios笔记(七)
- 2015年javaB组1-4题解析与理解
- 【matplotlib】绘制散点图
- LeetCode刷题心得 -- map的妙用