サイクロマティック複雑度
開発者に複雑なコードを書かないように指示する場合に「なるべく分岐が少なく、短いメソッドに」みたいな個人の感覚まかせはちょっと心配なので、とりあえずの指標を用意しようかと。
サイクロマティック複雑度
制御フローの複雑さや、 サブルーチンのようなモジュールにおける枝分かれの複雑さの量を測定するために、 1970年代に導入されました。 コードが実行される経路の数を表します。 当初は、各経路を実行するモジュールのテストケースを作成するコストのある尺度として開発されました。
ソフトウェアテストの本とかに載っていますね。ただ、イチイチカウントするのも面倒なのでツールを探していたら、ReSharperにアドインがありました。灯台もと暗し。(^^;
http://www.jetbrains.net/confluence/display/ReSharper/Cyclomatic+Complexity
例えば、こんなコードだと、
using System; using System.Collections.Generic; public class Program { static IEnumerable<string> Permutater(char[] cs,int i) { int l = cs.Length; if (i < l - 1) for (int j = i; j < l; ++j) { char t = cs [j]; for (int k = j; k > i; --k) cs [k] = cs [k - 1]; cs [i] = t; foreach (string s in Permutater (cs,i + 1)) yield return s; for (int k = i; k < j; ++k) cs [k] = cs [k + 1]; cs [j] = t; } else yield return new string (cs); } public static void Main() { string nums = "123"; foreach (string s in Permutater(nums.ToCharArray(), 0)) Console.WriteLine(s); } }
こんな感じでサイクロマティック数が表示されます。仕様的には指定した閾値(デフォルトは20)を超えたら表示されますが、常に見たかったので閾値を1にしています(なので図は600%)。