如果我有一个复杂的if语句,我不想仅仅出于美学目的而溢出,那么将其分解的最简洁的方式是什么,因为在这种情况下coffeescript会将return解释为语句的主体?
if (foo is bar.data.stuff and foo isnt bar.data.otherstuff) or (not foo and not bar)
awesome sauce
else lame sauce
Answers:
如果该行以运算符结尾,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
if
statmenet的主体“甚至更多”,则可以使用then
,从与相同的级别开始if
。恕我直言,它更具可读性。
if
。正确语法的唯一规则是(据我所知):1)主体的缩进不能与和的第一行或最后一行相同;if
以及2)主体或主体的任何行都if
不能比的缩进少。的第一行if
。还要注意,您可以在不同的非第一if
行上使用不同的缩进。
if
用2个标签缩进非第一行(以便使它们既不在之后也不在if
),并在正文中缩进1个标签。
这在某种程度上改变了代码的含义,但可能有一些用处:
return lame sauce unless foo and bar
if foo is bar.data.stuff isnt bar.data.otherstuff
awesome sauce
else
lame sauce
请注意,is...isnt
链条是合法的,就像a < b < c
CoffeeScript中的合法性一样。当然,重复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 / else语句中的逻辑规则
逻辑规则之一是:
(不是A而不是B)==不是(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
是错误的话,运营商将and
不会致电
如果A
为真,话务员or
不会打电话
第二种方式。职能:
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
not bar
第一子句中有可能(如第二子句所示),则该引用bar.data
将导致错误...