VB的代码重复重构工具

时间:2010-09-02 01:20:32

标签: refactoring code-duplication

我需要一个非常特定的VB(或多语言)工具。在我开始制作一个之前(我可能会在python中),我想我会问是否已经存在。

我需要什么:

  • 该工具必须爬行,递归或不爬行,路径,搜索扩展名列表,例如.bas,.frm,.xxx
  • 然后,它必须解析这些文件,搜索函数,例程等。
  • 最后,它必须输出它找到的内容。

我的理念基于“减少代码冗余”的想法,在这种情况下,糟糕的程序员会创建大量功能来执行相同的操作,有时使用相同的名称,有时不会。有4个案例:

  • 案例1:名称相同,内容相同。
  • 案例2:相同名称,差异内容。
  • 案例3:差异名称,相同内容。
  • 案例4:Diff名称,Diff内容。

所以,输出应该是这样的

===========================================================================
RESULT
===========================================================================
Errors:
---------------------------------------------------------------------------
==Name, ==Content --> 3: (Func(), Foo(), Bar()) In files (f,f2,f3)
!=Name, ==Content --> 2: (Func() + Func1(), Bar() + Bar1()) In Files (f4)

---------------------------------------------------------------------------
Warnings:
==Name, !=Content --> 1 (Foobar()) In Files (f19)

---------------------------------------------------------------------------

这是为了让您了解我的需求。

所以,问题是:是否有任何工具可以实现与此类似的东西???

P.S:是的,我们应该先编写好的代码,但是,你知道,事情发生了。

1 个答案:

答案 0 :(得分:3)

你想要的是“克隆探测器”。这些工具可在大量指定文件中查找复制和粘贴的代码。克隆不仅仅是功能;它们可以是代码块,数据声明等。

那里有各种各样的探测器,在您尝试构建自己的探测器之前,您应该知道它们是如何工作的。

有些人只是简单地匹配线条来确定等价。虽然这些证明了基本思想,但它们的检测并不好,因为它们没有考虑到克隆代码经常有变化的事实;人们真正做的是复制时的克隆和编辑。

langauge标记的一些匹配序列,例如标识符,关键字,文字,标点符号。这些至少相对容忍空白变化。他们可以找到单个令牌替代单个令牌的克隆。但是,因为他们不理解语言 structure (块,语句,函数体),所以它们经常匹配跨越这种结构边界的序列(例如,“} {”通常被这些工具视为克隆) ,它们产生相当高的(非)克隆的假阳性适应症。其中一些尝试将匹配限制为关键程序结构,例如完整函数,正如您所建议的那样。

更复杂的探测器与程序结构相匹配。 我们CloneDR(我是原作者)是一个探测器 使用编译器质量的解析来抽象语法树,它提取代码的精确结构。它为许多语言(包括VB6和VBScript)执行此操作,将克隆定位为任意函数,块,语句或声明,参数显示克隆的变化方式。尽管格式更改,注释位置或内容的更改,甚至复杂构造(多个语句或表达式)已被用作简单构造(例如,单个语句或文字)的替代,CloneDR仍可以找到克隆。虽然它往往具有较高的检测率(通常可以找到10-20%的可移动冗余!),但其误报率往往远低于基于令牌的检测器。您可以查看示例报告 上面的链接有各种不同的语言。

请参阅明确讨论不同方法和优点的Comparison and Evaluation of Code Clone Detection Techniques and Tools: A Qualitative Approach,并比较包括CloneDR在内的大量探测器。

编辑2010年10月:...当我第一次写这篇回复时,我认为OP对VB.net很感兴趣,CloneDR没有这样做。我们已经为CloneDR添加了VB.net,VB6和VBScript功能。 (解析VB.net的现代形式比人们想象的“简单”(!)langauge(如Visual Basic)要麻烦得多。