把事情留在别的地方是不是很糟糕?

时间:2011-03-05 13:43:03

标签: conditional if-statement

假设您只有有限数量的可能条件,可以将它们称为a,b,c,d,并且您确信任何其他可能性都是不可能的。

做得好吗

if(a)
  do_something();
else if(b)
  do_something();
else if(c)
  do_something();
else if(d)
  do_something();

if(a)
  do_something();
if(b)
  do_something();
if(c)
  do_something();
else
  do_something();

7 个答案:

答案 0 :(得分:2)

如果我理解正确的话。否则只是有条件地检查。第二个将检查每个是否除非在每个if之后都有回访。

答案 1 :(得分:1)

执行此操作的标准方法是使用“switch”或“case”(取决于语言)语句。例如,在PHP中你会写:

switch ($condition) {
  case 'a': do_something(); break;
  case 'b': do_something(); break;
  default: do_something();
}

但确切的语法将取决于您所写的语言。在这种情况下,您将在“默认”部分中包含其他可能性的说明,如果是,则最好在此处包含一些内容可能条件不是“a”或“b”(否则你最终会得到一个bug!)

答案 2 :(得分:1)

我会选择第一个,但是在另一个else块中有一个断言或类似的东西。

if(a)
  do_something();
else if(b)
  do_something();
else if(c)
  do_something();
else if(d)
  do_something();
else
  assert(0); // or throw ImpossibleException or whatever

(此建议也适用于switch标签的default

即使您认为这是不可能的,一般来说,进行额外检查仍然是“深度防御”练习:在某些时候您可能会在其他地方更改您的应用程序,以便可能的选择变得更多(典型案例)正在添加enum值并忘记更新这部分代码;如果没有这样的检查,你就会有很长一段时间没被注意到的错误。

答案 3 :(得分:1)

没有“更好”的方式,这完全取决于控制流程的进展方式。

if(a)
  do_something();
else if(b)
  do_something();
else if(c)
  do_something();
else if(d)
  do_something();

这是一个分支控制流,这意味着if将以首先出现的顺序进行测试,并且第一个遇到评估为true的将在所有条件中被挑选和执行,所有剩余的将被跳过。

if(a)
  do_something();
if(b)
  do_something();
if(c)
  do_something();
else
  do_something();

这是一个顺序控制流程(尽管你的最后一个if是分支控制流程),这意味着将测试所有if块并且每个被评估为true的块将被选中并执行。 (虽然最后一个,好像c为假,但只会执行else块。)

选择使用哪一个完全取决于需要执行的内容。对于switch块,它们大多是分支控制流的快捷方式,通常在编译后表现完全相同,但这不一定正确(即不使用{{1}时或者某些语言​​支持break不同的情况等等),但这超出了范围。

答案 4 :(得分:0)

在后一个示例中,您始终在评估所有条件,而第一个条件仅评估它们,直到找到true条件为止。所以第一段代码的表现稍好一些。

如果您不喜欢这么多嵌套条件,return / break找到第一个后的方法:

if(a)
  return do_something();
if(b)
  return do_something();
if(c)
  return do_something();
return do_something();

......除非你忠实地相信单身return教会。

答案 5 :(得分:0)

两个代码段不同。

在第一个中,当且仅当先前条件错误时,才会测试每个else if。例如,如果a是正确的,则根本不会对其他人进行测试。

第二个片段测试每个条件都与先例无关。

与另一个答案中的说法一样,第一个代码段可以替换为switch语句,具体取决于您使用的条件和语言。但第二个片段必须保持不变。

所以我的最后一句话是:这不是“更好或不更好”的问题,因为两个代码都做不同的事情。 这取决于你想做什么!

答案 6 :(得分:0)

第二个版本将评估每个if语句,而不管先前评估的结果如何。

事实上它甚至会显示错误的行为,因为你想要实现的目标,因为如果条件不是c,则总是输入最后一个。而不是它不是a,b或c之一。

第一个版本应该按预期工作。