Wenn ich eine komplexe if-Aussage hätte, die ich nicht nur aus ästhetischen Gründen überlaufen wollte, was wäre der koschere Weg, sie aufzubrechen, da Coffeescript in diesem Fall die Rückgabe als Hauptteil der Aussage interpretiert?
if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar)
awesome sauce
else lame sauce
coffeescript
Evan
quelle
quelle
not bar
es eine Möglichkeit in der ersten Klausel gibt (wie die zweite Klausel vorschlägt), dann wird die Referenzbar.data
einen Fehler verursachen ...Antworten:
CoffeeScript interpretiert die nächste Zeile nicht als Hauptteil der Anweisung, wenn die Zeile mit einem Operator endet. Dies ist also in Ordnung:
# OK! if a and not b c()
es kompiliert zu
if (a && !b) { c(); }
So können Sie
if
als formatiert werden# OK! if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar) awesome sauce else lame sauce
oder ein anderes Zeilenumbruchschema, solange die Zeilen in
and
oderor
oderis
oder==
odernot
oder einem solchen Operator endenIn Bezug auf die Einrückung können Sie die nicht ersten Zeilen Ihrer Einrückung einrücken
if
, solange der Körper noch stärker eingerückt ist:# OK! if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar) awesome sauce else lame sauce
Was Sie nicht tun können, ist Folgendes:
# BAD if (foo #doesn't end on operator! is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar) awesome sauce else lame sauce
quelle
if
den Körper von statmenet nicht "noch mehr" einrücken möchten , können Sie ihn verwendenthen
, beginnend auf der gleichen Ebene wieif
. Es ist meiner Meinung nach besser lesbar.if
. Die einzigen Regeln für die korrekte Syntax sind (soweit ich weiß): 1) Der Körper kann nicht die gleiche Einrückung haben wie die erste oder letzte Zeile vonif
und 2) Weder der Körper noch eine Zeile vonif
kann weniger Einrückungen haben als die erste Zeile derif
. Beachten Sie auch, dass Sie in verschiedenen nicht erstenif
Zeilen unterschiedliche Einrückungen haben können .if
Zeilen mit 2 Tabulatoren ein (um besser sichtbar zu machen, dass sie sich weder nach noch innerhalb der befindenif
) und den Körper mit 1 Tabulatoren.Dies ändert die Bedeutung Ihres Codes etwas, kann aber von Nutzen sein:
return lame sauce unless foo and bar if foo is bar.data.stuff isnt bar.data.otherstuff awesome sauce else lame sauce
Beachten Sie die
is...isnt
Kette, die genauso legitim ist wiea < b < c
in CoffeeScript. Natürlich ist die Wiederholung vonlame sauce
unglücklich, und Sie möchten möglicherweise nichtreturn
sofort. Ein anderer Ansatz wäre, mit Soaks zu schreibendata = bar?.data if foo and foo is data?.stuff isnt data?.otherstuff awesome sauce else lame sauce
Das
if foo and
ist ein wenig unelegant; Sie könnten es verwerfen, wenn es keine Chancefoo
gibtundefined
.quelle
Wie jede andere Sprache, indem man sie überhaupt nicht hat. Geben Sie den verschiedenen Teilen Namen und behandeln Sie sie separat. Entweder durch Deklarieren von Prädikaten oder durch einfaches Erstellen einiger boolescher Vars.
bar.isBaz = -> @data.stuff != @data.otherstuff bar.isAwsome = (foo) -> @isBaz() && @data.stuff == foo if not bar? or bar.isAwesome foo awesome sauce else lame sauce
quelle
Dem Zeilenumbruch zu entkommen, erscheint mir am lesbarsten:
if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) \ or (not foo and not bar) awesome sauce else lame sauce
quelle
Wenn viele Low-Level-Boilerplates auftreten, sollten Sie den Grad der Zusammenfassung erhöhen .
Die besten Lösungen sind:
verwenden gut benannten Variablen und Funktionen
Logikregeln in if / else- Anweisungen
Eine der logischen Regeln lautet:
Der erste Weg. Variablen:
isStuff = foo is bar.data.stuff isntOtherStuff = foo isnt bar.data.otherstuff isStuffNotOtherStuff = isStuff and isntOtherStuff bothFalse = not (foo or bar) if isStuffNotOtherStuff or bothFalse awesome sauce else lame sauce
Der Hauptnachteil dieser Methode ist ihre Langsamkeit. Wir werden eine bessere Leistung erzielen, wenn wir Features verwenden
and
undor
Operatoren verwenden und Variablen durch Funktionen ersetzen:Wenn
A
falsch ist, würde der Operatorand
nicht aufrufenWenn
A
dies deror
Fall ist, würde der Operator nicht anrufenDer zweite Weg. Funktionen:
isStuff = -> foo is bar.data.stuff isntOtherStuff = -> foo isnt bar.data.otherstuff isStuffNotOtherStuff = -> do isStuff and do isntOtherStuff bothFalse = -> not (foo or bar) if do isStuffNotOtherStuff or do bothFalse awesome sauce else lame sauce
quelle