Skip to content

Robocop Assignment Branch Conditions

概要

※この記事は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を使っていて、こんな警告が出て困ったので調べた結果をまとめました。

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

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

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

基準値

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

Metrics/AbcSize:Max:15

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

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

Metrics/AbcSize:Enabled:trueMax: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 : 変数への代入

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

チェック対象項目
ローカル変数への代入
インスタンス変数への代入
クラス変数への代入
グローバル変数への代入
定数への代入
多重代入
自己代入 ,
自己代入(論理演算子) ,

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

例:

Math.new Math.sqrt(3)

(C)ondition : 条件文

下記キーワードが対象:
,,,,,,,

参考

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

Class: RuboCop::Cop::Metrics::AbcSize

Overview

Constant Summary

MSG =
'Assignment Branch Condition size for %s is too high. [%.4g/%.4g]'
BRANCH_NODES =
[:send]
CONDITION_NODES =
CyclomaticComplexity::COUNTED_NODES

Constants included from Util

Util::ASGN_NODES, Util::EQUALS_ASGN_NODES, Util::OPERATOR_METHODS, Util::PROC_NEW_NODE, Util::SHORTHAND_ASGN_NODES

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Method Summary

Methods included from ConfigurableMax

#max=, #parameter_name

Methods included from OnMethodDef

#on_def, #on_defs

Methods inherited from Cop

#add_offense, all, #autocorrect?, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, cop_name_with_namespace, cop_type, #debug?, #display_cop_names?, inherited, #initialize, #join_force?, lint?, #message, non_rails, qualified_cop_name, rails?, #relevant_file?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, block_length, command?, comment_line?, const_name, first_part_of_call_chain, lambda?, lambda_or_proc?, line_range, numeric_range_size, on_node, operator?, parentheses?, proc?, range_with_surrounding_space, source_range, strip_quotes, within_node?

Methods included from PathUtil

issue_deprecation_warning, match_path?, relative_path

This cop checks that the ABC size of methods is not higher than the configured maximum. The ABC size is based on assignments, branches (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric