2011-10-14 38 views
5

有是具有开关外壳的功能,我们需要减少其CC如何减少圈开关case语句的复杂性

 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; 
+1

恕我直言,CC是指标而不是作为一项规则。 switch语句给出更高的CC,但是这里真的存在可维护性问题吗? – FuleSnabel

+4

但通过用字典替换它来减少CC真正增加可维护性还是仅仅减少CC?在我的经验中;每当我用字典查找替换这些switch语句时,响应就是:“我更喜欢switch语句”。谁对可维护性是正确的? CC度量或维护它的开发人员? – FuleSnabel

+0

我不认为用字典取代这一点使得它不那么复杂,我认为你最好在别处花费你的努力。然而,有一件事让我很担心,硬编码字符串(例如“少于20亿”和“0-2B”),这些应该是可维护性的常数。如果你只是返回数据,只要做'返回'0-2B“;' – Joey

回答

7

你可以在这种情况下使用字典查找,它就会少一点代码和清晰。

+0

我使用了字典<字符串,字符串>,现在CC是1但是想知道是否相同的函数在多个地方被调用,那么它会妨碍性能,因为在每个调用中它都会创建Dictionary。 –

+2

在大多数情况下,您可以将字典作为静态成员,因此只能初始化一次。 – FuleSnabel

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); 
}