web-dev-qa-db-ja.com

単純なHello Worldの循環的複雑度が2に等しいのはなぜですか?

循環的複雑度に関連する2つの質問があります。

  1. この指標をアプリ全体に使用できますか?関数を呼び出す関数などを考えると、信じられないほど多くなるので、私はできないと思います。それは、モジュール/メソッド/ユニットだけですか?

  2. Visual Studioでは、Mainメソッドを呼び出すだけでアプリを開始すると、循環的複雑度の値は2になります。なぜですか?プログラムを実行する方法は1つだけあります-終了します。

7
John V

最も基本的なコンソールアプリケーションの循環的複雑度は、単純な理由で2です。Main()メソッドの他に、コンストラクターもあります。それは書くようなものです:

_public class Program
{
    public Program()
    {
    }

    public static void Main()
    {
    }
}
_
  • 最初のパスは、Programクラスの新しいインスタンスを作成することです。このパスは、アプリケーションを起動するためにデフォルトで使用されます。

  • 2番目のパスは、静的メソッドProgram.Main()を呼び出すことです。このパスは、アプリケーションが別のアプリケーションによって通常のライブラリとして使用されている場合に使用できます。

これは、静的メソッドを持つ非静的クラスに適用されることに注意してください。例えば:

_public class Hello
{
    // Even if the constructor was omitted, it will still be added by the compiler.
    public static void SayHello()
    {
    }
}
_

循環的複雑度も2になります。

また、循環的複雑度が1のアプリケーションが本当に必要な場合は、次のコードのように、Programクラスを静的として宣言するだけです。 VisualStudioのデフォルトテンプレートがpublicキーワードとstaticキーワードの両方を追加するのを忘れる理由がわかりません。

_public static class Program // ← See, we replaced a non-static class by a static one
{
    static void Main(string[] args)
    {
    }
}
_

最初の質問に関しては、循環的複雑度を唯一の要因として使用していません。 かなりトリッキーな式 の保守性インデックスはより優れたメトリックですが、保守性インデックスでさえ、コードの一部が「良い」または「悪い」と言って完全に信頼できるものではありません。 。

小規模なプロジェクトで数千という循環的な複雑さを持つことは邪魔にならず、それをクラス、アセンブリ、またはプロジェクトのスコープに使用してもあまり意味がありません。はるかに厄介なのは、特定の方法で高い循環的複雑度を取得することです。

10