2009-12-11 14 views
11

मैं गंदा हर बार लग रहा है कि मैं एक के लिए-प्रत्येक निर्माण (PHP/जावास्क्रिप्ट) से बाहर "तोड़"... तोड़ने

तो कुछ इस तरह:

// जावास्क्रिप्ट उदाहरण

for (object in objectList) 
{ 
    if (object.test == true) 
    { 
     //do some process on object 
     break; 
    } 

} 

बड़ी वस्तु सूची के लिए मैं परेशानी के निर्माण के माध्यम से एक और अधिक सुरुचिपूर्ण समाधान के माध्यम से जाना होगा। लेकिन छोटी सूचियों के लिए कोई उल्लेखनीय प्रदर्शन मुद्दा नहीं है और इसलिए "क्यों नहीं?" यह समझने और पालन करने के लिए त्वरित और अधिक महत्वपूर्ण रूप से आसान है।

लेकिन यह सिर्फ "गलत लगता है"। एक गोटो स्टेटमेंट की तरह।

आप इस तरह की स्थिति को कैसे संभालेंगे?

+0

मुझे पता है कि आप क्या कह रहे हैं, लेकिन हर कोई सही रास्ते पर है - ब्रेक ठीक है, खासकर छोटी सूचियों के लिए। मेरी बड़ी सूचियां आम तौर पर डीबी प्रश्नों से होती हैं, और यदि मुझे रिकॉर्ड के उप-समूह को खींचने के लिए वहां LIMIT फ़ंक्शन का उपयोग करना है। संक्षिप्त उत्तर - "ब्रेक" या "जारी रखें" – jbnunn

+0

का उपयोग करने के बारे में बुरा महसूस न करें आपका कोड इस तरह से काम नहीं करेगा क्योंकि for..in ऑपरेटर हमेशा ऑब्जेक्ट की चाबियों (तारों) पर फिर से सक्रिय होगा। आप शायद इस तरह कुछ मतलब है: (ऑब्जेक्टलिस्ट में var कुंजी) { var object = objectList [key]; ... } –

उत्तर

27

मैं ब्रेक का उपयोग करता हूं। यह एक पूरी तरह से क्रांतिकारी समाधान है।

+16

+1 "cromulent" शब्द के उपयोग के लिए +1। –

+0

'क्रॉमुलेंट '! मुझे यह पसंद है –

+0

मुझे "क्रॉमुलेंट" के बारे में क्या पसंद है यह है कि इसका मतलब यह है कि - यह एक शब्द है जो संदर्भ से इसका अर्थ स्पष्ट रूप से स्पष्ट है। –

1

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

1

मैं break कथन का उपयोग करूंगा।

2

छोटी सूचियों के लिए, ऐसा करने में कोई समस्या नहीं है। जैसा कि आप उल्लेख करते हैं, आप बड़ी सूचियों (विशेष रूप से अज्ञात आकारों के साथ सूचियों) के लिए अधिक 'सुरुचिपूर्ण' समाधान के बारे में सोचना चाह सकते हैं।

कभी-कभी यह गलत लगता है, लेकिन यह ठीक है। आप समय में break से प्यार करना सीखेंगे।

+0

मुझे नहीं पता .... मैं लगभग 15 वर्षों तक प्रोग्रामिंग कर रहा हूं। मैं इसे करता हूं (ब्रेक का उपयोग करें), यह कभी-कभी धोखा देने जैसा लगता है .... – ChronoFish

2

जैसा कि आपने कहा था "" क्यों नहीं? "यह समझना और पालन करना त्वरित और अधिक महत्वपूर्ण है।"

गंदे क्यों लगते हैं, मुझे इसके साथ कुछ भी गलत नहीं लगता है।

2

मुझे लगता है कि पढ़ना आसान है और इसलिए इसे बनाए रखना आसान है।

2

