16

如果有人可以根据 Visual Studio 的 Code Metrics 规则向我解释以下两段代码之间的区别,我将不胜感激。如果我不封装所有内容,为什么可维护性指数会略有增加using ( )

样本 1MI 得分 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

将变量全部放在顶部,这样您就知道函数中的内容更“可维护”,至少这就是决定代码度量规则的人的想法。

这是否真的是真的?完全取决于编写代码的团队。似乎您已经从问题的语气中知道了这一点,但是对几乎所有代码指标都持保留态度,它们是有人认为最好的,对于微软以外的团队来说可能并非如此......做最好的事情对于您的团队,而不是某些计算器告诉您的。

我不会做出对您和您的团队的编码性能有害的更改(除非它是为了实际性能或改进错误处理等),您认为在指标板上获得一些分数时可读性较差。

话虽如此,如果它给你的可维护性非常低,那么可能有一些值得关注或分解成更小的块的东西,因为对于几乎任何团队来说,非常低的分数可能都不那么可接受。

于 2010-05-01T06:17:21.203 回答
8

这是一个老问题,但我只是想补充一点,MI 部分基于Halstead volume,它基于“运算符”和“操作数”的计数。如果按类型声明变量是“运算符”,这意味着样本 2 的运算符较少,从而改变了分数。通常,由于 MI 是一种统计测量,因此在处理小样本量时(如单个短方法)的用处有限。

于 2012-07-25T18:07:19.553 回答
7

因为变量的声明和它们的使用位置之间的距离增加了。

规则是尽可能地减小变量span,span是变量声明和使用位置之间的距离。随着该距离的增加,在程序员进一步意识到代码中的影响的情况下,引入稍后影响变量的代码的风险也会增加。

这是一本好书的链接,该书涵盖了这个和许多其他关于代码质量的主题。 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 回答