Php 为什么审查者会说;重复代码“;当代码完全不同时?

Php 为什么审查者会说;重复代码“;当代码完全不同时?,php,scrutinizer,Php,Scrutinizer,当这两种方法完全不同时,为什么监查者会说“重复代码”?这是一个假阳性,还是审查者真的希望以一种更抽象的方式看到这一点 我的猜测是,它们执行所谓的“规范化”,即将文本拆分为更小的部分(称为标记),然后将其中一些标记替换为不同的文本,使它们完全相同。例如,所有数字和字符串都被规范化为相同的数字/字符串 这可以确保您可以找到只在文字上不同的克隆,这很有帮助,因为这通常意味着您可以提取一个实用方法,将这些不同的文字作为参数,从而减少代码中的冗余 因此,对于克隆检测器而言,您的代码将如下所示(所有大写文本

当这两种方法完全不同时,为什么监查者会说“重复代码”?这是一个假阳性,还是审查者真的希望以一种更抽象的方式看到这一点


我的猜测是,它们执行所谓的“规范化”,即将文本拆分为更小的部分(称为标记),然后将其中一些标记替换为不同的文本,使它们完全相同。例如,所有数字和字符串都被规范化为相同的数字/字符串

这可以确保您可以找到只在文字上不同的克隆,这很有帮助,因为这通常意味着您可以提取一个实用方法,将这些不同的文字作为参数,从而减少代码中的冗余

因此,对于克隆检测器而言,您的代码将如下所示(所有大写文本都已规范化):

这两个函数都将被规范化为完全相同的表示形式,克隆检测器随后会将其作为重复代码提取

对于您的代码,我所看到的唯一明智的重构是提取一个helper函数,该函数处理准备和执行查询以及返回行计数:

public function executeRowCountQuery($query_string, $query_variables) {
    $query = this->database->prepare($query_string);
    $query->execute($query_variables);
    return $query->rowCount();
}

如果您有许多只对行计数感兴趣的不同查询,那么这可能是有意义的。

最好在.scrutnizer.yml中完全禁用验证

checks:
    php:
        duplication: false

这是假阳性。我非常怀疑Scrutnizer在执行此启发式检查时是否会查看语义。@Sliq请在Scrutnizer标记中添加一个描述我看到的最常见的事情是缩进深度,以及每行的第一个标记。@Jasen所有行的开头都相同,并且相对较低(每行)差异三角洲。我在自己的项目中有过这种假阳性行为。也就是说,每个方法都可以保存三行,只需有一个返回行,并删除
if
块,因此对于第一个方法:
return$query->getRowCount()>0
(对于第二个方法,
return$query->getRowCount()==1
),为什么更好?
checks:
    php:
        duplication: false