我对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
...
因为这里有没有分配,分支或条件!
我错过了什么?这个功能还有什么不好的呢?不得不改变它似乎很愚蠢,而且我不清楚它会带来什么“好处”。请澄清!
答案 0 :(得分:1)
RuboCop用于计算ABC大小的公式为:
sqrt(assignments^2 + branches^2 + condition^2)
消息发送(a.k.a。方法调用)被认为是一个"分支"在RuboCop中。正如您所指出的那样,在这种情况下没有任何分配或条件,此方法的ABC大小由sqrt(branches^2)
或简称branches
给出。
我们可以通过计算方法中的消息发送来检查这是否正确:
#setForeground
#color
#fillArc
#x
#y
#w
#h
#*
总计29
,这是我们预期的ABC大小。
这个功能到底有什么不好?不得不改变它似乎很愚蠢,而且我不清楚什么"有益于"它会带来。
不要错误地认为RuboCop是无所不能的。它既不会读取也不会理解代码。它并没有“更好”的概念。码。它应用了一些(相当原始的)启发式算法,它为我们提供了质量的代理度量。"由我们来解释并决定采取什么行动。
RuboCop挣扎的常见情况是声明性DSL。在这些情况下,通常最好禁用发生故障的警察。 RuboCop提供不同级别的粒度来实现这一目标。您可以使用rubocop:disable CopName
(请记住再次启用它),在.rubocop.yml
中基于文件或目录,或者在同一文件中使用整个项目。