16

Visual Studio のコード メトリクス ルールに関して、次の 2 つのコードの違いを誰かが説明してくれるとありがたいです。内にすべてをカプセル化しないと、保守性指数がわずかに増加するのはなぜusing ( )ですか?

サンプル 1 ( MI スコア 71 )

public static String Sha1(String plainText)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        Byte[] text = Encoding.Unicode.GetBytes(plainText);
        Byte[] hashBytes = sha1.ComputeHash(text);
        return Convert.ToBase64String(hashBytes);    
    }
}

サンプル 2 ( MI スコア 73 )

public static String Sha1(String plainText)
{
    Byte[] text, hashBytes;
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        text = Encoding.Unicode.GetBytes(plainText);
        hashBytes = sha1.ComputeHash(text);
    }
    return Convert.ToBase64String(hashBytes);   
}

メトリクスは、より広い文脈と理解の外では無意味であり、プログラマーは裁量を行使する必要があることを理解しています。でスコアを 76 まで上げることができましたが、そうreturn Convert.ToBase64String(sha1.ComputeHash(Encoding.Unicode.GetBytes(plainText)))すべきではありませんでした。私は明らかに数字で遊んでいるだけであり、その時点でそれは本当に読みやすく、保守可能ではありません。この場合の増加の背後にある論理が何であるかについては興味があります。明らかに行数ではありません。

4

4 に答える 4

17

変数をすべて一番上に配置して、関数の内容がより「保守しやすい」ことがわかるようにします。少なくとも、コード メトリクスのルールを決定する人は誰でもそう考えます。

それは果たして本当なのか?コードに取り組んでいるチームに完全に依存します。質問の調子からすると、これはすでにご存じのようですが、ほとんどすべてのコード メトリクスを大まかに考えてください。それらは、誰かが最適だと考えているものであり、Microsoft 以外のチームには当てはまらない可能性があります...最善を尽くすあなたのチームのために、電卓があなたに言うことではありません。

私は、あなたとあなたのチームのコーディング パフォーマンスに有害な変更を加えることはありません (実際のパフォーマンスやエラー処理の改善などのためでない限り)。

そうは言っても、保守性が非常に低い場合は、ほとんどのチームにとって非常に低いスコアはおそらく受け入れられないため、検討するか、小さなチャンクに分割する価値がある可能性があります。

于 2010-05-01T06:17:21.203 に答える
8

これは古い質問ですが、MI はHalstead volumeに部分的に基づいていることを付け加えたいと思いました。これは、「演算子」と「オペランド」の数に基づいています。型による変数の宣言が「演算子」である場合、これはサンプル 2 の演算子が少ないことを意味し、スコアが変化します。一般に、MI は統計的測定値であるため、サンプル サイズが小さい場合 (単一の簡易メソッドなど) には有用性が限られています。

于 2012-07-25T18:07:19.553 に答える
7

変数の宣言とそれらが使用される場所の間の距離が長くなるためです。

ルールは、変数のスパンを可能な限り減らすことです。スパンは、変数の宣言とそれが使用される場所の間の距離です。この距離が長くなるにつれて、変数に影響を与えるコードが後で導入され、プログラマーがコードのさらに下の影響に気付かないリスクが高まります。

これと、コード品質に関する他の多くのトピックをカバーする優れた本へのリンクを次に示します。 http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=dp_ob_title_bk

于 2010-05-01T06:18:53.607 に答える
0

私自身、私はむしろ見たいreturn Convert.ToBase64String(sha1.ComputeHash(Encoding.Unicode.GetBytes(plainText)))です; すべきではなく、すべきです。この形式には、実際のデータフローを簡潔に表現できるという利点があります。一時変数と代入の束を追加する場合、実際に何が起こっているかを確認するために、変数名を読み取り、それらの出現を一致させる必要があります。

于 2010-05-02T14:02:25.380 に答える