2012-05-29 27 views
20

आज किसी ने मुझे जावा में return कीवर्ड के खराब उपयोग के लिए भाग लिया। मैंने किसी सरणी में कुछ मान्य करने के लिए एक सरल for लूप लिखा था। मान array लंबाई की एक सरणी है n यह मेरा कोड था:लूप या बाहरी लूप के लिए वापसी

for(int i=0; i<array.length; ++i){ 
    if(array[i]==valueToFind) return true; 
} 
return false; 

अब किसी ने मुझसे कहा कि यह बहुत अच्छा प्रोग्रामिंग क्योंकि मैं एक पाश अंदर return कथन का उपयोग करते हैं और इस काम में रुकावट डालने कचरा संग्रहण का कारण होता नहीं है। इसलिए बेहतर कोड होगा:

int i = 0; 
while(i<array.length && array[i] != valueToFind) ++i; 
return i != array.length; 

समस्या यह है कि मैं क्यों पाश के लिए पहले एक अच्छा अभ्यास नहीं है एक उचित explenation के साथ नहीं आ सकता है। क्या कोई मुझे एक विस्तार दे सकता है?

+0

उस व्यक्ति ने वास्तव में ठीक नहीं होने के कारण के रूप में क्या किया? जीसी के साथ मेस? – Poindexter

+7

यदि जीसी कभी भी खराब हो जाता है, तो यह JVM का मुद्दा है, न कि आपके प्रोग्राम का ... आपका कोड पूरी तरह से मान्य है। –

+0

"इससे कचरा संग्रह खराब हो जाएगा": क्या आप विस्तारित कर सकते हैं? – assylias

उत्तर

47

अब किसी ने मुझसे कहा कि यह बहुत अच्छा प्रोग्रामिंग क्योंकि मैं एक पाश के अंदर वापसी कथन का उपयोग करें और इस खराबी के कचरा संग्रहण का कारण होता नहीं है।

यह गलत है, और सुझाव देता है कि आपको उस व्यक्ति से संदेह की डिग्री के साथ अन्य सलाह का इलाज करना चाहिए।

की "केवल एक वापसी कथन है" (या अधिक सामान्यतः, केवल एक ही निकास बिंदु) भाषाओं जहां सभी संसाधनों का प्रबंधन स्वयं करने के लिए है में महत्वपूर्ण है मंत्र - इस तरह से आप वाकई अपने सभी सफाई डाल कर सकते हैं कोड एक ही स्थान पर।

यह जावा में बहुत कम उपयोगी है: जैसे ही आप जानते हैं कि आपको वापस जाना चाहिए (और वापसी मूल्य क्या होना चाहिए), बस वापस आएं। इस तरह इसे पढ़ने में आसान है - आपको यह जानने के लिए बाकी की कोई भी विधि नहीं लेनी है कि क्या और क्या होने जा रहा है (finally ब्लॉक के अलावा)।

+4

एक एकल रिटर्न स्टेटमेंट कोड सम्मेलन का हिस्सा था जहां मैं काम करता था। मुझे लगता है कि यह बहुत घोंसले की ओर जाता है और कोड पढ़ने के लिए बहुत कठिन होता है। – brain

+2

@ ब्रेन: दरअसल। यह आम तौर पर * कारण * को समझने के बिना विचार पर विचार करने का परिणाम है * यह एक निश्चित संदर्भ में एक अच्छा विचार क्यों है। –

+1

अपवादों की उपस्थिति में, एक भी बाहर निकलना केवल अक्षम है, क्योंकि नॉनट्रिविअल कोड का कोई भी टुकड़ा एक बढ़ा सकता है। कोड को कुछ नियमों के अनुसार व्यवहार करने के लिए मजबूर करने के बजाय यहां भाषा के प्रवाह के साथ जाना बेहतर है जो किसी भिन्न पर्यावरण/भाषा में समझ में आ सकता है। –

6

अब किसी ने मुझसे कहा कि यह बहुत अच्छा प्रोग्रामिंग क्योंकि मैं एक पाश के अंदर वापसी कथन का उपयोग और इस कचरे संग्रह खराब हो जाएगा नहीं है।

यह बकवास का एक गुच्छा है। विधि के अंदर सबकुछ साफ हो जाएगा जब तक कक्षा या अन्य जगहों में इसके अन्य संदर्भ नहीं थे (एक कारण क्यों encapsulation महत्वपूर्ण है)। अंगूठे के नियम के रूप में, आमतौर पर एक रिटर्न स्टेटमेंट का उपयोग करना बेहतर होता है क्योंकि यह पता लगाना आसान होता है कि विधि कहां से बाहर निकल जाएगी।

