Cyclomatic Number

概要

各メソッドの最大サイクロマチック数が一定値以下の際に獲得できる実績です.

タイトル (Lv.1) タイトル (Lv.2) タイトル(Lv.3)
Cycle circle Roundabout Quintuple measure
課題 基準値 (Lv.1) 基準値 (Lv.2) 基準値 (Lv.3)
Trial 10以下 5以下 3以下
Lexer 30以下 20以下 10以下
Parser 30以下 20以下 10以下
Checker 30以下 20以下 10以下
Compiler 35以下 25以下 15以下

コード例

class Foo {
  void baseCyclo() {                // Cyclo = 1
    highCyclo();
  }

  void highCyclo() {                // Cyclo = 10
    int x = 0, y = 2;
    boolean a = false, b = true;

    if (a && (y == 1 ? b : true)) { // +3
      if (y == x) {                 // +1
        while (true) {              // +1
          if (x++ < 20) {           // +1
            break;                  // +1
          }
        }
      } else if (y == t && !d) {    // +2
        x = a ? y : x;              // +1
      } else {
        x = 2;
      }
    }
  }
}

サイクロマチック数の計測には,PMDの CyclomaticComplexity を用いています.

注釈

サイクロマチック数Cyclomatic comlexity , 循環的複雑度)とは,Thomas McCabeが開発したもので,プログラムの複雑度を測るのに使われる指標です. プログラムのソースコードから,線形的に独立した経路の数を直接数えることにより計測されます.

if 文や for 文のような分岐のないソースコードの場合,その複雑度は1であり,そのコードには1つの経路しかありません. コードに1つの if 文が含まれていれば,コードには2つの経路があることになります.すなわち,一方は if 文での条件が真となる場合の経路で,もう一方はそれが偽となる場合の経路です. このように,分岐が行われるにつれてサイクロマチック数は上昇していきます.

サイクロマチック数の大きいプログラムは,ソースコードの意味を理解するのに多くの経路を追わなければならず,読解が難しくなります. 従って,サイクロマチック数を低く抑えることが品質の高いソースコードを書くことに繋がります.

参考文献: 循環的複雑度 - Wikipedia