2010-09-22 27 views
5

मैं सामान्य रूप से वस्तु के गुण से अधिक पुनरावृति करने के लिए इस पद्धति का उपयोग करें:क्या जावास्क्रिप्ट में गुणों को पुन: सक्रिय करते समय अत्यधिक घोंसले को रोकने के लिए एक अच्छा पैटर्न जारी रखना है?

for(var property in object) { 
    if(object.hasOwnProperty(property)) { 
     ... 
    } 
} 

मैं इस अत्यधिक खरोज पसंद नहीं है और हाल ही में यह मेरे लिए बताया गया मैं ऐसा करके यह से छुटकारा मिल सकता है कि:

for(var property in object) { 
    if(!object.hasOwnProperty(property)) { 
     continue; 
    } 

    ... 
} 

मुझे यह पसंद है क्योंकि यह इंडेंटेशन के अतिरिक्त स्तर को पेश नहीं करता है। क्या यह पैटर्न ठीक है, या क्या बेहतर तरीके हैं?

उत्तर

5

मैं व्यक्तिगत रूप से पसंद करते हैं:

for(var property in object) if(object.hasOwnProperty(property)) { 
    ... 
} 

वहाँ खरोज के बिना किसी अतिरिक्त स्तर अगर आप घुंघराले ब्रेसिज़ बाहर छोड़ क्योंकि for, if, आदि अगले स्टेटमेंट ले जाएगा है। चूंकि हमने अपना सभी कोड if hasOwnProperty ब्लॉक के अंदर रखा है, इसलिए यह for कथन के लिए अनावश्यक बनाता है।

मूलतः यह के बराबर है:

for(var property in object) { 
    if(object.hasOwnProperty(property)) { 
    ... 
    } else { 
     continue; 
    } 
} 
+0

धन्यवाद - यह निश्चित रूप से एक बहुत मदद करता है। पता नहीं था कि आप इस तरह से कोड की संरचना कर सकते हैं! –

+0

+1, मुझे यह बहुत पसंद है और मुझे लगता है कि मैं इसका उपयोग शुरू करने जा रहा हूं! (यह पाइथन की सूची समझ और जनरेटर की तरह थोड़ा सा लगता है, वास्तव में, हालांकि मैंने उस भाषा में कोई प्रोग्रामिंग नहीं किया है) –

2

Syntacticly मैं इस

function own(obj) { 
    var ownprops = {}; 
    for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) ownprops[prop] = 1; 

    return ownprops; 
} 

for (var property in own(object)) { 
//code 
} 

की तरह कुछ करना चाहते अच्छा लग रहा है, लेकिन यह एक ही वस्तु पर दो छोरों जरूरत पर जोर देता, सुंदर नहीं बुद्धिमान प्रदर्शन।

यह करने के लिए अन्य तरीके से functionaly

function foreach(obj, func, thisp) { 
    for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop); 
} 

foreach(object, function(val, key) { 
    //code 
}); 

केवल एक पाश है, लेकिन एक समारोह हर यात्रा है, जो शानदार प्रदर्शन बुद्धिमान लेकिन पिछले समाधान की तुलना में बेहतर नहीं है के लिए कहा जाता है। ध्यान दें कि यह this के मान को भी ढकता है, लेकिन आप उस मान को वैकल्पिक रूप से वैकल्पिक 3 तर्क के रूप में पारित कर सकते हैं।

बस कुछ विकल्प। जिस तरह से आप इसे कर रहे हैं, और डैनियल द्वारा समझाया गया तरीका ठीक है, और प्रदर्शन समझौता किए बिना।

इसके अलावा, मैं कहना है कि आप नहीं है हर एक घुंघराले ब्रेस के लिए अपने कोड को इंडेंट करने है चाहता हूँ ...

+0

+1 फ़ोरैच के लिए। – Anurag

+0

धन्यवाद! मुझे 'foreach' समारोह पसंद है! –

1

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

"मैंने कभी भी कोड का एक टुकड़ा नहीं देखा है जो जारी बयान को हटाने के लिए इसे पुन: सक्रिय करके सुधार नहीं किया गया था।" - डगलस Crockford, जावास्क्रिप्ट: अच्छी पार्ट्स

रूप टिम नीचे उसकी टिप्पणी में उल्लेख किया है, Crockford किताब में कोई कारण नहीं है समझाने के लिए क्यों continue से बचा जाना चाहिए देता है। लेकिन his website पर वह कहता है, "यह फ़ंक्शन के नियंत्रण प्रवाह को अस्पष्ट करता है।" मैं केवल क्रॉकफोर्ड की राय का उल्लेख करता हूं क्योंकि कई लोग उसे एक अधिकार मानते हैं।

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

+1

यह एक दावा है जिसका अर्थ है कि इसे वापस करने के किसी भी तर्क के बिना कुछ भी नहीं। –

+1

आप सही हैं, और पुस्तक में तर्क की एक संदिग्ध कमी है। अपनी वेबसाइट पर, वह केवल कहते हैं कि जारी बयान "समारोह के नियंत्रण प्रवाह को अस्पष्ट करता है।" फिर भी, मैंने सोचा कि यह उल्लेखनीय है क्योंकि कई डेवलपर्स जावास्क्रिप्ट की बात करते समय डगलस क्रॉकफोर्ड के शब्दों को भगवान के वचन के रूप में लेते हैं। – stevelove

+0

हां, मैंने 'ब्रेक' के साथ मिलकर 'जारी रखा' देखा है। मैं शायद ही कभी 'ब्रेक' का उपयोग करता हूं लेकिन मुझे पता चला है कि कुछ मामलों में यह वास्तव में पठनीयता में सुधार करता है। –

0

McConnel:

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

डिज्कस्ट्रा: ब्रेक की तरह

सुविधाओं संरचित प्रोग्रामिंग के लाभ तोड़फोड़, और स्वतंत्र इकाइयां

की एक संरचना के रूप में कार्यक्रम को समझने से प्रोग्रामर को रोकने के लिए करते हैं

जारी रखने वाले लूप इस फ़ॉर्म में फैक्टर किए जा सकते हैं और इस प्रकार लूप को ब्लैक बॉक्स के रूप में माना जा सकता है। क्रॉफर्ड गलत है। गंध तोड़ता है, लेकिन जारी है अच्छा है।

आगे के विश्लेषण: http://sites.google.com/site/dustingetz/dev/break-and-continue