यह ऐसा होना है। ब्रेक को लूप से बाहर निकलने के लिए डिज़ाइन किया गया है। यदि आपको लगता है कि आपको लूप में क्या चाहिए तो लूप क्यों चल रहा है?

0

शायद मैं आपके उपयोग-मामले को गलत समझ रहा हूं, लेकिन क्यों तोड़ना है? मुझे लगता है कि आप सूची में सबसे अधिक तत्व पर परीक्षण की उम्मीद कर रहे हैं?

यदि कोई प्रदर्शन समस्या नहीं है और आप कोड को साफ़ करना चाहते हैं तो आप हमेशा परीक्षण और ब्रेक को छोड़ सकते हैं।

for (object in objectList) 
{ 
    //do some process on object 
} 

इस तरह यदि आपको एक से अधिक तत्वों पर प्रक्रिया करने की आवश्यकता है तो आपका कोड ब्रेक नहीं होगा (पन इरादा)।

+0

मैं केवल उन मामलों को तोड़ दूंगा जहां मैं अपने परीक्षण खंड से मेल खाने के लिए पहली (या केवल) आइटम ढूंढना चाहता हूं। लूप जारी रखना बस इन मामलों में चक्रों को जल रहा है। – ChronoFish

+0

यह इस बात पर निर्भर करता है कि आप मस्तिष्क-चक्र या सीपीयू-चक्रों को जलाने के बारे में अधिक चिंतित हैं या नहीं। ब्रेकिंग एक अनुकूलन है - यह एक उचित हो सकता है लेकिन यदि सूची छोटी है तो इसे छोड़ने पर विचार करें जब तक आपको पता न हो कि आपको इसकी आवश्यकता है। – ctford

0

मेरी प्राथमिकता केवल break का उपयोग करना है। यह तेज़ है और आम तौर पर चीजों को जटिल नहीं करता है।

आप एक for, while, या do while पाश का उपयोग करते हैं, तो आप एक चर का उपयोग निर्धारित करने के लिए कर सकते हैं या नहीं, जारी रखने के लिए:

for ($i = 0, $c = true; ($i < 10) && $c; $i++) { 
    // do stuff 

    if ($condition) { 
     $c= false; 
    } 
} 

एक ही रास्ता एक foreach पाश से तोड़ने के लिए break या return है ।

+0

मैं ऐसा करता हूं, हालांकि आमतौर पर केवल 'while' लूप के साथ। – Tenner

+4

तो आप 'ध्वज, पांच लाइनें, और' ब्रेक 'से '&&' जोड़ना चाहते हैं; – Tordek

+0

-1 यह कोई लाभ नहीं है – JonH

5

यह समझने और अनुसरण करने के लिए त्वरित और अधिक महत्वपूर्ण रूप से आसान है।

ब्रेक के बारे में बुरा मत समझना। गोटो इस पर फंस गया है क्योंकि यह जल्दी और अधिक महत्वपूर्ण है समझने और अनुसरण करने में आसान है।

2

तोड़ता है और जारी नहीं होता है। वे वहां किसी कारण की वजह से हैं। जैसे ही आप लूप संरचना के साथ काम करते हैं, लूप से बाहर निकलें।

अब, मैं जो भी बचूँगा वह बहुत गहरा घोंसला (ए.के.ए. तीरहेड डिज़ाइन एंटी-पैटर्न) है।

if (someCondition) 
{ 
    for (thing in collection) 
    { 
     if (someOtherCondition) 
     { 
      break; 
     } 
    } 
} 

यदि आप ब्रेक करने जा रहे हैं, तो सुनिश्चित करें कि आपने अपना कोड तैयार किया है ताकि यह केवल एक स्तर गहरा हो। पुनरावृत्ति को यथासंभव उथले रखने के लिए फ़ंक्शन कॉल का उपयोग करें।

if (someCondition) 
{ 
    loopThroughCollection(collection); 
} 

