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