2012-10-09 17 views
6

की "चक्रवात जटिलता" को कैसे कम करूं, मैं सोच रहा हूं कि निम्न कोड की चक्रवात जटिलता को कैसे कम किया जाए और यदि यह ऐसा कुछ भी है जिसे मुझे चिंतित होना चाहिए।मैं निम्नलिखित कोड

विधि ValuePojo.getSomething()

public class ValuePojo 
{ 
    private ValueTypeEnum type; 

    private BigDecimal value1; 

    private BigDecimal value2; 

    private BigDecimal value3; 

    public ValuePojo() 
    { 
     super(); 
    } 

    /** 
    * This method reports as "HIGH Cyclomatic Complexity" 
    * 
    * @return 
    */ 
    public BigDecimal getSomething() 
    { 
     if (this.type == null) 
     { 
      return null; 
     } 

     switch (this.type) 
     { 
      case TYPE_A: 
      case TYPE_B: 
      case TYPE_C: 
      case TYPE_D: 
       return this.value1; 

      case TYPE_E: 
      case TYPE_F: 
      case TYPE_G: 
      case TYPE_H: 
       return this.value2; 

      case TYPE_I: 
      case TYPE_J: 
       return this.value3; 
     } 

     return null; 
    } 
} 
+0

रिपोर्ट की गई चक्रीय जटिलता क्या है? – Vikdor

+0

11 मुझे लगता है, सोनार में स्थिति को ट्रिगर करने के लिए पर्याप्त उच्च है लेकिन पागल स्तर पर नहीं। –

+2

आप तर्क को enum में धक्का दे सकते हैं। –

उत्तर

5

cyclomatic जटिलता निर्धारित किया जाता है (कृपया चर नामकरण, इस दिया स्पष्टता के लिए इस सवाल में फिर से लिखा गया है के बारे में चिंता नहीं है) को देखें आपके कोड में निष्पादन की शाखाओं की संख्या से। if - else ब्लॉक, switch कथन - सभी आपके कोड की चक्रवात जटिलता में वृद्धि करते हैं और उचित कोड कवरेज सुनिश्चित करने के लिए आवश्यक परीक्षण मामलों की संख्या भी बढ़ाते हैं।

अपने कोड में जटिलता को कम करने के लिए, मैं तुम्हें case बयान है कि एक परिभाषित व्यवहार की जरूरत नहीं है और अपने switch बयान में एक default व्यवहार से बदलने निकालने का सुझाव देते हैं।

यहां एक और question स्टैक ओवरफ्लो पर है जो इस समस्या को संबोधित करता है।

+0

उत्तर के लिए धन्यवाद, मैंने उस धागे को देखा और मुझे "समाधान" नहीं मिला जो मेरी समस्या को पर्याप्त रूप से संबोधित करता था। मुझे यह भी यकीन नहीं था कि एक समस्या थी। –

+1

मुझे लगता है कि चक्रीय जटिलता एक काफी व्यक्तिपरक उपाय है। जब तक यह पठनीय नहीं है और नौकरी करता है तब तक आपको अपना कोड बदलने के बारे में चिंता करने की आवश्यकता नहीं है। एक उच्च चक्रीय जटिलता आपके ऑब्जेक्ट मॉडल में मुद्दों को इंगित कर सकती है, लेकिन मुझे नहीं लगता कि यह आपके उदाहरण के लिए प्रासंगिक है। – Luhar

+0

ठीक है। इस उत्तर में दिए गए प्रयासों के लिए धन्यवाद –

8

यदि आपको वास्तव में चक्रवात जटिलता प्राप्त करने की आवश्यकता है, तो आप मानचित्र का उपयोग करने पर विचार कर सकते हैं। जाहिर है, आपके कार्यान्वयन में, इसे केवल एक बार बनाया और शुरू किया जाना चाहिए।

public BigDecimal getSomething() { 
     if (this.type == null) { 
      return null; 
     } 
     Map<Type,BigDecimal> map = new HashMap<Type,BigDecimal>(); 
     map.put(TYPE_A, value1); 
     map.put(TYPE_B, value1); 
     map.put(TYPE_C, value1); 
     map.put(TYPE_D, value1); 
     map.put(TYPE_E, value2); 
     map.put(TYPE_F, value2); 
     map.put(TYPE_G, value2); 
     map.put(TYPE_H, value2); 
     map.put(TYPE_I, value3); 
     map.put(TYPE_J, value3); 

     return map.get(type); 
    } 
+0

उत्सुक समाधान, विचार के लिए धन्यवाद। दुर्भाग्यवश मेरे मामले में मूल्य बदल सकते हैं ताकि नक्शा हर समय फिर से किया जाना पड़ेगा। –

+0

यदि आप गेटर्स और सेटर्स (जो आपको शायद वैसे भी करना चाहिए) का उपयोग करने के लिए वैल्यू 1 ... 3 को दोबारा दोहराएं, तो यह कोई समस्या नहीं है। –

+15

यह वास्तव में प्रोग्राम की जटिलता को कम नहीं कर रहा है, बस स्विच-केस से मानचित्र पर तर्क को स्थानांतरित करके कोड विश्लेषक से छिपा रहा है। – satellite779

संबंधित मुद्दे