2015-11-13 5 views
6

इस पुनर्संशोधित जा सकता है? या यह ठीक लग रहा है। (परिवर्तनीय नाम बदल गए)बहुत सारे अगर-किसी और बयान, किसी भी तरह से यह refactor करने के लिए

if (cmpScope.equals(GLOBAL)) { 
      return true; 
     } else if ((cmpScope.equals(X) || cmpScope.equals(Y)) 
       && cid == pid) { 
      return true; 
     } else if (cmpScope.equals(Z) && cid != pId) { 
      return true; 
     } else if (cmpScope.equals(V) && cid == pid) { 
      return true; 
     } else if (cmpScope.equals(Z) && cid == pid && cSubId != pSubId) { 
      return true; 
     } 
     return false; 
+0

पीआईडी ​​और पीआईडी ​​(देखें मैं और मैं) एक mystype है? वैसे भी IMHO कोड ठीक दिखता है, इसे निचोड़ने की कोई आवश्यकता नहीं है। – Willmore

उत्तर

14

बस सभी अभिव्यक्तियों को ऑर-ऑपरेटर के साथ संयोजित करें, क्योंकि वे सभी सत्य वापस आते हैं।

return ((cmpScope.equals(GLOBAL) || 
     ((cmpScope.equals(X) || cmpScope.equals(Y)) && cid == pid) || 
     (cmpScope.equals(Z) && cid != pId) || 
     (cmpScope.equals(V) && cid == pid) || 
     (cmpScope.equals(Z) && cid == pid && cSubId != pSubId)); 
+2

मुझे समझ में नहीं आता कि इसमें इतने सारे अपवॉट क्यों हैं। यह बिल्कुल पठनीय नहीं है और यह एक स्वच्छ कोड की तरह नहीं दिखता है। –

+0

@ सर्जकुहरेव किस तरह से यह पठनीय नहीं है? मुझे लगता है कि यह अलग-अलग वक्तव्यों से अधिक पठनीय है, सभी एक ही रिटर्न स्टेटमेंट के साथ। इसके अलावा कई रिटर्न स्टेटमेंट्स के बजाय, एक एकल रिटर्न स्टेटमेंट का इस्तेमाल किया जाता है (एक निकास को बेहतर प्रोग्रामिंग अभ्यास माना जाता है)। यदि आप इसे साफ करने के बेहतर तरीके से जानते हैं, तो कृपया अपना उत्तर जोड़ें। –

+0

एक महीने में अपना कोड पढ़ने की कल्पना करो। क्या आपको याद होगा क्या है? यदि आपको और शर्तों को जोड़ने की आवश्यकता है तो क्या होगा? यदि आपको मौजूदा लोगों को बदलने की आवश्यकता होगी तो क्या होगा? एक एकल रिटर्न स्टेटमेंट को एक अच्छा अभ्यास नहीं माना जाता है। वास्तव में, मार्टिन फाउलर (http://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html) और अंकल बॉब का कहना है कि शुरुआती रिटर्न अच्छे हैं। एक निकास बयान 10 साल पहले एक अच्छा अभ्यास माना जाता था। और निश्चित रूप से, मैंने अपना जवाब जोड़ा है। चीयर्स! –

0

मैं यह सोचते हैं कि 'सच वापसी' सिर्फ एक उदाहरण है? अन्यथा आप सभी बयानों को समूहित कर सकते हैं जो एक अभिव्यक्ति में सत्य लौटते हैं। अगर वे वास्तव में अलग-अलग चीजों को करने के लिए हैं, तो यह मेरे लिए अच्छा लग रहा है। (कुछ मामलों में एक स्विच बयान है, इस्तेमाल किया जा सकता नहीं इस मामले में है, लेकिन सामान्य रूप में यह पता है कि आप का उपयोग इस https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html कर सकते हैं करने के लिए अच्छा हो सकता है)

2

आप चर में स्थिति का परिणाम संग्रहीत कर सकती है और सभी की स्थिति को संभाल एक बयान में

boolean trueCond1 = cmpScope.equals(GLOBAL); 
boolean trueCond2 = (cmpScope.equals(X) || cmpScope.equals(Y)) && cid == pid; 
boolean trueCond3 = cmpScope.equals(Z) && cid != pId; 
boolean trueCond4 = cmpScope.equals(V) && cid == pid; 
boolean trueCond5 = cmpScope.equals(Z) && cid == pid && cSubId != pSubId; 

return (trueCond1 || trueCond2 || trueCond3 || trueCond4 || trueCond5); 
+4

इस दृष्टिकोण का (मामूली) नुकसान यह है कि यह विभिन्न 'trueCondX' के बीच शॉर्ट-सर्किट मूल्यांकन का उपयोग नहीं करता है। यह '|' के साथ मिशेलकिज़र्स के जवाब में '||' को बदलना है। –

2

आप सभी else रों से छुटकारा पा सकते क्योंकि प्रत्येक if खंड एक मान देता है (हालांकि मुझे लगता है कि सभी मामलों में एक बेहतर समाधान है नहीं लगता है)।

if (cmpScope.equals(GLOBAL)) { 
    return true; 
} 
if ((cmpScope.equals(X) || cmpScope.equals(Y)) && cid == pid) { 
    return true; 
} 
if (cmpScope.equals(Z) && cid != pId) { 
    return true; 
} 
if (cmpScope.equals(V) && cid == pid) { 
    return true; 
} 
if (cmpScope.equals(Z) && cid == pid && cSubId != pSubId) { 
    return true; 
} 
return false; 

यह कोड की स्पष्ट जटिलता को कम करने के लिए सबसे अच्छी तकनीकों में से एक है। अपनी विशिष्ट आवश्यकताओं के आधार पर, के साथ एक एकल अभिव्यक्ति में उनका समूह बनाने या ऑपरेटरों एक बेहतर समाधान हो सकता है। इसके अलावा सीआईडी ​​/ पीआईडी ​​तुलना पिछले चार परीक्षण के लिए आम है, तो कुछ इस तरह बेहतर अभी भी हो सकता है:

if (cmpScope.equals(GLOBAL)) { 
    return true; 
} 
if (cid == pid) { 
    if (cmpScope.equals(X) || cmpScope.equals(Y)) { 
     return true; 
    } 
    if (cmpScope.equals(V)) { 
     return true; 
    } 
    if (cmpScope.equals(Z) && cSubId != pSubId) { 
     return true; 
    } 
} else { 
    if (cmpScope.equals(Z)) { 
     return true; 
    } 
} 
return false; 
1

मैं पूरी तरह से @ कार्ल-manaster प्रतिक्रिया का समर्थन है, लेकिन मुझे लगता है हम आगे जा सकते हैं।

मेरे दृष्टिकोण निम्नलिखित सिद्धांतों पर आधारित है:

  • कोई किसी और बयान होना चाहिए।
  • जटिल तार्किक अभिव्यक्तियों को पठनीयता बढ़ाने के लिए निजी तरीकों से निकाला जाना चाहिए।
  • टेस्ट स्वीट कि सभी संभव शाखाओं को शामिल किया गया है। यही कारण है कि लोग चक्रीय जटिलता के बारे में चिंतित हैं। और यही कारण है कि विधि में निकालने में मदद करता है।

उदाहरण कोड से, यह स्पष्ट नहीं है कि यह विधि वास्तव में क्या करती है, इसलिए मैंने कुछ यादृच्छिक नाम उठाए और लेखक को इसे और अधिक वैध में बदलना चाहिए।

मुझे कोई परीक्षण और समय नहीं था, इसलिए मैं 100% यह काम करेंगे यकीन नहीं है, लेकिन बदलाव की श्रृंखला के बाद मैं निम्नलिखित कोड के साथ समाप्त हो गया है:

function(cid, pid, cSubId, pSubId) { 
    return cmpScope.equals(GLOBAL) && isValidSomething() && isValidSomethingElse(); 
} 

कहाँ निकाले तरीके हैं:

function isValidSomething() { 
    if(cid != pid) { 
     return false; 
    } 
    if (cmpScope.equals(V) || cmpScope.equals(X) || cmpScope.equals(Y)) { 
     return true; 
    } 
    return cmpScope.equals(Z) && cSubId != pSubId; 
} 

function isValidSomethingElse() { 
    return cmpScope.equals(Z) && cid != pId; 
} 

यह सिर्फ एक उदाहरण है और आप इसे और भी बेहतर बना सकते हैं।

फिर, यह का मुख्य बिंदु ताकि आप इसे "की तरह एक अच्छी तरह से लिखा गद्य" पढ़ सकते हैं अच्छा नाम के साथ निजी तरीकों है। इस कल्पना कीजिए:

function isMyCarValid() { 
    return isHaveWheels() && isHaveFuel() && isHaveDriver(); 
} 
संबंधित मुद्दे