Visual Studio代码指标和交换机案例的可维护性指标

pee*_*002 10 indexing maintainability code-metrics visual-studio

作为一个喜欢遵循最佳实践的人,

如果我运行代码指标(右键单击解决方案资源管理器中的项目名称并选择"计算代码指标" - Visual Studio 2010):

    public static string GetFormFactor(int number)
    {
        string formFactor = string.Empty;
        switch (number)
        {
            case 1:
                formFactor = "Other";
                break;

            case 2:
                formFactor = "SIP";
                break;

            case 3:
                formFactor = "DIP";
                break;

            case 4:
                formFactor = "ZIP";
                break;

            case 5:
                formFactor = "SOJ";
                break;
        }

        return formFactor;
    }
Run Code Online (Sandbox Code Playgroud)

它给了我一个61的可维护性指数

(当然,如果你只有这个,这是微不足道的,但是如果你使用像哲学这样的类这样的实用程序,你的实用程序类将具有最差的可维护性指数..)

这是什么解决方案?

ahe*_*eil 26

首先:61被认为是可维护的代码.对于可维护性指数,100很容易维护代码,而0很难维护.

  • 0-9 =难以维持
  • 10-19 =适度维持
  • 20-100 =维护良好

可维护性指数基于三个代码指标:即Halstead Volumen,Cyclomatic Complexity和Code of Code,并基于以下公式:

MAX(0,(171 - 5.2*ln(Halstead Volume) - 0.23*(Cyclomatic Complexity) - 16.2*ln(代码行))*100/171)

事实上,在您的示例中,可维护性指数的低值的根本原因是Cyclomatic Complexity.此度量标准是根据代码中的各种执行路径计算的.不幸的是,度量标准不一定与代码的"人类可读性"一致.

例如,您的代码导致索引值非常低(记住,lower越难维护)但实际上它们非常容易阅读.这在使用Cyclomatic Complexity来评估代码时很常见.

想象一下,代码有几天的开关块(Mon-Sun)加上几个月的切换块(Jan-Dec).此代码将具有可读性和可维护性,但会导致巨大的Cyclomatic Complexity,因此Visual Studio 2010中的维护性指数非常低.

这是关于度量的众所周知的事实,如果根据数字判断代码,则应该考虑这一事实.不应查看绝对数字,而应随时监控这些数字,以便将其理解为代码更改的指标.例如,如果可维护性指数始终为100且突然降至10,则应检查导致此问题的变化.


小智 5

可维护性指数可能更高,因为您为解决方案选择的方法缺乏可扩展性.

正确的解决方案(上面提到的Mark Simpson)是可以扩展为使用新形状因子而不重建代码的解决方案 - 代码中的switch/case语句总是表明OO设计已被遗忘并应始终被看到作为一个坏代码的气味.

就个人而言,我会实施......

interface IFormFactor
{
    // some methods
}

class SipFormFactor : IFormFactor...

class DipFormFactor : IFormFactor...

Etc.
Run Code Online (Sandbox Code Playgroud)

...并让界面上的方法提供所需的功能 - 您可以将其视为[我猜]与GoF命令模式类似.

这样你的更高级别的方法就可以......

MyMethod(IFormFactor factor)
{
    // some logic...

    factor.DoSomething();

    // some more logic...
}
Run Code Online (Sandbox Code Playgroud)

...而且您可以在以后进行并引入新的外形,而无需像使用硬编码的switch子句那样更改此代码.您还会发现这种方法也很容易适用于TDD(如果你正确地进行TDD,你最终应该这样做),因为它很容易进行模拟.