2012-07-30 26 views
55
पुस्तक जावास्क्रिप्ट में

: अच्छी पार्ट्स डगलस Crockford द्वारा, यह सब लेखक जारी रखने के वक्तव्य के बारे में क्या कहना है है:जावास्क्रिप्ट में "जारी रखें" बयान क्यों खराब हैं?

continue बयान पाश की चोटी पर कूदता है। मैंने कोड का एक टुकड़ा कभी नहीं देखा है जिसे continue कथन को हटाने के लिए इसे पुन: सक्रिय करके सुधार नहीं किया गया था।

यह वास्तव में मुझे भ्रमित करता है। मुझे पता है कि क्रॉकफोर्ड के पास जावास्क्रिप्ट पर कुछ बहुत ही विचार किए गए विचार हैं, लेकिन यह सिर्फ मेरे लिए पूरी तरह से गलत लगता है।

सबसे पहले, continue बस एक लूप के शीर्ष पर कूदने से कहीं अधिक है। डिफ़ॉल्ट रूप से, यह अगले पुनरावृत्ति में भी प्रगति करता है। तो क्रॉकफोर्ड का बयान सिर्फ पूरी तरह झूठी सूचना नहीं है?

अधिक महत्वपूर्ण बात यह है कि, मुझे पूरी तरह से समझ में नहीं आता कि continue को भी बुरा माना जाएगा। Why is continue inside a loop a bad idea?

हालांकि मैं समझ कैसे continue कोड कुछ मामलों में पढ़ने के लिए कठिन बना सकती हैं, मुझे लगता है कि बस के रूप में होने की संभावना है कि यह कोड अधिक पठनीय बना सकते हैं: इस पोस्ट में क्या आम धारणा हो रहा है प्रदान करता है। उदाहरण के लिए:

var someArray=['blah',5,'stuff',7]; 
for(var i=0;i<someArray.length;i++){ 
    if(typeof someArray[i]==='number'){ 
     for(var j=0;j<someArray[i];j++){ 
      console.log(j); 
     } 
    } 
} 

यह पुनर्संशोधित किया जा सकता है में:

var someArray=['blah',5,'stuff',7]; 
for(var i=0;i<someArray.length;i++){ 
    if(typeof someArray[i]!=='number'){ 
     continue; 
    } 
    for(var j=0;j<someArray[i];j++){ 
     console.log(j); 
    } 
} 

continue इस विशिष्ट उदाहरण में विशेष रूप से लाभप्रद नहीं है, लेकिन यह सच है कि यह नेस्टिंग गहराई कम कर देता है को प्रदर्शित करता है। अधिक जटिल कोड में, यह संभावित रूप से पठनीयता में वृद्धि कर सकता है।

क्रॉकफोर्ड कोई स्पष्टीकरण प्रदान नहीं करता है कि continue का उपयोग क्यों नहीं किया जाना चाहिए, तो क्या इस राय के पीछे कुछ गहरा महत्व है कि मुझे याद आ रही है?

+0

कीवर्ड 'जारी रखें' एक उपकरण है - जहां लागू हो वहां इसका उपयोग करें। कुछ समय यह आवश्यक है, ज्यादातर बार यह नहीं है। एकमात्र समय यह बुरा है जब आपको इसका उपयोग करने की आवश्यकता नहीं थी, लेकिन यह एक और तरीका करने के लिए बहुत आलसी या मैला था। – slugster

+0

