分析和比较类似功能逻辑的工具?

时间:2012-02-14 16:21:02

标签: c# static-analysis

我最近选择了一个包含大量重复代码的大型代码库。问题是重复的功能不是由同一个人编写的,也不是在他们之间复制的。

那么,是否有可用于比较两个函数的实际逻辑的工具?以下是一些有用的约束。

  • 忽略订单不重要的订单(例如设置属性)
  • 应分析变量名称的相似性,但如果出于相同原因使用,则不需要匹配
  • 深入研究被比较函数调用的其他方法,并将逻辑展平以进行比较

理想情况下,该工具会生成单个函数输出。实际的逻辑差异将以某种方式突出显示。它甚至可以采用一种形式,为逻辑中的差异定义单独的函数,将它们传递给包含相同逻辑的main函数。

这听起来像一个很高的订单,但是有没有人遇到试图做这些事情的工具?

修改

虽然提到了一些很酷的工具,但在比较两种方法的逻辑时,它们看起来并不会将被调用函数的内容考虑在内。如果我不对,请告诉我!

4 个答案:

答案 0 :(得分:6)

如果您下载Visual Studio vNext Ultimate的开发者预览版,它将包含一个新的代码克隆检测功能: http://msdn.microsoft.com/en-us/library/hh205279(v=vs.110).aspx

http://blogs.msdn.com/b/zainnab/archive/2011/12/13/visual-studio-11-developer-preview-code-clone-detection-aka-code-clone-analysis.aspx

开发人员预览Visual Studio的下载链接: http://www.microsoft.com/download/en/details.aspx?id=27543

答案 1 :(得分:5)

如果您有ReSharper,则会有一个ReSharper插件Agent Ralf

特工拉尔夫的主页引用:

  

在某些情况下,两种给定的方法在功能上是等效的(相同的输入产生相同的输出和副作用)但在文本上不等同。例如,两种方法可能仅在局部变量的命名方面有所不同,并且在其他方​​面是相同的。代理Ralph可以检测到这种情况,以及其他类似情况,并确定方法功能相当

答案 2 :(得分:1)

CodeRush上有Duplicate Detection and Consolidation功能。 (http://devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/duplicate_code.xml)

此功能检测到重复的代码。我不确定它是否能够检测/比较类似功能的逻辑。

希望得到这个帮助。

答案 3 :(得分:0)

您可以随时编写自己的代码。这属于正确的单元测试。

如果你的类似函数修改了某个状态实例/类,那么使用反射来测试结果类的属性值是否相等。

如果您的类似功能修改数据库,那么复制数据库就可以在副本上运行每个功能并进行比较。

但这可能都是从适当的单元测试开始的。如果您知道所有可能的“用例”,那么当您发现所有这些“用例”的两个(或更多)函数的输出相同时,您可以安全地保留一个函数并将重复丢弃为不必要的。 / p>

另一个选择是获得代码/函数正在执行的操作的实际要求。了解系统实际尝试完成的内容可以更轻松地重构旧代码或重复代码。


检查逻辑重复的工具只会让您尽可能地工作。如果你说当前的工具没有考虑嵌套函数或调用其他函数的函数,那么为什么不重构代码来内联那些被调用的函数,这样你的工具才能工作?如果你甚至不想将方法A(它调用方法B,C,D)重构为方法AA,而不是将方法A重构为B,C,D中的代码,那么你只是在寻找灵丹妙药。

简称,通过一些“工作”,您可以获得适合您的当前工​​具。您可能希望为开源工具做出贡献,以弥补您提到的失败。