ABC大小太高,即使没有分支,分配或条件

时间:2017-04-01 21:59:46

标签: ruby graphics rubocop

我对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
  ...

因为这里有没有分配,分支或条件!

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

1 个答案:

答案 0 :(得分:1)

RuboCop用于计算ABC大小的公式为:

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

消息发送(a.k.a。方法调用)被认为是一个"分支"在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中基于文件或目录,或者在同一文件中使用整个项目。