9

मैं 13 मामलों के साथ एक स्विच स्टेटमेंट का उपयोग कर रहा हूं, प्रत्येक मामले में केवल एक लाइन रिटर्न वैल्यू है।जावा में स्विच के लिए मैककेब साइक्लोमैटिक कॉम्प्लेक्सिटी

मैककेबे इसे लाल रंग में चित्रित करता है। क्या एक बड़ा स्विच स्टेटमेंट लिखने का कोई आसान तरीका है? यह पढ़ने के लिए जटिल प्रतीत नहीं होता है, लेकिन मुझे लाल रंग की डिफ़ॉल्ट सेटिंग पसंद नहीं है। यदि अन्य लोग मेरे कोड पर एक ही टूल का उपयोग करते हैं और लाल सामान देखते हैं तो वे सोच सकते हैं कि मैं बेवकूफ हूं :-)

संपादित करें: मैं अपने स्वयं के अधिक सार प्रकारों के लिए विभिन्न एसक्यूएल-प्रकार मैप कर रहा हूं, इसलिए कुल राशि को कम करना प्रकार के

case Types.TIME: 
    return AbstractDataType.TIME; 
case Types.TIMESTAMP: 
    return AbstractDataType.TIME; 
case Types.DATE: 
    return AbstractDataType.TIME; 
case Types.BIGINT: 
    return AbstractDataType.NUMERIC; 
case Types.DECIMAL: 
    return AbstractDataType.NUMERIC; 

और इतने पर ...

+4

अगर आप की व्याख्या आसान है स्विच में 13 मामले क्यों हैं और आप पॉलिमॉर्फिज्म या मानचित्र का उपयोग करके ऐसा क्यों नहीं कर पाएंगे। –

+0

सहमत हुए। क्या आप हमें कोड दिखा सकते हैं? – Kane

+0

धन्यवाद, संपादन देखें। –

उत्तर

6

मुझे लगता है कि McCabe उपकरणों के बारे में ज्यादा पता नहीं है। चीजों में से एक चक्रवात जटिलता मानता है एकाधिक निकास बिंदु है।

मुझे EnumMap विचार पसंद है।

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

result = null; 

case Types.TIME: 
case Types.DATE: 
case Types.TIMESTAMP: result = AbstractDataType.TIME 

// etc. 

return result; 

मैं इस cyclomatic जटिलता कम कर देता है लगता है, क्या किसी को भी शैली के रूप में यह बारे में सोचता है की परवाह किए बिना: आप सभी स्रोत मानों एक ही परिणाम प्रकार है कि संक्षिप्त कर सकते हैं। और यह बयान लिखने का एक अलग तरीका है, भले ही यह आसान हो, आपको न्याय करना चाहिए।

7

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

3

मानचित्र विचार के लिए +1 ...

कुछ इस तरह:

प्रारंभ नक्शा

Map<Types, AbstractDataType> map = new HashMap<Types, AbstractDataType>(); 
map.put(Types.TIME, AbstractDataTypes.TIME); 
// and so on 

फिर अपने कोड सरल में भी कर

return map.get(sqlTimeType); 

एक बेहतर समाधान हालांकि इस मैपिंग को enum में शामिल करना होगा ताकि आप एक कर सकें ssuming आप Sql enum प्रकार पर नियंत्रण नहीं है ...

AbstractDataTypes.fromSqlType(timeType); 

और यदि आप कार्य करें:

sqlTimeType.getAbstractType(); 

Encapsulated और फिर से प्रयोग करने योग्य :-)

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