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