RuboCop | Style/CyclomaticComplexity
概要
RuboCopの「Style/CyclomaticComplexity」警告について。
Rubyの循環的複雑度をチェックします。
RuboCopのソースを確認すると、
DECISION_POINT_NODES = [:if, :while, :until, :for, :rescue, :when, :and, :or]
# :
# : 略
# :
on_node(DECISION_POINT_NODES, node) { complexity += 1 }
[:if, :while, :until, :for, :rescue, :when, :and, :or] をキーとして、循環的複雑度を加算しているようです。
※ソース全体が気になる方は以下を参照
https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/cyclomatic_complexity.rb
設定値
Maxに値を設定します。
デフォルトは6です。
CyclomaticComplexity
各設定値での検証結果をまとめます。
検証プログラム
cyclomatic_complexity.rb
def hoge(msg)
return 1 if msg.empty? # => if 1
return 2 unless msg.nil? # => unless 2
case msg
when 'hoge' then 'hoge' # => when 3
when 'hige' then 'hige' # => when 4
when 'hege' then 'hege' # => when 5
else 'other' # => else 6
end
rescue # => rescue 7
raise StandardError, 'error'
end
実行結果 デフォルト の場合
.rubocop.yml
※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい
CyclomaticComplexity:
Max: 6
$ rubocop
Inspecting 1 file
C
Offenses:
cyclomatic_complexity.rb:1:1: C: Cyclomatic complexity for hoge is too high. [7/6]
def hoge(msg)
^^^
1 file inspected, 1 offense detected
実行結果 Max を 7 に変更した場合
.rubocop.yml
CyclomaticComplexity:
Max: 7
$ rubocop
Inspecting 1 file
.
1 file inspected, no offenses detected