首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件链成功应该是隐式的还是显式的

条件链成功应该是隐式的还是显式的
EN

Stack Overflow用户
提问于 2013-05-01 08:13:46
回答 1查看 76关注 0票数 2

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

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

隐式

代码语言:javascript
复制
def foobar(foo, bar)
  if not foo
    "No foo"
  elsif not bar
    "No bar"
  else
    "foobar"
  end
end

另类隐式

代码语言:javascript
复制
def foobar(foo, bar)
  return "No foo" if not foo
  return "No bar" if not bar

  "foobar"
end

显式

代码语言:javascript
复制
def foobar(foo, bar)
  if not foo
    "No foo"
  elsif not bar
    "No bar"
  elsif foo && bar
    "foobar"
  end
end

另类显式形式

代码语言:javascript
复制
def foobar(foo, bar)
  if foo
    if bar
      "foobar"
    else
      "No bar"
    end
  else
    "No foo"
  end
end
EN

回答 1

Stack Overflow用户

发布于 2013-05-01 10:35:40

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

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

在“短路”方法中,您将使用return ifreturn unless测试提前终止方法,这种方法的效果是预先确定“不进行”条件,并避免在以后不必要地缩进可能更复杂的代码。这是典型的,如:

代码语言:javascript
复制
def complicated_method
  return if (@safety == :on)
  return unless (Time.now >= @launch_time)

  # ...
end

这与您的“另类隐式”示例相对应。

一般来说,你应该努力避免双重否定条件,即使是无意中也是如此。如果你对此粗心大意,你很容易得到双倍、三倍甚至四倍的否定条件。例如:

代码语言:javascript
复制
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来避免这种情况,或者显示为!版本,该版本绑定更紧密,不太可能显着改变逻辑的含义。像andor一样,松散绑定的逻辑运算符可能不可靠,并且不能一致地应用,因为在某些情况下,使用它们会导致太多的歧义,并且会出现语法错误。

例如,以下内容无效:

代码语言:javascript
复制
x = not y and z

紧密绑定的替代方案确实像您预期的那样工作:

代码语言:javascript
复制
x = !y && z

对于这种情况,我能想到的最好的版本是:

代码语言:javascript
复制
def foobar(foo, bar)
  return "No foo" unless (foo)
  return "No bar" unless (bar)

  "foobar"
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16310927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档