4

当这两种方法完全不同时,为什么 Scrutinizer 会说“重复代码”?这是误报还是 Scrutinizer 确实希望以更抽象的方式看到这一点?

在此处输入图像描述

4

2 回答 2

3

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

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

所以对于克隆检测器,你的代码看起来像这样(所有大写文本都被规范化):

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();
}

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

于 2015-03-27T16:18:25.080 回答
1

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

checks:
    php:
        duplication: false
于 2016-04-03T12:08:48.453 回答