识别PHP项目中的重复代码

识别PHP项目中的重复代码,php,refactoring,copy-paste,code-duplication,Php,Refactoring,Copy Paste,Code Duplication,我在一个遗留项目中有一个PHP文件,它至少有几千行长。它主要被一个switch语句分成若干不同的条件块,大约有10个案例。在每种情况下,都有一个非常相似的代码块(如果不是完全重复的话)。对于我来说,有什么方法可以识别这些代码块是相同的——或者接近相同的——这样我就可以提取出这些代码并开始重构整个文件?我知道这在非常手动的条件下是可能的(将代码中的每个case语句分隔成单独的文件和Diff),但我感兴趣的是我可以使用什么工具来加速这个过程 谢谢。您可以使用phpunit PMD(项目混乱检测器)来

我在一个遗留项目中有一个PHP文件,它至少有几千行长。它主要被一个switch语句分成若干不同的条件块,大约有10个案例。在每种情况下,都有一个非常相似的代码块(如果不是完全重复的话)。对于我来说,有什么方法可以识别这些代码块是相同的——或者接近相同的——这样我就可以提取出这些代码并开始重构整个文件?我知道这在非常手动的条件下是可能的(将代码中的每个case语句分隔成单独的文件和Diff),但我感兴趣的是我可以使用什么工具来加速这个过程

谢谢。

您可以使用phpunit PMD(项目混乱检测器)来检测重复的代码块

它还可以计算代码的长度


这是phpuc中pmd选项卡的屏幕截图:

您可以将块放在单独的文件中,然后在它们上运行diff

然而,我认为最终您还是需要手动完成所有工作,因为这段代码听起来需要大量重构,即使存在差异,您也可能需要评估这是故意的还是错误。

您可以使用

phpcpd是PHP代码的复制/粘贴检测器(CPD)。它会扫描PHP项目中的重复代码

其他资源:

    • 查看我们的工具

      尽管重新格式化、插入/删除注释、替换变量名、添加/重放子块等,但这会发现精确副本和未遂事件


      据我所知,PHPCPD只找到完全相同的(令牌)序列。这会遗漏很多克隆,因为复制粘贴之后最常见的操作是编辑以自定义。因此,它将错过OP试图找到的克隆体。

      这就是我所说的手动方法。感谢您的输入,圈复杂度与复制和粘贴代码无关。看看这些文档,我认为它无法检测到这样的重复代码。毫无疑问,这是一个很好的工具。我更新了我的帖子,我觉得现在更清晰了。我还认为phpunit pmd使用phpcpd,不是吗?或者它是另一个实现?我可能被这个(很棒的)UI中的选项卡标签弄糊涂了,它可能会调用多个工具。确实如此。但是结账和其他选择。感谢这些精确性。将此帖子添加到我的收藏夹:-)这看起来是一个很好的起点,也是一个非常方便的工具。谢天谢地,这只检测到重复的PHP语句-我有一个项目,在PHP模板中有数千行重复的HTML,而这个工具实际上只检测到非常少的这些行。停止传播FUD。phpcpd比较时不考虑空格。@cweiske:这意味着它只会找到完全相同的令牌序列,这就是我所说的。它找不到参数化克隆,这些克隆是eh代码被复制粘贴编辑过的克隆。它可能会找到这样的克隆体,但那没有多大帮助。@cweiske:你看过网站上的Joomla报告了吗?它显示了我所说的参数化克隆。在其上运行PHPCPD,并比较结果。我想你会感到惊讶。@cweiske:FWIW,PHPCPD的github网站展示了一个运行60000行代码的示例,其中只找到0.2%的克隆(“精确匹配”),坦白说,根据我十年来为许多语言构建/运行克隆检测器的经验,克隆数量少得可怜;任何规模的大多数代码都有5-20%或更多的差异与检测参数化克隆有关。你可以下载CloneDR,自己试试。