4

LinesofCode以外のコード長メトリックを調べていました。ソースモニターが報告するものはステートメントです。これは知っておくと貴重なことのように思えましたが、SourceMonitorがいくつかのことを数える方法は直感的ではないようでした。たとえば、forステートメントは、変数定義、条件、およびインクリメントステートメントが含まれていても、1つのステートメントです。また、メソッド呼び出しが引数リスト内で別のメソッドにネストされている場合、すべてが1つのステートメントと見なされます。

ステートメントがカウントされる標準的な方法はありますか?そのようなことを管理するルールはありますか?

4

4 に答える 4

7

メトリックの最初のルールは、「測定対象に注意する」ことです。あなたはステートメントの数を要求します、それはあなたが得ようとしているものです。お気づきのように、その数字はおそらく実際には関係ありません。

「複雑な」コードなど、他の指標に関心がある場合は、サイクロメトリックの複雑さなど、他のコードメトリックを調べることを検討してください。

http://en.wikipedia.org/wiki/Cyclomatic_complexity

更新:Re:あなたのコメント

「やりすぎ」が興味深い指標であることに同意します。私の概観では、1つのステートメントには1つの副作用(通常はローカル変数の変更などの「ローカル」副作用がありますが、ファイルへの書き込みなどの目に見える副作用)があるため、「ステートメントの数」は大まかになります。副作用の数に関して、メソッドが「実行」している量と相関します。

もちろん、実際には、私自身も含めて、誰のコードも実際に常にその基準を満たしているわけではありません。ステートメントだけでなく、たとえばメソッド呼び出しもカウントするために、「メソッドが実行している量」のメトリックを検討することができます。

実際にあなたの質問に答えるために:私は「ステートメントの数」が何であるかを規制する業界標準を知りません。C#仕様は確かに「ステートメント」が字句的に何であるかを定義しますが、もちろん、カウントを行うには何らかの解釈を行う必要があります。例えば:

  void M()
  {
    try
    {
      if (blah)
      {
        Frob();
        Blob();
      }
    }
    catch(Exception ex)
    { /* eat it */ }
    finally
    {
      Grob();
    }
  }

Mにはいくつのステートメントがありますか?Mの本体は、try-catch-finallyという1つのステートメントで構成されています。それで答えは1つですか?tryの本体には、「if」ステートメントという1つのステートメントが含まれています。「if」の結果には1つのステートメントが含まれます。つまり、ブロックはステートメントです。ブロックには2つのステートメントが含まれています。最後に1つのステートメントが含まれています。catchブロックにはステートメントが含まれていません-catchブロックは、字句的にはステートメントではありません-しかし、それは確かにメソッドの操作に非常に関連しています!

それで、それは全部でいくつのステートメントですか?ブロックを「実際の」ステートメントとしてカウントするかどうか、子ステートメントを親ステートメントに追加するものと見なすかどうかなどに応じて、1から6までの任意の数に対して妥当なケースを作成できます。私が知っているこの質問への答えを規制する標準化団体はありません。

于 2010-02-28T03:23:27.970 に答える
6

「ステートメントとは」の正式な定義に最も近いのは、C#仕様そのものです。特定のツールの測定値が仕様の読み方と一致するかどうかを調べて頑張ってください。

メトリックは、厳密な式ではなく、より良い/より悪いコードへのガイドとして最もよく使用されることを考えると、ツールによって使用される正確な定義は大きな違いをもたらしますか?

「ステートメントの長さ」が2500、1500、150の3つの方法がある場合、最初に検討する方法がわかります。別のツールが2480、1620、および174を報告する可能性があることはそれほど重要ではありません。

メトリックを測定するために私が見た中で最高のツールの1つはNDependですが、これも使用している定義が100%わからないのです。ウェブサイトによると、NDependには、命令数循環的複雑度など、 82の個別のメトリックがあります。

于 2010-02-28T03:47:49.337 に答える
3

C#メトリクスツールは、正確なC#BNF言語定義を使用して、カウントされるもの( "ステートメント"、 "オペランド")などを定義します。(実際、完全なC#文法に従ってコードを正確に解析し、解析ツリー上を歩いて構造メトリックを計算します。予想どおり、カウントライン行によって取得されるSLOCカウント)。

そのような定義は直感的ではないと主張するかもしれませんが(文法はめったにありません)、正確です。私はここで他のポスターに同意しますが、正確な測定値は、コードの1つのブロックが別のブロックに対して持つ相対的な値ほど重要ではありません。「173.92」の複雑さの値は、それ自体ではあまり役に立ちません。「81.02」という別の複雑さの値と比較すると、最初の値が2番目の値よりも複雑であり、注意を向けるのに十分であるという良い兆候があると言えます。

指標はトレンド分析にも役立つと思います。先週、このコードが「81.02」の複雑なものだった場合、今週は「173.92」ですが、コードのこの部分ですべてが起こっているのはなぜでしょうか。

また、構造メトリック(Cyclomaticなど)とSLOCの比率を、「やりすぎ」の指標、または少なくとも密度が高すぎて理解できないコードの記述の指標と見なすことができます。

于 2010-02-28T18:28:34.950 に答える
1

簡単な指標の1つは、トークン間の句読点(、、)を数えることです(;文字列、コメント、または数字の句読点を避けるため)。したがって、6としてカウントされます。,.for (x = 0, y = 1; x < foo.Count; x++, y++) bar[y] = foo[x];

于 2010-02-28T17:12:15.827 に答える