7

Visual Studio のコード メトリクス アナライザーとコード メトリクス パワー ツールTestMethodは、次のコードのメソッドのコード行数を 8 と報告します。

せいぜい、コード行を 3 行と報告することを期待します。

[TestClass]
public class UnitTest1
{
    private void Test(out string str)
    {
        str = null;
    }

    [TestMethod]
    public void TestMethod()
    {
        var mock = new Mock<UnitTest1>();

        string str;
        mock.Verify(m => m.Test(out str));
    }
}

なぜこれが当てはまるのか、誰でも説明できますか?

詳細情報

もう少し掘り下げた後out、Test メソッドからパラメーターを削除してテスト コードを更新すると、LOC が 2 として報告されることがわかりました。これは正しいと思います。を追加するoutとジャンプが発生するため、ブレースや属性が原因ではありません。

dotPeek を使用して DLL を逆コンパイルすると、out8 LOC と見なされる可能性のあるパラメーターのために生成されたかなりの量の追加コードが明らかになりますが、パラメーターを削除して逆コンパイルすると、5 LOC と見なされる可能性のある生成されたコードも明らかになるため、単に VS の問題ではありません。コンパイラが生成したコードを数えます(とにかくそうすべきだとは思いません)。

4

3 に答える 3

2

ツールNDependを使用すると、のコードの#行(LoC)が2になりTestMethod()ます。(免責事項私はこのツールの開発者の1人です)。Lines Of Code(LOC)の数をどのように数えるかについての記事を書きました。これは、論理LoCとは何か、およびすべての.NETLoCカウントツールがPDBシーケンスポイントテクノロジーにどのように依存しているかに光を当てています。

VSメトリックによって提供されるこのLoC値8に関する私の推測では、ラムダ式によって生成されたメソッドのLoCが含まれています+オープン/エンドブレースに関連するPDBシーケンスポイントが含まれています(NDependには含まれていません)。また、ローカル変数のキャプチャ と呼ばれるものを実行するためにコンパイラによって多くの体操が行われますstrが、これはPDBシーケンスポイントから推測される#LoCに影響を与えるべきではありません。

ところで、私は他に2つの関連するLoC記事を書きました。

于 2012-10-27T10:56:50.993 に答える
2

「コードの行数」(LOC) には、いくつかの一般的な定義があります。それぞれが、私がほとんど無意味な指標と考えるものに何らかの意味を持たせようとしています. たとえば、有効なコード行 (eLOC) の google。

VSはメソッド宣言の一部として属性を含めており、ステートメントや中かっこを数えることでeLOCを与えようとしていると思います。1 つの可能性は、'm => m.Test(out str)' がステートメントとしてカウントされていることです。

このことを考慮:

if (a > 1 &&
    b > 2)
{
   var result;
   result = GetAValue();
   return result;
}

この:

if (a> 1 && b >2)
   return GetAValue();

LOC の 1 つの定義は、コードを含む行をカウントすることです。これには中括弧も含まれる場合があります。このように極端に単純化した定義では、カウントはコーディング スタイルによって大きく異なります。

eLOC は、コード スタイルの影響を軽減または排除しようとします。たとえば、この場合のように、宣言は「行」としてカウントされる場合があります。正当化するのではなく、説明するだけです。

このことを考慮:

int varA = 0;
varA = GetAValue();

この:

var varA = GetAValue();

二行か一行か?

それはすべて、意図が何であるかに帰着します。必要なモニターの高さを測定する場合は、おそらく単純な LOC を使用します。複雑さを測定することが目的の場合は、eLOC などのコード ステートメントをカウントする方がよいでしょう。

複雑さを測定したい場合は、循環的複雑度のような複雑さの指標を使用してください。VS が LOC をどのように測定しているかについて心配する必要はありません。とにかく役に立たないメトリックだと思います。

于 2012-10-26T11:05:54.227 に答える