RuboCopのABC Sizeチェックについて調べた

概要

※この記事はRuboCop v0.28.0が対象です。
https://github.com/bbatsov/rubocop/tree/v0.28.0

Assignment Branch Condition size for method_name is too high. [15.33/15]

RuboCopを使っていて、こんな警告が出て困ったので調べた結果をまとめました。

これはABC Sizeというチェック項目で、かいつまむと

  • Assignment : 変数への代入
  • Branch : メソッド呼び出し
  • Condition : 条件文

上記3項目の合計ポイントをRuboCop君が計算して、基準値を超えると警告が出る、という仕組み。
RuboCopやRuby特有のチェックではなく、Abc Metricといって昔からあるものらしい。
ちなみに、それぞれの頭文字をとってABCとのこと。

基準値

デフォルトは15ポイント。

Metrics/AbcSize:
  # The ABC size is a calculated magnitude, so this number can be a Fixnum or
  # a Float.
  Max: 15

https://github.com/bbatsov/rubocop/blob/v0.28.0/config/default.yml#L539

.rubocop.ymlでチェック有無と基準値の設定変更可能。
Max: 0で驚異のドM設定に。
もちろんMax: 20とかにして緩くすることもできる。

Metrics/AbcSize:
  Enabled: true
  Max: 0

計算方法

※a, b, cはそれぞれのチェック項目内で引っかかった数

Math.sqrt(a**2 + b**2 + c**2).round(2)

https://github.com/bbatsov/rubocop/blob/v0.28.0/lib/rubocop/cop/metrics/abc_size.rb#L22

各チェック項目について

(A)ssignment : 変数への代入

変数への代入箇所の数をチェックする。

チェック対象項目 例
ローカル変数への代入 var = 10
インスタンス変数への代入 @var = 10
クラス変数への代入 @@var = 10
グローバル変数への代入 $var = 10
定数への代入 Bar::Foo = 10
多重代入 foo, bar = 1, 2
自己代入 a += 1,a -= 1
自己代入(論理演算子) a ||= 1,a &&= 1

(B)ranch : メソッド呼び出し

例:

Math.new
Math.sqrt(3)

(C)ondition : 条件文

下記キーワードが対象:
if,while,until,for,rescue,when,and,or

参考

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators