2011-10-14 34 views
5

Có một chức năng trong đó có trường hợp chuyển đổi và chúng ta cần phải giảm CC của nóLàm thế nào để giảm Cyclomatic phức tạp của Switch trường hợp báo cáo

 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

IMHO CC là số liệu phải là hướng dẫn không phải là quy tắc. Câu lệnh switch cho phép CC cao hơn nhưng thực sự có vấn đề bảo trì ở đây không? – FuleSnabel

+4

Nhưng làm giảm CC bằng cách thay thế nó bằng một từ điển tăng khả năng bảo trì thật sự hoặc nó chỉ làm giảm CC? Theo kinh nghiệm của tôi; bất cứ khi nào tôi đã thay thế các loại chuyển đổi báo cáo với một tra cứu từ điển các phản ứng đã được: "Tôi thích báo cáo chuyển đổi tốt hơn". Ai là chính xác về bảo trì? Số liệu CC hoặc các nhà phát triển đang duy trì nó? – FuleSnabel

+0

Tôi không nghĩ rằng việc thay thế điều này bằng một từ điển làm cho nó ít phức tạp hơn và tôi nghĩ bạn nên cố gắng hết sức để nỗ lực ở nơi khác. Tuy nhiên, một điều khiến tôi lo lắng là các chuỗi được mã hóa cứng (ví dụ: "Ít hơn 2 tỷ" và "0 - 2B"), những thứ này thực sự là hằng số để bảo trì. FYI bạn không cần nghỉ ngơi trên mỗi trường hợp nếu bạn chỉ trả về dữ liệu, chỉ cần 'return" 0-2B ";' – Joey

Trả lời

7

Bạn có thể sử dụng một tra cứu từ điển trong trường hợp này, nó sẽ là một chút ít mã và rõ ràng hơn.

+0

tôi đã sử dụng Dictionary và bây giờ CC là 1 nhưng muốn biết nếu cùng một hàm đang được gọi ở nhiều nơi sau đó nó sẽ cản trở hiệu suất bởi vì trong mọi cuộc gọi nó sẽ tạo ra từ điển. –

+2

Trong hầu hết các trường hợp, bạn có thể có từ điển làm thành viên tĩnh và do đó chỉ khởi tạo nó một lần. – FuleSnabel

2

Bạn có thể làm một cái gì đó như thế này

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 
} 

Và bạn sử dụng nó như thế này:

public void DoSomethingDependingOnCase(enumType option, param1Type param1, param2Type param2) 
{ 
strategies[option].Invoke(param1,param2,etc); 
} 
Các vấn đề liên quan