2011-10-14 10 views
5

वहाँ एक समारोह जो स्विच मामला है और हम, यह एक छोटे कम होगाकैसे स्विच मामले बयान के cyclomatic जटिलता को कम करने के

 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

आईएमएचओ सीसी मीट्रिक है जो एक दिशानिर्देश के रूप में सेवा के रूप में काम नहीं करना चाहिए। स्विच स्टेटमेंट उच्च सीसी देता है लेकिन वास्तव में यहां एक रखरखाव समस्या है? – FuleSnabel

+4

लेकिन सीसी को एक शब्दकोश के साथ बदलकर रखरखाव बढ़ाने के लिए इसे कम करता है या क्या यह सीसी को कम करता है? मेरे अनुभव में; जब भी मैंने एक शब्दकोश लुकअप के साथ इस तरह के स्विच स्टेटमेंट्स को प्रतिस्थापित किया है तो प्रतिक्रिया हुई है: "मुझे स्विच स्टेटमेंट बेहतर पसंद आया"। रखरखाव के बारे में कौन सही है? सीसी मीट्रिक या देवता जो इसे बनाए रख रहे हैं? – FuleSnabel

+0

मुझे नहीं लगता कि इसे एक शब्दकोश के साथ बदलना इसे कम जटिल बनाता है और मुझे लगता है कि आप कहीं और अपना प्रयास खर्च करने से बेहतर होंगे। एक चीज जो मुझे चिंतित करती है हालांकि हार्डकोडेड स्ट्रिंग्स (उदाहरण के लिए "2 अरब से कम" और "0 - 2 बी") हैं, ये वास्तव में रखरखाव के लिए स्थिरांक होना चाहिए। एफवाईआई आपको प्रत्येक मामले पर ब्रेक की आवश्यकता नहीं है यदि आप सिर्फ डेटा लौट रहे हैं, तो बस 'वापसी' 0-2 बी करें;; – Joey

उत्तर

7

आप इस मामले में एक देखने शब्दकोश इस्तेमाल कर सकते हैं अपनी सीसी कम करने की जरूरत कोड और स्पष्ट।

+0

मैंने शब्दकोश का उपयोग किया और अब सीसी 1 है लेकिन यह जानना है कि क्या एक ही फ़ंक्शन कई स्थानों पर बुलाया जा रहा है तो यह प्रदर्शन में बाधा डालता है क्योंकि प्रत्येक कॉल में यह शब्दकोश बना देगा। –

+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); 
} 
संबंधित मुद्दे