哪种做法更好?使成功案例的逻辑在条件链中隐式或显式?
请注意,以下所有内容的逻辑都是详尽的,所以这实际上是一个风格问题。
隐式
def foobar(foo, bar)
if not foo
"No foo"
elsif not bar
"No bar"
else
"foobar"
end
end另类隐式
def foobar(foo, bar)
return "No foo" if not foo
return "No bar" if not bar
"foobar"
end显式
def foobar(foo, bar)
if not foo
"No foo"
elsif not bar
"No bar"
elsif foo && bar
"foobar"
end
end另类显式形式
def foobar(foo, bar)
if foo
if bar
"foobar"
else
"No bar"
end
else
"No foo"
end
end发布于 2013-05-01 10:35:40
尽管这通常归结为个人偏好的问题,所有给定的解决方案都具有相同的功能属性,但我发现最容易阅读的解决方案在大多数情况下都是最好的。简单的构成因素因人而异,因为任何具有C++、Java或Perl背景的人都可能对复杂性有更高的容忍度。
一些纯粹主义者会让你相信每个方法应该有一个入口点和一个出口点,即在结束时有一个单一的return,但这似乎是没有真正基础的教条。
在“短路”方法中,您将使用return if或return unless测试提前终止方法,这种方法的效果是预先确定“不进行”条件,并避免在以后不必要地缩进可能更复杂的代码。这是典型的,如:
def complicated_method
return if (@safety == :on)
return unless (Time.now >= @launch_time)
# ...
end这与您的“另类隐式”示例相对应。
一般来说,你应该努力避免双重否定条件,即使是无意中也是如此。如果你对此粗心大意,你很容易得到双倍、三倍甚至四倍的否定条件。例如:
if (not @do_not_launch != true)
# Triple negation: If not not launch is not true
else
# Quadruple negation: If not not not launch is not true
end快速,你应该把核导弹发射程序放在哪一个里面,而不是得到一个警告?
通常,使用unless而不是if not,除非您有else子句。
从Ruby风格的角度来看,在长形式中使用not也是不寻常的。通常,可以通过使用unless来避免这种情况,或者显示为!版本,该版本绑定更紧密,不太可能显着改变逻辑的含义。像and和or一样,松散绑定的逻辑运算符可能不可靠,并且不能一致地应用,因为在某些情况下,使用它们会导致太多的歧义,并且会出现语法错误。
例如,以下内容无效:
x = not y and z紧密绑定的替代方案确实像您预期的那样工作:
x = !y && z对于这种情况,我能想到的最好的版本是:
def foobar(foo, bar)
return "No foo" unless (foo)
return "No bar" unless (bar)
"foobar"
endhttps://stackoverflow.com/questions/16310927
复制相似问题