refactoring - VB 的代码重复重构工具

标签 refactoring code-duplication

我需要一个非常具体的 VB(或多语言)工具。我想在我自己开始制作一个(可能是用 python )之前,先问一下是否已经存在。

我需要什么:

  • 该工具必须以递归或非递归方式抓取路径,搜索扩展名列表,例如 .bas、.frm、.xxx
  • 然后,它必须解析该文件,搜索函数、例程等。
  • 最后,它必须输出它发现的内容。

我基于“减少代码冗余”的想法,在这样的情况下,糟糕的程序员创建了很多做同样事情的函数,有时具有相同的名称,有时则不同。有4种情况:

  • 情况 1:相同名称、相同内容。
  • 情况 2:名称相同,内容不同。
  • 情况 3:名称不同,内容相同。
  • 情况 4:差异名称、差异内容。

所以,输出应该是这样的

===========================================================================
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:是的,我们首先应该编写好的代码,但是,你知道,事情总会发生。

最佳答案

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

市面上有各种各样的检测器,在尝试构建自己的检测器之前,您应该了解它们的工作原理。

有些只是简单地匹配行以实现完全等效。虽然这些演示了基本思想,但它们的检测效果不佳,因为它们没有考虑到克隆代码通常存在变化的事实;人们真正做的是在制作副本时进行克隆和编辑。

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

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

参见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 比人们想象的像 Visual Basic 这样的“简单”(!)语言要复杂得多)。

关于refactoring - VB 的代码重复重构工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623202/

相关文章:

database - 重构数据库过程的最佳方法是什么?

python - 使用 SQLite3 + Mutagen 优化 Python 代码

java - 如何以 Java 8 方式将具有属性的列表转换为另一个列表?

intellij-idea - WebStorm 将重构范围限制为仅当前文件

java - 何时何地调用 EventQueue.invokeLater() 方法

c# - 我如何在 C# 中编写这样的代码生成类?

java - 转换 Java 8 流中的代码

javascript - 重构代码——变量作用域

c++ - 如何打印一堆具有相同格式的整数?

java - 如何测试一个类及其子类