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

如果我在以下位置运行代码指标(右键单击解决方案资源管理器中的项目名称并选择“计算代码指标”-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;
    }

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

(当然,如果您只有这个,这无关紧要,但是如果您使用类似类的实用程序,其哲学正在做这样的事情,那么您的实用程序类的可维护性指数将最差..)

有什么办法解决这个问题?

#1楼 票数:26 已采纳

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

  • 0-9 = 难以维护
  • 10-19 = 中等维持
  • 20-100 = 好维护

可维护性指数基于三个代码指标:即 Halstead Volumen、圈复杂度和代码行数,并基于以下公式

MAX(0,(171 - 5.2 * ln(Halstead Volume) - 0.23 * (圈复杂度) - 16.2 * ln(代码行))*100 / 171)

事实上,在您的示例中,可维护性指数值低的根本原因是圈复杂度。 该指标是根据代码中的各种执行路径计算得出的。 不幸的是,该指标不一定与代码的“人类可读性”一致。

示例作为您的代码导致非常低的索引值(请记住,较低意味着更难维护)但实际上它们非常易于阅读。 这在使用圈复杂度评估代码时很常见。

想象一下具有几天(周一至周日)的开关块加上几个月(一月至十二月)的开关块的代码。 此代码将非常易读和可维护,但会导致巨大的圈复杂度,从而导致 Visual Studio 2010 中的可维护性指数非常低。

这是关于度量的众所周知的事实,如果根据数字判断代码,则应考虑这一点。 不应查看绝对数字,而应随着时间的推移监控这些数字,以将其理解为代码更改的指标。 例如,如果可维护性指数始终为 100,然后突然下降到 10,您应该检查导致这种情况的变化。

#2楼 票数:5

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

正确的解决方案(马克·辛普森在上面提到过)是可以扩展使用新的形式因子而无需重新构建代码的解决方案 - 代码中的 switch / case 语句总是表明 OO 设计已被遗忘,应该始终被看到作为一种糟糕的代码气味。

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

interface IFormFactor
{
    // some methods
}

class SipFormFactor : IFormFactor...

class DipFormFactor : IFormFactor...

Etc.

...并让接口上的方法提供所需的功能 - 你可以认为它 [我猜] 类似于 GoF 命令模式。

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

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

    factor.DoSomething();

    // some more logic...
}

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

#3楼 票数:3

我知道这个答案很晚了,但我很感兴趣的是还没有人提出字典解决方案。 我发现在处理像这样面向数据的大型 switch 语句时,将 switch-case 折叠到字典中通常更具可读性。

public static readonly IDictionary<int, string> Factors = new Dictionary<int, string> {
   { 1, "Other" },
   { 2, "SIP" },
   { 3, "DIP" },
   { 4, "ZIP" },
   { 5, "SOJ" }
};

public static string GetFormFactor2(int number)
{
   string formFactor = string.Empty;
   if (Factors.ContainsKey(number)) formFactor = Factors[number];
   return formFactor;
}

这为您提供了 74 的可维护性指数 - 由于类耦合到字典,因此略低于数组解决方案,但我觉得它更通用,因为它适用于您通常会打开的任何数量的类型。 与数组解决方案一样,它的扩展性非常好,并删除了大量重复代码。

一般来说,使用数据驱动的方法可以帮助您的代码更清晰,因为它将重要部分(在这种情况下,条件和结果)与琐碎(在这种情况下,切换案例)分开。

#4楼 票数:2

有两件事浮现在脑海:

使用枚举将描述和值结合起来

public enum FormFactor
{
    Other = 1,
    SIP = 2,
    etc.
}

使用类或结构来表示每个形状因子

public class FormFactor 
{
    public int Index { get; private set; }
    public string Description { get; private set; }

    public FormFactor(int index, string description)
    {
        // do validation and assign properties
    }
}

#5楼 票数:2

我会这样做并忘记可维护性指数:

