2017-04-01 52 views
2

我很困惑RuboCop在抱怨什麼。ABC大小太高,即使沒有分支,分配或條件

「爲拉伸分配分支條件大小過高[一十五分之二十九]。」

爲下述方法:

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

我不完全瞭解ABC(作業/分支/條件)的工作原理,但您可以從[wikipedia](https://en.wikipedia.org/wiki/ABC_score)頁面看到函數調用通常會被處理作爲分支。 [這裏](https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/metrics/abc_size.rb)是決定這個分數的rubocop來源,[here](https:// github.com/bbatsov/rubocop/blob/master/config/default.yml)是rubocop默認值(默認的最大ABC分數是15)。 –

回答

0

RuboCop使用來計算ABC大小的公式爲:

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

信息發送(也稱爲方法調用)在RuboCop被認爲是一個「分支」。正如您所指出的那樣,由於在這種情況下沒有分配或條件,因此此方法的ABC大小由sqrt(branches^2)或簡單地branches給出。

我們可以檢查,這是正確的通過計數所述消息發送的方法,包括:

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

用於總計的29,這是ABC大小我們預期。


什麼是壞對這個功能呢?要改變它似乎很愚蠢,我不清楚它會帶來什麼「好處」。

不要犯RuboCop萬能的錯誤。它既不讀取也不理解代碼。它沒有「更好」代碼的概念。它應用了一些(相當原始的)啓發式方法,它爲我們提供了一個「質量」的替代指標。我們需要解釋並決定採取什麼行動。

RuboCop掙扎的一種常見情況是聲明式DSL。在這些情況下,通常最好禁用那些破壞的警察。 RuboCop提供不同級別的粒度來完成此操作。您可以使用rubocop:disable CopName(請記住重新啓用它),在文件或目錄的基礎上,使用.rubocop.yml或同一文件中的整個項目進行內聯。

+0

謝謝你的回答。我正在研究一個項目,Rubocop已經成爲構建過程的一部分。也就是說,如果Rubocop不開心,它會失敗。爲了完成工作,我可能會禁用Rubocop! 再次感謝。 – flajann

+0

@ flajann:不客氣!您可以在這裏找到有關不同配置選項的更多信息:http://rubocop.readthedocs.io/en/latest/configuration/ – Drenmi