function loopThroughCollection(collection) 
{ 
    for (thing in collection) 
    { 
     if (someOtherCondition) 
     { 
      doSomethingToObject(thing); 
      break; 
     } 
    } 
} 

function doSomethingToObject(thing) 
{ 
    // etc. 
} 
+0

एक बार जब मैंने प्रोग्रामिंग शुरू की, तो मुझे पासवर्ड चेक के लिए वास्तव में कूल नेस्टेड किया गया था .... :) – starcorn

0

एक

Object object; 
int index = 0; 

do 
{ 
    object = objectList[index]; 
    index++; 
} 
while (object.test == false) 

का प्रयोग करता है, तो एक for पाश से तोड़ने आप असहज महसूस करता है।

+0

यह एक संख्यात्मक सूचकांक मानता है। – ChronoFish

+0

इस विचार को तब तक बढ़ाएं जब तक कि इसे समझाया जा सके और एक आइटम से अगले तक जाने का एक तरीका है। – luvieere

4

देखें, ब्रेक मुझे पर पर बग नहीं करता है। प्रोग्रामिंग गेटो पर बनाया गया है, और सभी नियंत्रण संरचनाओं की तरह - ब्रेक-ब्रेक - केवल आपके कोड की पठनीयता में सुधार करने के लिए गोटो का एक विशेष उद्देश्य फ़ॉर्म है। कभी भी पठनीय कोड लिखने के बारे में बुरा मत मानो!

अब, मैं कर , true को सीधे तुलना के बारे में गंदा लग रहा है विशेष रूप से जब प्रकार परिवर्तित करने समानता ऑपरेटर का उपयोग ... ओह, हाँ। आपने जो लिखा है - if (object.test == true) - if (object.test) लिखने के बराबर है, लेकिन अधिक विचार की आवश्यकता है। यदि आप वास्तव में चाहते हैं कि तुलना केवल object.test दोनों बूलियन मान औरtrue दोनों की तुलना में सफल हो, तो आप the strict equality operator (===) का उपयोग करेंगे ... अन्यथा, इसे छोड़ दें।

+2

"== सच" चीज़ के बारे में अच्छा बिंदु। मैं हमेशा यह सुझाव देना चाहता हूं कि लोग "if ((object.test == true) == true) का उपयोग करें," यह देखने के लिए कि क्या वे यह हास्यास्पद हैं कि यह कितना हास्यास्पद है। –

1

सामान्यतः break कथन के साथ कुछ भी गलत नहीं है। हालांकि यदि आपका कोड आपके कोड बेस के विभिन्न स्थानों पर दिखाई देता है तो आपका कोड एक समस्या बन सकता है। इस मामले में break कथन डुप्लिकेट कोड के लिए कोड छोटे हैं।

आप आसानी से एक पुन: प्रयोज्य समारोह में खोज निकाल सकते हैं:

function findFirst(objectList, test) 
{ 
    for (var key in objectList) { 
    var value = objectList[key]; 
    if (test(value)) return value; 
    } 
    return null; 
} 

var first = findFirst(objectList, function(object) { 
    return object.test == true; 
} 
if (first) { 
    //do some process on object 
} 

आप हमेशा किसी तरह से पाया तत्व की प्रक्रिया यदि आप अपने कोड आगे सरल कर सकते हैं:

function processFirstMatch(objectList, test, processor) { 
    var first = findFirst(objectList, test); 
    if (first) processor(first); 
} 

processFirst(
    objectList, 
    function(object) { 
    return object.test == true; 
    }, 
    function(object) { 
    //do some process on object 
    } 
} 

तो आप उपयोग कर सकते जावास्क्रिप्ट में कार्यात्मक विशेषताओं की शक्ति को अपना मूल कोड अधिक अभिव्यक्तिपूर्ण बनाने के लिए। साइड इफेक्ट के रूप में यह आपके नियमित कोड बेस से एक सहायक समारोह में break कथन को धक्का देगा।

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