当代码完全不同时,为什么Scrutinizer会说“重复代码”?

时间:2015-01-01 20:45:53

标签: php scrutinizer

当这两种方法完全不同时,为什么Scrutinizer会说“重复代码”?这是假阳性还是审核者确实想以更抽象的方式看待这一点?

enter image description here

2 个答案:

答案 0 :(得分:3)

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

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

因此,对于克隆检测器,您的代码将看起来像这样(所有大写文本都已标准化):

public function IDENTIFIER($VARIABLE1) {
    $VARIABLE2 = $this->database->prepare(STRING);
    $VARIABLE2->execute(ARRAY_EXPRESSION);
    if ($VARIABLE2->rowCount() == INTEGER) {
        return BOOLEAN;
    }
    return BOOLEAN;
}

这两个函数将被归一化为这个完全相同的表示,然后克隆检测器会将其作为重复代码进行选择。

我能为您的代码看到的唯一明智的重构是提取一个辅助函数来处理准备和执行查询并返回行数:

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

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

答案 1 :(得分:1)

最好在.scrutinizer.yml中禁用验证

checks:
    php:
        duplication: false