如何降低Switch case语句的Cyclomatic复杂性

时间:2011-10-14 05:02:03

标签: c#

有一个具有switch case的功能,我们需要减少它的CC

       string data = string.empty;
       switch (value)
        {
            case "Less than 2 billion":
                data = "0 - 2B";
                break;
            case "2 billion to 10 billion":
                data = "2B - 10B";
                break;
            case "10 billion to 20 billion":
                data = "10B - 20B";
                break;
            case "20 billion to 50 billion":
                data = "20B - 50B";
                break;
            case "Greater than 50 billion":
                data = "> 50B";
                break;
            case "N/A":
                data = "N/A";
                break;
            case "[items] > 0":
                data = string.Empty;
                break;
        }
        return data;

3 个答案:

答案 0 :(得分:8)

在这种情况下你可以使用字典查找,它会少一些代码并且更清晰。

答案 1 :(得分:2)

你可以做这样的事情

private Dictionary<EnumType, Action<param1Type,param2Type,etc> strategies = 
new Dictionary<EnumType, Action<param1Type, param2Type, etc>();

...

private void LoadDictionary()
{
strategies.Add(enumType.Option1, Method1);
strategies.Add(enumType.Option2, Method2);
...
}

...

private void Method1(param1Type param, param2Type param2, etc)
{
// your specific logic here
}

你这样使用它:

public void DoSomethingDependingOnCase(enumType option, param1Type param1, param2Type param2)
{
strategies[option].Invoke(param1,param2,etc);
}

答案 2 :(得分:0)

循环复杂度是衡量代码可维护性的一种方法,当有迹象表明您没有遵循良好的设计原则时,它会警告您。与其使用字典查找(具有相同的可维护性问题)之类的解决方案来避免从圈复杂性中获取错误/警告,不如考虑是否应该更改基本设计,因此甚至不需要这样的代码。 / p>

大概是您字符串中编码的概念(例如"Less than 2 billion")代表了业务级别的决策。如果该业务模型发生了变化(也许您引入了新的特定性),那么在代码库中的其他地方就有一些代码必须更改以适应该模型,对吗?如果该代码发生更改,则此switch语句也将不得不更改以保持正确,对吗?必须更改代码中的两个位置以容纳单个更改原因,这意味着您正在违反单一责任原则。

一种方法可能是将您在此处获得的数据映射放在同一位置。在您可能在代码中其他地方返回了"Less than 2 billion"的地方,现在您可以返回一个您定义的类型的对象,以容纳这样的信息(例如new NumericBucket{FullText = "Less than 2 billion", AbbreviatedText = "0 - 2B"})。

您还可以考虑是否真的应该在代码中定义这些存储桶:也许它们在配置上更有意义,这样,如果需要更改它们,则可以立即更改它们而无需更改代码。在这种情况下,可以根据数据库或某处文件中的配置填充NumericBucket