RuboCop の cyclomatic complexity too high への対処法

2023.08.05 に更新記事は 3 分で読めます
サムネイル画像

こんにちは、Syuu( @syuu_n18)です。

この記事では最近遭遇した RuboCop での Metrics/CyclomaticComplexity: Cyclomatic complexity too high というエラーが発生した際の対処法について解説していきます。

同じように悩まれているかたのお力になれれば幸いです!

それでは解説していきます。

結論

まず最初に結論として、これは発生箇所のメソッド内での複雑度が高いために発生するエラーです。

解決策としてはメソッド内の処理を別のメソッドへ切り出す、もしくはリファクタリングをおこない書き方を工夫するすることで解決が可能です。

例えば Controller でこのエラーが発生しているのであれば、Model へコードの一部を別のメソッドとして切り出し該当部分の複雑度を下げるなどですね。

解説

結論で「発生箇所のメソッド内での複雑度が高い」と書きました。
ではなにを基準に複雑度が決められているのでしょうか?

それはエラー内容にある CyclomaticComplexity 、日本語でいうと循環的複雑度というメソッドの複雑度を数値で表す指標で評価されています。

具体的にはコード内にある if, while, until, for, rescue, when, and, or を1つとカウントし、それらの合計が複雑度となります。

そして、算出された複雑度が .rubocop.yml で定義してある CyclomaticComplexity の許容数と比較され、それより大きい場合は複雑性が高いと判断されエラーが発生します。

以下のようなコードでは複雑度が 7 を超えてしまいエラーとなってしまうわけですね。

  def test(num)
    return '0' unless num # unless 1
    case num
    when 1 then '1' # when 2
    when 2 then '2' # when 3
    when 3 then '3' # when 4
    when 4 then '4' # when 5
    when 5 then '5' # when 6
    when 6 then '6' # when 7
    else '10'  # else 8
    end
  end

公式ドキュメントによるとデフォルトの設定では MAX: 7 と定義されているようです。

ここまで読んでいただきありがとうございました!
この記事をもとに問題を解決できましたらとても嬉しく思います。

プロフィールアイコン

Syuu

フロントエンドが好きなWEBエンジニア Next.js / React / TypeScript

SHARE