व्यक्तिगत रूप से, मैं लिखने होगा:

किसी भी समारोह में एक भी वापसी कथन के उपयोग की वकालत सभी भाषाओं में
Boolean retVal = false; 
for(int i=0; i<array.length; ++i){ 
    if(array[i]==valueToFind) { 
     retVal = true; 
     break; //Break immediately helps if you are looking through a big array 
    } 
} 
return retVal; 
+5

मेह; आमतौर पर सबसे अधिक पठनीय कोड लिखना बेहतर होता है, जो भी वापसी विवरणों की संख्या के लिए है। उदाहरण के लिए, यदि आपके पास गार्ड क्लॉज का गुच्छा है, तो प्रत्येक (आईएमओ) तुरंत विफलता पर वापस आना चाहिए। –

+0

एक साइड नोट के रूप में, इस विधि में जीसी के लिए कुछ भी नहीं है, क्योंकि यहां कोई ऑब्जेक्ट आवंटन नहीं है। –

+0

डेव के साथ निश्चित रूप से सहमत हैं - मुझे नहीं लगता कि "जहां विधि से बाहर निकलेंगे" क्यों किसी भी महत्व का है। क्या मायने रखता है कि आप विधि के तर्क का कितना आसानी से पालन कर सकते हैं। –

3

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

यह किसी भी तरह से कचरा संग्रह गड़बड़ नहीं करेगा !!

ऐसा करने का बेहतर तरीका एक बूलियन मान सेट करना है, अगर आप उसे सुनना चाहते हैं।

boolean flag = false; 
for(int i=0; i<array.length; ++i){ 
    if(array[i] == valueToFind) { 
     flag = true; 
     break; 
    } 
} 
return flag; 
2

कुछ लोग तर्क देते हैं कि एक विधि में बाहर निकलने का एक बिंदु होना चाहिए (उदाहरण के लिए, केवल एक return)।निजी तौर पर, मुझे लगता है कि उस नियम से चिपकने की कोशिश कोड को उत्पन्न करती है जो पढ़ने में मुश्किल होती है। आपके उदाहरण में, जैसे ही आप जो खोज रहे थे उसे ढूंढें, इसे तुरंत वापस करें, यह स्पष्ट है और यह कुशल है।

Quoting the C2 wiki:

एक ही प्रविष्टि और एक समारोह के लिए एक बाहर निकलने के होने का मूल महत्व है कि यह StructuredProgramming की मूल परिभाषा के भाग के रूप अनुशासनहीन गोटो SpaghettiCode करने का विरोध किया था, और पर एक साफ गणितीय विश्लेषण की अनुमति दी है वह आधार

अब संरचित प्रोग्रामिंग दिन जीतने के बाद से बहुत लंबा है, कोई भी विशेष रूप से इसके बारे में परवाह नहीं करता है, और शेष पृष्ठ बड़े पैमाने पर सर्वोत्तम प्रथाओं और सौंदर्यशास्त्र के बारे में है और ऐसे में, संरचित प्रोग्रामिंग संरचनाओं के गणितीय विश्लेषण के बारे में नहीं है।

1

दोनों मामलों में कोड मान्य है (यानी संकलित और निष्पादित)।

विश्वविद्यालय में मेरी व्याख्याताओं में से एक ने हमें बताया है कि यह वांछनीय किसी भी पाश में continue, return बयान के लिए नहीं है - for या while। इसका कारण यह है कि कोड की जांच करते समय, यह तुरंत स्पष्ट नहीं होता है कि लूप की पूरी लंबाई निष्पादित की जाएगी या return या continue प्रभावी होगा।

उदाहरण के लिए Why is continue inside a loop a bad idea? देखें।

ध्यान में रखना महत्वपूर्ण बात यह है कि इस तरह के साधारण परिदृश्यों के लिए यह (आईएमओ) मायने नहीं रखता है, लेकिन जब आपके पास रिटर्न वैल्यू निर्धारित करने के लिए जटिल तर्क होता है, तो कोड 'आम तौर पर' अधिक पठनीय होता है यदि आपके पास एकल है कई के बजाय वापसी बयान।

कचरा संग्रह के संबंध में - मुझे नहीं पता कि यह एक मुद्दा क्यों होगा।