2

哪个是更好的做法?使您的成功案例的逻辑在条件链中隐式或显式?

请注意,以下所有内容的逻辑都是详尽的,所以这确实是一个风格问题。

隐式

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
4

1 回答 1

4

尽管这通常归结为个人偏好问题,其中所有给定的解决方案都具有相同的功能属性,但我发现在大多数情况下,最容易阅读的解决方案将是最好的。什么是容易的因人而异,因为任何具有 C++、Java 或 Perl 背景的人都可能对复杂性有更高的容忍度。

一些纯粹主义者会让你相信每种方法都应该有一个入口点和一个出口点,即return末尾有一个单数,但这似乎是没有真正基础的教条。

“短路”方法,您将使用return iforreturn 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

快点,你应该把核导弹发射程序放在哪个里面,哪个得到警告?

通常,除非您有子句,否则请if not使用, 而不是 。unlesselse

从 Ruby 风格的角度来看,not以长形式使用也是不寻常的。通常,它要么通过使用来避免,unless要么显示为!绑定更紧密且不太可能显着改变逻辑含义的版本。像andand一样or,松散绑定的逻辑运算符可能很容易出错并且不能一致地应用,因为在某些情况下使用它们会导致过多的歧义并发生语法错误。

例如,以下内容无效:

x = not y and z

紧密绑定的替代方案确实可以按您的预期工作:

x = !y && z

所以我能想到的最好的版本是:

def foobar(foo, bar)
  return "No foo" unless (foo)
  return "No bar" unless (bar)

  "foobar"
end
于 2013-05-01T02:35:40.343 回答