【问题标题】:ABC size too high, even when there are no branches, assignments, or conditionalsABC 大小太高,即使没有分支、赋值或条件
【发布时间】:2017-04-01 21:59:45
【问题描述】:

我对 RuboCop 抱怨的内容感到困惑。

“抽奖的分配分支条件大小太高。[29/15]”

以下方法:

class Ball
  attr_reader :color
  attr_reader :center
  attr_reader :radius
  attr_reader :dir
  attr_reader :x, :y
  attr_reader :w, :h
  attr_accessor :worldWidth
  attr_accessor :worldHeight
  ...
  # Draw the ball into this device context
  def draw(dc)
    dc.setForeground(color)
    dc.fillArc(x, y, w, h, 0, 64 * 90)
    dc.fillArc(x, y, w, h, 64 * 90, 64 * 180)
    dc.fillArc(x, y, w, h, 64 * 180, 64 * 270)
    dc.fillArc(x, y, w, h, 64 * 270, 64 * 360)
  end
  ...

因为这里没有赋值、分支和条件语句!

我错过了什么?无论如何,这个功能有什么不好?不得不改变它似乎很愚蠢,我不清楚它会带来什么“好处”。请澄清!

【问题讨论】:

  • 我不完全理解 ABC(赋值/分支/条件)的工作原理,但您可以从 wikipedia 页面看到函数调用通常被视为分支。 here 是用于确定此分数的 rubocop 源,here 是 rubocop 默认值(默认最大 ABC 分数为 15)。

标签: ruby graphics rubocop


【解决方案1】:

RuboCop 用来计算 ABC 大小的公式是:

sqrt(assignments^2 + branches^2 + condition^2)

消息发送(也称为方法调用)在 RuboCop 中被视为一个“分支”。正如您所指出的,因为在这种情况下没有分配或条件,所以此方法的 ABC 大小由 sqrt(branches^2) 或简单地说 branches 给出。

我们可以通过计算方法中发送的消息来检查这是否正确:

  • 1 x #setForeground
  • 1 x #color
  • 4 x #fillArc
  • 4 x #x
  • 4 x #y
  • 4 x #w
  • 4 x #h
  • 7 x #*

总计 29,这是我们预期的 ABC 大小。


这个函数到底有什么不好呢?不得不改变它似乎很愚蠢,我不清楚它会带来什么“好处”。

不要误以为 RuboCop 是无所不能的。它既不阅读也不理解代码。它没有“更好”代码的概念。它应用了一些(相当原始的)启发式方法,为我们提供了“质量”的代理衡量标准。由我们来解释并决定采取什么行动。

RuboCop 遇到困难的一个常见情况是声明性 DSL。在这些情况下,通常最好禁用崩溃的警察。 RuboCop 提供了不同级别的粒度来执行此操作。您可以使用rubocop:disable CopName(记得再次启用它)、.rubocop.yml 中的文件或目录或同一文件中的整个项目进行内联操作。

【讨论】:

  • 感谢您的回答。我正在开发一个项目,其中 Rubocop 已成为构建过程的一部分。也就是说,如果 Rubocop 不满意,它将导致构建失败。我可能只是为了完成工作而禁用了 Rubocop!再次感谢。
  • @flajann:不客气!您可以在此处找到有关不同配置选项的更多信息:rubocop.readthedocs.io/en/latest/configuration
  • 你让我明白了这一点,这是我以前无法理解的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 2016-04-13
  • 2019-10-17
  • 2021-06-16
  • 2023-04-07
  • 2015-09-05
  • 2017-09-08
相关资源
最近更新 更多