有些人恨Ruby的unless。 我个人并不这样, 但是我尽力遵守一些规则。 我会用下面都一些例子来澄清这些规则。 下面例子里我标榜为“ok”的只是我的个人喜好,所以我不愿意把它们标榜为“good”, 但是我肯定会避免使用“bad”来标榜它们。
Statement Modifier…Ok
在使用statement modifier(条件修饰符)的时候,我认为unless实际上比if! 更好读。例如:
raise InvalidFormat unless AllowedFormats.include?(format)
...比这个更好读…
raise InvalidFormat if !AllowedFormats.include?(format)
我认为我喜欢前一个句式的原因是因为它机会对任何人来说读上去都像一个句子,即使是那些不熟悉Ruby的人(就像我的妈妈,大家都知道妈妈能读懂代码的重要性--译者注:要写出高度可读的代码)
没有用到Else…Ok
当使用一个条件或者没有用else的时候,我也不介意去使用unless,就像这样 。。。
unless foo?
# bar that thing
end
当使用Else的时候…Bad
我们不喜欢用unless是使用else条件句的时候,就像这样:
unless foo?
# bar that thing
else
# foo that thing
end
如果你有类似的代码, 只需要把功能代码交换一下位置,然后使用if吧。 相信我,这样更可读性更好。
if foo?
# foo that thing
else
# bar that thing
end
使用if的版本比使用unless的版本感觉更容易处理。 我认为使用unless加else条件句就好像在讲双重否定。这会减慢未来程序员使用这段代码, 因为他必须去思考这段代码如何讲的通,而不是顺着条件去看。
当使用nil?的时候...Bad
正如 Ryan Bates 在回复里指出的 , 像这样测试nil…
unless foo.nil?
# do some foo
end
...这样更可读…
if foo
# do some foo
end
unless foo.nil?
和 if foo
是同一个功能,但是是一个双重否定的问题, 像我提到的使用unless...else句式一样。感谢Ryan提到的另一个使用unless 不好的技巧。
使用多个条件时…Bad
我恨(是恨,而不仅仅是像上面说的一样厌恶)unless的原因,是使用多个条件时候,我总是忘记这个“否定”是仅用在第一个条件还是所有条件。如果只是想这个“否定”不是应用到所有的条件,而只是告诉它让我再次感到困惑,所以请别这么做。。
unless foo? && baz?
# bar that thing
end
相反,我可能会这么做 。。。
if !foo? || !baz?
# bar that thing
end
最后的思考
用unless是ok的,但是不要把它瞎j8扔到你的代码里。
I said “nil” get it?(等待眉批) Hehe.一些人说,如果unless这么容易被滥用,那么尽量避免使用它就好了。我猜我不会同意这种说法的,因为我认为在一些情况下,它实际上会提高代码的可读性,正如我上面所述。随你们争辩去吧, 我会无视你的。 :)