मुझे एक ही भावना थी और इसलिए मैंने अपना [पोस्ट] बनाया (http://stackoverflow.com/questions/30030033/continue-statement-confusion)। जारी बयान का उपयोग करते समय मुझे 'हॉप' शब्द के बारे में सोचने में क्या मदद मिली। मुझे लगता है कि श्री क्रॉफर्ड ने भाषा को डिजाइन करते समय यहां एक खराब शब्द का इस्तेमाल किया: पी विशेष रूप से हॉप इसके पीछे तर्क 'जारी' लागू कर सकता है। यदि आप किसी ऐसी चीज़ पर आशा करते हैं जो आप आमतौर पर जारी रखते हैं। एक अच्छा सादृश्य के रूप में मैराथन ट्रैक धावकों के बारे में सोचें। –

+4

"श्री क्रॉफर्ड" ने भाषा को डिजाइन नहीं किया। – rlemon

उत्तर

60

कथन हास्यास्पद है। continue का दुरुपयोग किया जा सकता है, लेकिन यह अक्सर पठनीयता में मदद करता है।

विशिष्ट उपयोग:

for (somecondition) 
{ 
    if (!firsttest) continue; 

    some_provisional_work_that_is_almost_always_needed(); 

    if (!further_tests()) continue; 

    do_expensive_operation(); 
} 

लक्ष्य 'लज़ान्या' कोड है, जहां आप गहराई से नेस्टेड सशर्त है से बचना है। जोड़ने के लिए

संपादित:

हाँ, यह अंत में व्यक्तिपरक है। Here's my metric for deciding.

एक आखिरी बार संपादित:

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

+0

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

+0

मेरी पोस्ट देखें [यहां] (http://stackoverflow.com/questions/30030033/continue-statement-confusion)। मुझे लगता है कि शब्द पसंद सिर्फ गलत है, मुझे लगता है कि 'हॉप' का इस्तेमाल बेहतर शब्द होना चाहिए। लेकिन अब बहुत देर हो चुकी है! –

+0

'जारी रखने' का उपयोग करने से एक * कार्यात्मक * शैली में कोड को और अधिक पढ़ने की अनुमति मिलती है, उदाहरण के लिए: 'के लिए (ए में बी) {if (condition1) जारी रखें; अगर (condition2) जारी रखें; कुछ करो(); } '' b.filter (condition1) के समान है। फ़िल्टर (condition2) .forEach (a => ...); ' –

1

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

+0

तो सच है। आपके उत्तर में जोड़ने के लिए, ट्रांसलेटर आंतरिक रूप से जेनरेट असेंबली में प्रत्येक लूप के अंत में 'जारी रखें 'कथन के बराबर जोड़ता है। तो वास्तव में, न केवल बयान जारी है, बुरा नहीं है, वास्तव में वे वास्तव में बहुत अच्छे हैं। –

2

जारी रखें एल्गोरिदम में गणना चक्रों को सहेजने के लिए एक बेहद उपयोगी टूल है। निश्चित रूप से, यह अनुचित रूप से उपयोग किया जा सकता है लेकिन यह भी हर दूसरे कीवर्ड या दृष्टिकोण कर सकते हैं। प्रदर्शन के लिए प्रयास करते समय, सशर्त बयान के साथ पथ विचलन के लिए एक व्यस्त दृष्टिकोण लेने के लिए उपयोगी हो सकता है। एक निरंतर जब संभव हो तो कम कुशल पथ को छोड़ने की अनुमति देकर उलटा हो सकता है।

8

मैं यहां बहुमत से दूसरी तरफ व्यक्तिगत रूप से हूं। समस्या आमतौर पर दिखाए गए continue पैटर्न के साथ नहीं है, लेकिन अधिक गहराई से घोंसले वाले लोगों के साथ, जहां संभव कोड पथ देखना मुश्किल हो सकता है।

लेकिन यहां तक ​​कि continue के साथ आपका उदाहरण भी मेरी राय में सुधार नहीं दिखाता है जो उचित है। मेरे अनुभव से कुछ continue स्टेटमेंट्स बाद में रिफैक्टर करने के लिए दुःस्वप्न हैं (यहां तक ​​कि स्थिर भाषाओं के लिए भी जावा जैसे स्वचालित रीफैक्टरिंग के लिए उपयुक्त है, खासकर जब कोई बाद में break डालता है)। अपने आगे refactor करने की क्षमता inreases continue बयान को दूर करने के

पुनर्रचना:

इस प्रकार, मैं बोली आप दे दी है के लिए एक टिप्पणी जोड़ना होगा।

और आंतरिक लूप वास्तव में उदाहरण के लिए अच्छी तरह से उम्मीदवार हैं निकालें फ़ंक्शन। इस तरह के रिफैक्टरिंग तब किया जाता है जब आंतरिक पाश जटिल हो जाता है और फिर continue दर्दनाक हो सकता है।

यह एक टीम में जावास्क्रिप्ट परियोजनाओं पर व्यावसायिक रूप से काम करने के बाद मेरी ईमानदार राय है, वहां नियम है कि डगलस क्रॉकफोर्ड वास्तव में अपनी योग्यता दिखाने के बारे में बात करता है।

+4

मुझे यकीन नहीं है कि मुझे पता है कि आपका क्या मतलब है। क्या आप एक उदाहरण दे रहे हैं कि 'जारी' एक "रिफैक्टर के लिए दुःस्वप्न" बन जाएगा? इसके अलावा, "निकालने के कार्य" से आपका क्या मतलब है? क्या यह एक डिजाइन पैटर्न है? – twiz

+2

"एक्स्ट्रैक्ट फ़ंक्शन" ("एक्स्ट्रेक्ट विधि" के तहत भी गुगल किया जा सकता है) एक फ़ंक्शन के बॉडी के हिस्से को एक नए अलग फ़ंक्शन में निकालने के लिए एक रेफैक्टरिंग तकनीक है। लूप के शरीर से एक नया फ़ंक्शन बनाने के लिए यहां 2 जारी बयानों के साथ एक और उत्तर में सरल कोड भी लिखना होगा (जारी बयान से छुटकारा पाने के लिए)। जब आप अधिक घोंसले जारी बयान के साथ बड़े निकायों को प्राप्त करते हैं, तो आपके कोड को साफ करने में बहुत समय लगता है। –

5

डगलस क्रॉकफ़ोर्ड इस तरह महसूस कर सकता है क्योंकि वह एक सशर्त के भीतर असाइनमेंट में विश्वास नहीं करता है। वास्तव में, जावास्क्रिप्ट करता है, भले ही उसका प्रोग्राम जेएसलिंट आपको ऐसा करने देता है। वह कभी लिखते थे:

उदाहरण 1

while (rec = getrec()) 
{ 
    if (condition1(rec)) 
     continue; 

    doSomething(rec); 
} 

लेकिन, मेरा अनुमान है कि वह होगा की तरह कुछ लिखने:

उदाहरण 2

rec = getrec(); 

while (rec) 
{ 
    if (!condition(rec)) 
     doSomething(rec); 

    rec = getrec(); 
} 

दोनों इन कार्यों में से, लेकिन यदि आप गलती से इन सेंट मिश्रण करते हैं

उदाहरण 3

rec = getrec(); 

while (rec) 
{ 
    if (condition1(rec)) 
     continue; 

    rec = getrec(); 
} 

यही कारण है कि वह पसंद नहीं करता जारी है का हिस्सा हो सकता: yles आप अनंत लूप मिलता है।

+0

आपके पास एक बिंदु हो सकता है, लेकिन मेरा मानना ​​है कि वह आम तौर पर पहले स्थान पर 'लूप्स' का विरोध करता है। – twiz

+4

@twiz: मेरा बिंदु 'for' loops और 'do' loops पर भी लागू होता है। निश्चित रूप से वह * कुछ * प्रकार के पाश में विश्वास करता है! –

+0

'rec = getrec(); 'दो बार प्रकट होता है, उल्लंघन करना स्वयं को दोहराएं मत। –

2

वास्तव में, सभी विश्लेषण से ऐसा लगता है: - (? भी, वहाँ कुछ निष्पादन लाभ हो सकते)

  1. आप उथले छोरों है, तो जारी रखने के लिए उपयोग करने के लिए स्वतंत्र लग रहा है iff यह पठनीयता में सुधार।
  2. यदि आपके पास गहरे घोंसले वाले लूप हैं (जिसका अर्थ है कि आपके पास फिर से कारक होने पर पहले से ही बाधा डालना है) जारी रखने से बचने से कोड विश्वसनीयता दृष्टिकोण से लाभकारी साबित हो सकता है।

डगलस Crokford के बचाव में, मुझे लगता है कि उसकी सिफारिशों defensive programming की ओर झुक कर, सभी ईमानदारी में 'बेवकूफ प्रूफ' उद्यम में कोड के लिए एक अच्छा दृष्टिकोण की तरह लगता है जो, करते हैं लग रहा है।