単に審美的な目的でオーバーフローさせたくないという複雑なifステートメントがある場合、coffeescriptはこの場合のステートメントの本体としてリターンを解釈するため、それを分割する最もコーシャ的な方法は何でしょうか?
if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar)
awesome sauce
else lame sauce
CoffeeScriptは、行が演算子で終わる場合、次の行をステートメントの本文として解釈しないため、これで問題ありません。
# OK!
if a and
not
b
c()
にコンパイルされます
if (a && !b) {
c();
}
if
は次のようにフォーマットできます
# OK!
if (foo is
bar.data.stuff and
foo isnt bar.data.otherstuff) or
(not foo and not bar)
awesome sauce
else lame sauce
または、行がand
またはor
またはis
または==
またはnot
などで終わる限り、その他の改行スキームオペレーター
インデントに関しては、本文がさらにインデントされている限り、if
の最初以外の行をインデントできます。
# OK!
if (foo is
bar.data.stuff and
foo isnt bar.data.otherstuff) or
(not foo and not bar)
awesome sauce
else lame sauce
あなたができないことはこれです:
# 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
これにより、コードの意味が多少変わりますが、いくつかの用途があります。
return lame sauce unless foo and bar
if foo is bar.data.stuff isnt bar.data.otherstuff
awesome sauce
else
lame sauce
CoffeeScriptでis...isnt
が合法であるように、a < b < c
チェーンは合法であることに注意してください。もちろん、lame sauce
の繰り返しは残念であり、すぐにreturn
にしたくないかもしれません。別のアプローチは、ソークを使用して書くことです
data = bar?.data
if foo and foo is data?.stuff isnt data?.otherstuff
awesome sauce
else
lame sauce
if foo and
は少し洗練されていません。 foo
がundefined
である可能性がない場合は、破棄できます。
他の言語と同様に、そもそもそれらを持たないことによって。異なる部分に名前を付けて、別々に扱います。述語を宣言するか、いくつかのブール変数を作成するだけです。
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
改行をエスケープすると、最も読みやすくなります。
if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) \
or (not foo and not bar)
awesome sauce
else lame sauce
低レベルのボイラープレートが大量に発生する場合は、抽象レベルを上げるにする必要があります。
最適なソリューションは次のとおりです。
適切な名前の変数と関数を使用する
if/elseステートメントの論理規則
論理ルールの1つは次のとおりです。
(AでもBでもない)== not(AまたはB)
最初の方法変数:
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
この方法の主な欠点は、速度が遅いことです。 and
およびor
演算子機能を使用し、変数を関数に置き換えると、パフォーマンスが向上します。
A
がfalseの場合operator and
wouldnt call
A
がtrueの場合operator or
wouldnt call
2番目の方法。機能:
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