public static string GetFormFactor(int number)
{
    switch (number)
    {
        case 1: return "Other";
        case 2: return "SIP";
        case 3: return "DIP";
        case 4: return "ZIP";
        case 5: return "SOJ";
    }

    return number.ToString();
}

恕我直言,易于阅读且易于更改。

#6楼 票数:0

我不知道这有多重要,但以下得到 76:

private static string[] _formFactors = new[] { null, "Other","SIP","DIP", "ZIP", "SOJ"};
public static string GetFormFactor2(int number)
{
    if (number < 1 || number > _formFactors.Length)
    {
        throw new ArgumentOutOfRangeException("number");
    }

    return _formFactors[number];
}

#7楼 票数:0

显然对我来说Enum方法是最容易维护的,因为它不涉及硬编码字符串,因此没有拼写错误和编译时语法检查。 只有限制是命名规则。

  ask by pee2002 translate from so

未解决问题?本站智能推荐:

1回复

Visual Studio可维护性指数只有层次结构,只有main()

我是传统C ++代码库的当前所有者。 它有几十个源文件和头文件。 该项目通常在Linux上开发,构建和部署。 在linux中,构建系统是scons / gcc,产品是单个可执行文件。 我想为代码的各个部分生成可维护性索引(MI),以帮助表明代码区域中的体系结构更新比以前的体系结构更易
1回复

在哪种情况下,我不应该在意Visual Studio的代码度量标准中的可维护性指数?

在几乎每天都使用Visual Studio……实际上是我一生之后,我今天才偶然发现Code Metrics。 我认为它自VS2008以来就已经存在,但我并不介意使用它。 我的解决方案中的大多数项目都具有相当高的可维护性指数-“废弃”项目中的85、83、86、76和59。 我确实记得在使
2回复

Visual Studios 如何计算可维护性指数?

我一直在浏览帖子和 MSDN,但我没有看到可维护性指数是如何创建的。 只有好的和坏的价值观是什么。 http://msdn.microsoft.com/en-us/library/bb385914.aspx 有人知道吗? 我们能否获得有关他们正在使用的内容的参考或解释? 我对定义为易于维护的
2回复

WinForms MenuStrip隔离可提高代码可维护性

在Windows窗体,C#、. NET 3.5,VS2008中... 有什么好方法可以将MenuStrip(或任何复杂的控制组)及其子菜单项的代码与表单的其余部分隔离开? 例如,当我有一个包含多个菜单的MenuStrip且每个菜单具有多个菜单项(都具有单击事件)时,Form.Desi
5回复

可维护性指数

我发现维护性指数(MI)的推荐值如下: 85以上 :良好的可维护性 65-85 :适度可维护性 65及以下 :使用非常糟糕的代码(大的,未注释的,非结构化的)难以维护MI值甚至可能是负的 这些价值取决于技术吗? 例如,对于大型机来说,70的值是好的,但对于Ja
2回复

用于生产项目的代码指标(C#、Visual Studio)的常用值

有关于代码度量的一些问题在这里,尤其是这一个目标价值。 不过,我正在寻找的是现实生活生产项目中的“常规”内容。 也许只是我一个人,但我参与的任何项目都没有考虑过这些事情,所以当我运行 ReSharper Code Issues 或 Visual Studio Code Metrics 时,我似乎是第
2回复

Java中的跟踪可维护性指数(MI)

我需要一个用于Java的快速,可靠(开源将是一个加分)的良好工具来跟踪可维护性索引和类似的代码指标,以向客户显示重构问题的进度。 您的建议是什么?
4回复

为什么这个可维护性指数会增加?

如果有人能够根据Visual Studio的Code Metrics规则向我解释以下两段代码之间的区别,我将不胜感激。 如果我没有在using ( )封装所有内容,为什么可维护性指数会略有增加? 样本1 ( MI分数为71 ) 样本2 ( MI分数为73 ) 我理解指标在