2013-05-07 9 views
11

मैं एक कक्षा पर काम कर रहा हूं जो एक वेब सेवा के लिए अनुरोध डीटीओ भेजता है। मुझे भेजे जाने से पहले अनुरोध को सत्यापित करने की आवश्यकता है।चक्रवात जटिलता को कम करने के लिए कैसे?

अनुरोध 3 अलग-अलग स्थानों से भेजा जा सकता है और प्रत्येक "अनुरोध प्रकार" के लिए अलग-अलग सत्यापन नियम हैं, उदा। अनुरोध 1 में नाम और फोननंबर होना चाहिए, अनुरोध 2 में पता होना चाहिए, आदि)

मेरे पास एक डीटीओ है जिसमें फ़ील्ड (नाम, पता, शहर, फोननंबर इत्यादि) की एक लंबी सूची है और यह वही डीटीओ भेजा गया है यह किस तरह का अनुरोध है।

मैंने 3 अलग-अलग सत्यापन विधियां बनाई हैं और उचित विधि कहलाए जाने के प्रकार के आधार पर।

इन तरीकों में से प्रत्येक में मेरे पास प्रत्येक अनुरोध प्रकार के लिए आवश्यक फ़ील्ड की जांच करने के लिए लंबी सूची है।

private void validateRequest1(Request request) { 
    StringBuilder sb = new StringBuilder(); 
    if (null == request) { 
     throw new IllegalArgumentException("Request is null"); 
    } 
    if (isFieldEmpty(request.getName())) { *see below 
     sb.append("name,")); 
    } 
    if (isFieldEmpty(request.getStreet())) { 
     sb.append("street,")); 
    } 
    ... 

isFieldEmpty() चेकों बातिल और isEmpty() के लिए स्ट्रिंग और रिटर्न एक बूलियन

यह मैं उन तरीकों में से एक में 28 की एक cyclomatic जटिलता देता है तो मेरे सवाल यह है कि .. यह इस जटिलता को कम करने के लिए संभव है? - यदि हां, तो मैं ऐसा करने के बारे में कैसे जाऊं?

अंत में मैं क्षेत्रों का एक बहुत जांच करने की आवश्यकता है और मैं नहीं देख सकते हैं कि यह कैसे चेकों के बहुत सारे बिना किया जा सकता:/

+1

मेरा विचार होगा: कुछ प्रकार की 'फ़ील्ड चेकर' ऑब्जेक्ट का उपयोग करें जो खालीपन (या कुछ अन्य) जांच को घेर लेता है, और कार्रवाई की जाने वाली कार्रवाई ('sb.append()') आदि, और एक सूची में लूप ऐसी वस्तुओं। इससे कोड स्पष्ट हो जाता है क्योंकि आपको उस चेक के आउटपुट और इनपुट को स्पष्ट रूप से परिभाषित करना होगा। – millimoose

उत्तर

22

एक आसान तरीका है एक अलग विधि में जांच को बढ़ावा देना है:

private String getAppendString(String value, String appendString) { 
    if (value == null || value.isEmpty()) { 
     return ""; 
    } 
    return appendString; 
} 

और फिर आप के बजाय if ब्लॉक के इस विधि का उपयोग कर सकते हैं:

sb.append(getAppendString(request.getStreet(), "street,"); 

इस से 28 3. करने के लिए नीचे हमेशा याद रखें जटिलता को कम होगा: उच्च जटिलता देश टीएस एक संकेत है कि एक विधि बहुत अधिक करने की कोशिश कर रहा है। इस समस्या को छोटे टुकड़ों में विभाजित करके जटिलता का सामना किया जा सकता है, जैसा कि हमने यहां किया था।

1

एक अन्य दृष्टिकोण अनुरोध ऑब्जेक्ट में उस अनुबंध को लागू करना होगा। यदि कोई फ़ील्ड आवश्यक है या शून्य नहीं हो सकता है, तो अनुरोध करें जब अनुरोध बनाया गया हो।

अनुरोध इस तरह से बनाएं कि यह 100% मान्य है और जब निर्माता मौजूद है तो जाने के लिए तैयार है।

मैं अनुरोध स्ट्रिंग() विधि में उस स्ट्रिंग संस्करण को भी बनाऊंगा। यह जानना चाहिए कि खुद को कैसे प्रस्तुत करना है।

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