サイクロマティック複雑度

開発者に複雑なコードを書かないように指示する場合に「なるべく分岐が少なく、短いメソッドに」みたいな個人の感覚まかせはちょっと心配なので、とりあえずの指標を用意しようかと。
サイクロマティック複雑度

制御フローの複雑さや、 サブルーチンのようなモジュールにおける枝分かれの複雑さの量を測定するために、 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%)。