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

C# 分析和比较类似功能逻辑的工具?,c#,static-analysis,C#,Static Analysis,我最近选择了一个包含大量重复代码的大型代码库项目。问题是复制的功能不是由同一个人编写的,也不是在他们之间复制的 那么,有没有工具可以用来比较两个函数的实际逻辑?以下是一些有用的约束条件 忽略顺序不重要的顺序(例如设置属性) 应分析变量名称的相似性,但如果出于相同的原因使用,则不要求匹配 深入研究被比较的函数调用的其他方法,并展平用于比较的逻辑 理想情况下,该工具将生成单个函数输出。实际的逻辑差异将以某种方式突出显示。它甚至可以是一种为逻辑中的差异定义单独函数的形式,将它们传递到包含相同逻辑的

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

那么,有没有工具可以用来比较两个函数的实际逻辑?以下是一些有用的约束条件

  • 忽略顺序不重要的顺序(例如设置属性)
  • 应分析变量名称的相似性,但如果出于相同的原因使用,则不要求匹配
  • 深入研究被比较的函数调用的其他方法,并展平用于比较的逻辑
理想情况下,该工具将生成单个函数输出。实际的逻辑差异将以某种方式突出显示。它甚至可以是一种为逻辑中的差异定义单独函数的形式,将它们传递到包含相同逻辑的主函数中

这听起来是一个很高的要求,但是有没有人遇到过尝试做这些事情的工具

编辑


虽然提到了一些很酷的工具,但在比较两个方法的逻辑时,它们中的任何一个都不会考虑被调用函数的内容。如果我错了,请让我知道

如果下载Visual Studio vNext Ultimate的开发者预览版,它将包含一个新的代码克隆检测功能:

开发人员预览Visual Studio的下载链接:

CodeRush上有重复检测和整合功能。(http://devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/duplicate_code.xml)

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


希望有此帮助。

如果您有ReSharper,则有一个ReSharper插件

代理Ralf主页的报价:

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


您可以自己编写代码。这属于适当的单元测试

如果类似的函数修改某些状态实例/类,则使用反射来测试结果类的属性值是否相等

如果类似的函数修改了数据库,则制作数据库的副本,并在副本上运行每个函数并进行比较

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

另一个选择是获取代码/函数所做工作的实际需求。了解系统实际要完成的工作,可以使重构旧的或重复的代码变得更加容易


检查逻辑复制的工具只会带您到您愿意工作的地方。如果您说当前的工具没有考虑嵌套函数或调用其他函数的函数,那么为什么不重构代码来内联这些被调用的函数,以便您的工具能够工作呢?如果您甚至不想将方法a(调用方法B、C、D)重构为方法AA,而方法AA是B、C、D的代码行,那么您只是在寻找灵丹妙药


简而言之通过一些“工作”,您可以使用当前的工具。您可能希望为开源工具做出贡献,以弥补您提到的不足

我认为这样的“工具”是存在的,它是一个人类程序员:)@vulkanino:这意味着你会来为我分析代码吗?我只需要花50-200美元一次,就可以随时使用这个“工具”?:)我的成本更高,但你肯定会在VWorker上找到一个更便宜的“工具”;)如果你用谷歌搜索的话,有很多工具。我看到Simian在成绩表上高居榜首。试试其中的一些,看看它们是否满足你的需要。不过,我怀疑他们中的任何一个能达到你想要的程度。@DBM:这正是我的问题。所有的工具似乎都停留在它们开始的功能级别。我真正需要的是能够深入研究子函数的东西。这看起来非常接近。希望我能有机会尝试一下,除非我遗漏了什么,否则这和其他工具一样困难——它不会检查被调用函数中的代码。(因此,如果函数A调用B、C和D,那么B、C和D中的代码与函数A和Z的比较无关。)我不知道为什么这个答案被高估了,更不用说用悬赏标记了。Visual studio克隆检测器匹配令牌序列。它无法可靠地找到函数边界,更不用说解析代码,找出名称和类型,或者确定函数是否相似。它将查找复制并粘贴的代码;OP明确地说他想要匹配的代码没有被复制和粘贴。你的答案的主旨是假设函数是相同的。但是,我知道函数是不同的,我正在寻找相似之处。当然,我可以重构代码,使工具能够轻松地完成它们所能做的事情。但是到那时,我已经完成了大部分的工作——这不是找一个工具来完成它的目的吗?“做一些工作”?你真的这么做了吗?我完全认为你错了。@Ira Baxter-我是否“重构了旧的/遗留的函数,这些函数是成千上万行BOOLshit外包代码,它们似乎都以完全迂回的方式完成类似的任务”?是的,是的,我有,而且