是否有工具可以自动在一组文件中找到复制和粘贴代码?
我正在考虑为此编写一个脚本,它只会搜索相同的字符串,但是这样的脚本会发现大多数不相关的等式.(如private final static ...).
我正在寻找与语言无关的代码复制工具.很容易找到特定于语言的代码复制工具(用于Java,C,PHP,...),但我想在自定义语法中对模板运行一些代码复制分析.
我不关心语法的高级解析,只是基于直线的原始字符串比较是好的.空白不敏感匹配将是一个加号,但不是必需的.(我自己规范化/消除空白并不难.)
有没有人知道可以(误)用于这样的工具?
谢谢.
language-agnostic code-analysis static-analysis code-duplication duplicates
我目前正在审查一个非常古老的C++项目,并在那里看到许多代码重复.
例如,有一个包含5个MFC消息处理程序的类,每个消息处理程序包含10行相同的代码.或者,每个地方都有一个5行代码段用于非常具体的字符串转换.在这些情况下,减少代码重复不是问题.
但我有一种奇怪的感觉,我可能会误解某些东西,并且最初有这种重复的原因.
什么可能是重复代码的正当理由?
有没有人有一些工具或一些推荐的练习如何找到一段与其他代码类似的代码?
我经常写一个函数或一个代码片段,我记得我之前已经编写了类似的东西,我想重用以前的实现,但是使用纯文本搜索并没有透露任何东西,因为我没有使用变量名称完全一样.
具有相似的代码片段会导致不必要的代码重复,但是如果代码库很大,则无法将所有代码保留在内存中.是否有任何工具可以对代码进行某些分析,并在功能方面标记片段或功能"相似"?
考虑以下示例:
float xDistance = 0, zDistance = 0;
if (camPos.X()<xgMin) xDistance = xgMin-camPos.X();
if (camPos.X()>xgMax) xDistance = camPos.X()-xgMax;
if (camPos.Z()<zgMin) zDistance = zgMin-camPos.Z();
if (camPos.Z()>zgMax) zDistance = camPos.Z()-zgMax;
float dist = sqrt(xDistance*xDistance+zDistance*zDistance);
Run Code Online (Sandbox Code Playgroud)
和
float distX = 0, distZ = 0;
if (cPos.X()<xgMin) distX = xgMin-cPos.X();
if (cPos.X()>xgMax) distX = cPos.X()-xgMax;
if (cPos.Z()<zgMin) distZ = zgMin-cPos.Z();
if (cPos.Z()>zgMax) distZ = cPos.Z()-zgMax;
float dist = sqrt(distX*distX +distZ*distZ);
Run Code Online (Sandbox Code Playgroud)
在我看来,这已经被多次询问和回答:
我建议在这里关闭重复.
实际上我认为这是一个更普遍的搜索问题,如:如何在StackOverflow上询问问题?
我最近对我在项目代码库中出现的问题越来越感到沮丧.
我正在开发一个拥有> 1M行代码的大型java项目.接口和类结构设计得非常好,编写代码的工程师非常精通.问题在于,为了使代码更清晰,人们在需要重用某些功能时编写实用程序类,随着时间的推移,随着项目的增长,越来越多的实用程序方法出现.但是,当下一位工程师遇到对相同功能的需求时,他无法知道有人已在代码中的某处实现了实用程序类(或方法),并在另一个类中实现了该功能的另一个副本.结果是大量代码重复和太多具有重叠功能的实用程序类.
我们作为一个团队可以实施任何工具或任何设计原则,以防止实用程序类的重复和低可见性吗?
示例:工程师A有3个位置需要将XML转换为String,因此他编写了一个名为XMLUtil的实用程序类,并toString(Document)在其中放置一个静态方法.工程师B有几个地方将文档序列化为各种格式,包括String,因此他编写了一个名为SerializationUtil的实用程序类,并且有一个名为static的方法serialize(Document),它返回一个String.
请注意,这不仅仅是代码复制,因为上述示例的2个实现很可能是不同的(例如,一个使用变换器API而另一个使用Xerces2-J),因此这可以被视为"最佳实践" "问题也是......
更新:我想我更好地描述了我们开发的当前环境.我们使用Hudson进行CI,使用Clover进行代码覆盖,使用Checkstyle进行静态代码分析.我们使用敏捷开发,包括日常会谈和(可能不充分)代码审查.我们在.util中定义了所有的实用程序类,由于它的大小现在有13个子包,在根(.util)类下有大约60个类.我们还使用第三方库,例如大多数apache commons jar和一些组成Guava的罐子.
我很肯定,如果我们让某人完成重构整个软件包的任务,我们可以减少一半的公用事业,我想知道是否有任何工具可以降低成本,并且有任何方法可以可以尽可能地延迟重复出现的问题.
假设我在两个不同的命名空间中定义了方法:
namespace foo
{
void print()
{
//do work...
}
}
namespace bar
{
void print()
{
//do work...
}
}
Run Code Online (Sandbox Code Playgroud)
该foo::print()和bar::print()功能是完全平等的.我的项目使用了这些函数的大量调用.
有没有办法删除其中一个print()定义而不更改这些函数的调用?我的意思是类似下面的东西(当然,C++语言不允许这种结构,它只是一个例子):
namespace foo, bar //wrong code!
{
void print()
{
//do work...
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有办法按我的意愿重构代码,请告诉我,你喜欢以下决定吗?如果您的项目包含此类代码,您会感到高兴吗?:)
namespace foo
{
void print()
{
//do work...
}
}
namespace bar
{
void print()
{
foo::print();
}
}
Run Code Online (Sandbox Code Playgroud)
加:
谢谢你们,我对你的答案非常满意.我想让你澄清一下:using ::foo::print和之间有区别using foo::print吗?
我想知道是否有可能要求java方法参数是有限类型的任何类型.例如 - 我使用的库中有两个(或更多)类型具有常用方法,但它们在类型层次结构中的最低共同祖先是Object.我的意思是:
public interface A {
void myMethod();
}
public interface B {
void myMethod();
}
...
public void useMyMethod(A a) {
// code duplication
}
public void useMyMethod(B b) {
// code duplication
}
Run Code Online (Sandbox Code Playgroud)
我想避免代码重复.我的想法是这样的:
public void useMyMethod(A|B obj){
obj.myMethod();
}
Run Code Online (Sandbox Code Playgroud)
java中已有类似的语法类型.例如:
try{
//fail
} catch (IllegalArgumentException | IllegalStateException e){
// use e safely here
}
Run Code Online (Sandbox Code Playgroud)
显然这是不可能的.如何使用这种类型的不可编辑类型层次结构来实现设计良好的代码?
我已经在互联网上搜索了一段时间,但我找不到任何可以分析一组Perl文件(模块或脚本)并标记重复或克隆或复制/的免费(或便宜)工具/实用程序/模块粘贴的代码.
我现在好多了,但我过去常常复制和粘贴代码段.我想清理它并修复我的旧代码重复,但是一点点的工具帮助将会受到赞赏,所以我不需要用细齿梳子来完成我所有的旧代码.此外,手动识别此类攻击很容易出错.
我希望能够快速了解我们有多少"复制和粘贴"编码,有很多工具可供C#/ Java检查这类事情.有没有这样的工具可以很好地与VB.NET一起使用?
(我已经看到了很多重复的代码,但希望得到一些数字来帮助我做出整理的情况)
进展更新.
我刚试过西安.
Clone Doctor不支持VB.NET(仅限C#和VB 6以及其他许多)
2010年10月:VB.net添加到CloneDR支持的语言
Visual Studio的Clone Detective仅支持C#
SolidSDD - 源代码复制检测器仅支持C,C++,C#和Java
DuplicateFinder是开源的,但看起来非常像Simian,例如它只适用于文本行
ConQAT - 持续质量评估工具包 似乎有一个适用于VB.NET的克隆检测器(尚未尝试过)
Gendarme有点像FXCop并且有一个AvoidCodeDuplicatedInSameClassRule规则,这看起来非常有前景,因为它避免了在文本级别工作的问题. 刚尝试过,它是迄今为止最好的解决方案,遗憾的是它不会搜索范围更广.
在声称这个问题是重复之前,请检查另一个问题是否适用于VB.NET,因为许多适用于C#的工具对VB.NET来说效果不佳.(但如果这个问题真的重复,我不会感到惊讶)
来自静态编程语言背景,我想知道如何最好地在Python中进行模拟.我习惯于依赖注入.在测试中,模拟被创建并传递给被测系统(SUT).但是,看看Mock和Python的其他模拟框架,它似乎是类型/函数/等.模块中的模块在逐个测试的基础上被替换.
特别是,对于Mock,每个单元测试的顶部你会说出@patch('some.type.in.the.module.under.test')每种类型/功能/等.你想嘲笑 在测试的一生中,这些东西被嘲笑,然后它们被还原.不幸的是,在测试中,灯具非常接近相同,你最终会@patch一遍又一遍地重复你的es.
我想要一种方法来跨单元测试共享补丁集合.我还希望以可组合的方式对夹具进行调整.我可以使用上下文管理器而不是装饰器.
code-duplication ×10
c++ ×2
copy-paste ×2
java ×2
clone ×1
duplicates ×1
maintenance ×1
mocking ×1
namespaces ×1
patch ×1
perl ×1
python ×1
search ×1
usability ×1
vb.net ×1