【问题标题】:Why does Scrutinizer say "duplicate code" when code is totally different?当代码完全不同时,为什么 Scrutinizer 会说“重复代码”?
【发布时间】:2015-01-01 20:45:52
【问题描述】:

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

【问题讨论】:

  • 这是误报。我非常怀疑审查员在执行此启发式检查时会查看 语义
  • @Sliq 请在审查员标签中添加描述
  • 我看到的唯一共同点是缩进深度,以及每行的第一个标记。
  • @Jasen 这些行都以相同的开头并且具有相对较低的(每行)差异增量。
  • 我在自己的项目中遇到过这种误报行为。也就是说,您可以通过使用一个返回行并删除 if 块来为每个方法节省三行,因此对于第一种方法:return $query->getRowCount() > 0(对于第二种方法,return $query->getRowCount() == 1)。

标签: php scrutinizer


【解决方案1】:

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

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

因此对于克隆检测器,您的代码将如下所示(所有大写文本均已标准化):

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

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

【讨论】:

    【解决方案2】:

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

    checks:
        php:
            duplication: false
    

    【讨论】:

    • 为什么更好?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多