2010-09-22 6 views
5

Ich benutze dieses Muster, das normalerweise über Objekteigenschaften iterieren:Ist ein if mit einer Fortsetzung ein gutes Muster, um übermäßige Verschachtelung beim Iterieren über Eigenschaften in Javascript zu verhindern?

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

ich diese übermäßige Vertiefung nicht mögen und es wurde mir vor kurzem darauf hingewiesen, dass ich, dies zu tun es loswerden konnte:

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

    ... 
} 

Ich mag dies, weil es die zusätzliche Ebene der Einrückung nicht einführt. Ist dieses Muster in Ordnung, oder gibt es bessere Möglichkeiten?

Antwort

5

Ich persönlich bevorzuge:

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

Es gibt keine zusätzliche Ebene der Vertiefung ist, weil for, if usw. die nächste Anweisung nehmen, wenn Sie die geschweiften Klammern auslassen. Da wir alle unseren Code in den if hasOwnProperty Block setzen, macht es alle Klammern für die for Anweisung unnötig.

Im Wesentlichen ist es gleichbedeutend mit:

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

Danke - das hilft auf jeden Fall eine Menge. War mir nicht bewusst, dass Sie den Code auf diese Weise strukturieren könnten! –

+0

+1, ich mag das sehr und ich denke, ich werde anfangen es zu benutzen! (Es fühlt sich ein wenig an wie Pythons Listenkompressen und Generatoren, obwohl ich in dieser Sprache noch keine Programmierung gemacht habe) –

2

syntaktisch ich so etwas wie dies

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 
} 

schön aussieht bevorzugen würde, aber es bringt zwei Schleifen über das gleiche Objekt, nicht recht Leistung klug.

Der andere Weg, es zu tun ist 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 
}); 

nur eine Schleife, sondern eine Funktion für jede Iteration genannt wird, die nicht groß Leistung klug, aber besser als die letzte Lösung. Beachten Sie, dass es auch den Wert this übertrifft, aber Sie können diesen Wert explizit als optionales 3. Argument übergeben.

Nur einige Alternativen. Die Art und Weise, wie Sie es tun, und die Art und Weise, die Daniel erklärt, ist in Ordnung und ohne Kompromisse bei der Leistung.

Auch würde Ich mag darauf hinweisen, dass Sie haben nicht Code für jede einzelne geschweifte Klammer einrücken ...

+0

+1 für foreach. – Anurag

+0

Danke! Ich mag die 'foreach' Funktion! –

1

Ein Faktor abhängt, ob Sie nach Douglas Crockford hören. In seinem Buch JavaScript: The Good Parts verklumpt er continue mit den schlechten Teilen.

"Ich habe noch nie einen Code gesehen, der nicht durch Refactoring verbessert wurde, um die Continue-Anweisung zu entfernen." - Douglas Crockford, JavaScript: The Good Parts

Als Tim Down- in seinem Kommentar erwähnt, gibt Crockford keinen Grund, in dem Buch zu erklären, warum continue sollte vermieden werden. Aber auf his website sagt er: "Es neigt dazu, den Kontrollfluss der Funktion zu verdecken." Ich erwähne nur Crockfords Meinung, da viele ihn für eine Autorität halten.

Persönlich sehe ich kein Problem mit, wie Sie Ihre Schleife codiert haben, besonders seit der continue erscheint ganz oben, wo es nicht leicht übersehen werden kann. Arbeiten Sie mit einem Team von Entwicklern?Haben sie ein gutes Verständnis davon, was continue tut? Verfügen Sie über ein Code-Conventions-Dokument, in dem es darum geht, mit der tiefen Verschachtelung von Anweisungen umzugehen?

+1

Es ist eine Behauptung, die nichts ohne irgendeine Argumentation bedeutet, um es zu unterstützen. –

+1

Sie haben Recht, und es gibt einen verdächtigen Mangel an Argumenten in dem Buch. Auf seiner Website sagt er nur, die continue-Anweisung "neigt dazu, den Kontrollfluss der Funktion zu verdecken." Dennoch dachte ich, dass es erwähnenswert ist, da viele Entwickler die Wörter von Douglas Crockford als das Wort des Herrn nehmen, wenn es um JavaScript geht. – stevelove

+0

Ja, ich habe 'continue' zusammen mit' break' gesehen. Ich benutze selten 'break', aber ich habe festgestellt, dass es in einigen Fällen die Lesbarkeit verbessert. –

0

Mcconnel:

Eine Schleife mit vielen Breaks unklar Gedanken über die Struktur der Schleife oder ihre Rolle in dem umgebenden Code anzeigen. Übermäßige Brüche wirft oft darauf hin, dass die Schleife deutlicher als eine Reihe von Schleifen ausgedrückt werden könnte. Verwendung der Pause beseitigt die Möglichkeit, eine Schleife als eine Blackbox zu behandeln. Steuern Sie eine Schleife Exit-Bedingung mit einer Anweisung, um Ihre Schleifen zu vereinfachen. "break" zwingt die Person lesen Sie Ihre Code nach innen zu sehen, um die Schleife Kontrolle zu verstehen, so dass die Schleife mehr schwierig zu verstehen.

Dijkstra:

Funktionen wie Pause neigen die Vorteile von strukturierten Programmierung und verhindern, dass die Programmierer Verständnis der Programm als eine Zusammensetzung von unabhängige Einheiten

zu sabotieren

Loops mit Continue können in diese Form faktorisiert werden und somit kann die Schleife als Blackbox behandelt werden. Crawford liegt falsch. Pausen riechen, aber weiter ist gut.

weitere Analyse: http://sites.google.com/site/dustingetz/dev/break-and-continue