2017-07-13 10 views
5

में रिटर्न स्टेटमेंट का उपयोग करके टालना/छोटा करना चाहिए, वर्तमान सॉफ़्टवेयर में मैं काम कर रहा हूं, मैं इस पैटर्न को काफी व्यापक रूप से देख रहा हूं और ऐसा लगता है कि वे जितना संभव हो सके रिटर्न स्टेटमेंट से बचने की कोशिश कर रहे हैं। यहां तक ​​कि कोड में कुछ स्थानों पर यह लगभग चरम पर ले जाया जाता है।हमें जावास्क्रिप्ट प्रवाह नियंत्रण

मैंने किसी भी समय पहले सुना है कि वापसी विवरणों को कम किया जाना चाहिए या इससे बचा जाना चाहिए, लेकिन मुझे इस विचार की सटीक कारण या उत्पत्ति को याद नहीं किया जा सकता है (या खोज)। मेरा मानना ​​है कि यह कुछ पीएल में कुछ प्रदर्शन निहितार्थ के कारण था।

मैं व्यक्तिगत रूप से इसका पालन नहीं करता क्योंकि यह कोड को पढ़ने योग्य नहीं बनाता है, लेकिन इसे संदेह का लाभ दे रहा है, मुझे उत्सुकता है कि इस पैटर्न का उपयोग प्रदर्शन के संदर्भ में जावास्क्रिप्ट में इसकी योग्यता है या नहीं।

if (err) { 
    if (err.message) { 
     message = err.message; 
    } else { 
     if (err.errorCode) { 
      message = err.errorCode; 
     } else { 
      message = "Unknown error"; 
     } 
    } 
} else { 
    message = "Unknown error."; 
} 
deferred.reject(message); 

अगर मैं तय करने के लिए थे, मैं लापरवाही से वापसी कथन इस तरह अनुक्रम समाप्त करने के लिए उपयोग करेंगे:

if(!err || (!err.message && !err.errorCode)){ 
    deferred.reject("Unknown error."); 
    return; 
} 

if(err.message){ 
    deferred.reject(err.message); 
    return; 
} 

if(err.errorCode){ 
    deferred.reject(err.errorCode); 
} 

वहाँ दूसरा एक से अधिक पहले पैटर्न में फायदे हैं?

+1

एक समारोह केवल एक चीज करना चाहिए। 'अगर' स्थिति आमतौर पर मतलब है कि आपका कार्य एक से अधिक चीजें कर रहा है। –

+0

कई रिटर्न का उपयोग करने में समस्या यह है कि यह उस बिंदु पर, उसके ठीक उसी बिंदु पर आपके कार्य को छोड़ देता है। शायद आपके पास क्लीनअप कोड है, शायद आपको ऑब्जेक्ट्स मुक्त करना होगा, शायद आपको और चीजों की जांच करनी होगी ... कोड के ब्लॉक को अचानक छोड़ना लगभग हमेशा एक बुरा विचार है। –

+0

@Andrey आपने SO पर एक और उत्तर के लिए लिंक प्रदान किया है, जो कि अच्छा है, लेकिन यह 'जेएस' है)) और उदाहरण के लिए, जेएस में आपको कॉलबैक कॉल करने पर हर बार वापस जाना होगा ... –

उत्तर

2

आपके कोड उदाहरण में उपनाम - क्रिसमस पेड़ भी है, और वास्तविक परियोजनाओं में, यह बहुत कठिन समर्थन है।
उदाहरण के लिए यदि आप किसी अन्य शर्त जोड़ की जरूरत है - आप मौजूदा अंदर एक और if ब्लॉक डाल देंगे और इतने पर और बहुत आगे है और इसके लिए हम एक बुरा सपना है ... और परिणाम के रूप में, आप एक awfull पेड़ होगा ...

के रूप में विकल्प, आप कुछ इस तरह कर सकते हैं:

if (err) { 
    if (err.message) { 
     return err.message; 
    } 
    if (err.errorCode) { 
     return err.errorCode; 
    } 
} 
return "Unknown error."; 

इस तरह के कोड आसान लग रहा है, है ना?
इसलिए मुझे सच में विश्वास है कि इस तरह के उद्देश्यों के लिए return का उपयोग समझ में आता है।

लेकिन मुझे लगता है कि यहां मुख्य बिंदु है - स्थिरता ढीला न करें! हमारे उदाहरण में, हम हमेशा एक ही डेटा प्रकार में एक परिणाम लौट और एक ही व्यापार तर्क के साथ, और उदाहरण के लिए:

if (err) { 
    if (err.message) { 
     return err; 
    } 
    // Here some stuff... 
    // Few lines of code... 
    // 
    return -1; 
} 
// Another code... 
// 
if (!user) { 
    return null; 
} 
// And somewhere in the end on anothere scrollin screen 
//  
return user.email; 

इस उदाहरण देता object या number या null या string - और यह एक और बुरा सपना है ...
और बड़े कार्यों में असली परियोजनाओं में, बहुत रिटर्न की वजह से इस तरह के कोड प्राप्त करना वास्तव में आसान है ...
तो यहां बेहतर रिटर्न की कम गिनती है, क्योंकि यह समर्थन करना आसान है ...

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