“if'VS”否则“如果”

时间:2010-09-24 19:10:08

标签: debugging language-agnostic if-statement

我被告知,使用“if”语句是首选,因为代码更难调试,当使用“else if”时?这句话中有一点真相吗?

22 个答案:

答案 0 :(得分:50)

我从未遇到调试'else if'语句的问题。我认为使用'else if'语句是干净的,并且它与程序员进行通信,阅读“else if”语句组是互斥的代码。

答案 1 :(得分:12)

if(...)
{
}
else if(...)
{
}

完全等同于:

if(...)
{
}
else
   if(...)
   {
   }    

以同样的方式:

if(...)
   foo();
else
   bar();

完全等同于:

if(...) foo();
else bar();

这是100%的风格,无论一个是否比另一个更具有可读性,都是基于您的编程文化,语言和陈述的复杂程度的总判断调用。

答案 2 :(得分:9)

如果/ If else语句没有出错代码,我会

答案 3 :(得分:8)

ifelse if之间的差异与协调独占连词之间的差异相同。

答案 4 :(得分:8)

也许你的老板只是意味着提前退货。

我经常不需要if / else。但这并不是因为else是错误的,而是因为我喜欢早期的回报,如果你使用早期的回报,那么你就不需要那么多了。

所以而不是:

boolean validate(DomainObject o) {
  boolean valid = false;
  if (o.property == x) {
     valid = true;
  } else if (o.property2 == y) {
     valid = true;
  } ...
  return valid; 
}

我更喜欢输入:

boolean validate(DomainObject o) {

  if (o.property == x) 
     return true;

  if (o.property2 == y) 
     return true;

  return false; 
}

答案 5 :(得分:3)

声明“否则如果更难调试”是荒谬的。我建议你将来不要求那个人帮忙。

使用语义正确的解决方案。如果解决方案是:

if a is true do a.action
if a is not true and b is true, then do b.action
otherwise do c.action

然后else if是合适的。例如:

if (a == true)
{
  // do a.action
}
else if (b == true)
{
  // do b.action
}
else
{
  // do c.action
}

如果解决方案是:

if a is true do a.action
if b is true do b.action
if c is true do c.action

然后else if不合适。例如:

if (a == true)
{
  // do a.action
}
if (b == true) // note that we don't care if a was true
{
  // do b.action
}
if (c == true) // care about neither a nor b
{
  // do c.action
}

答案 6 :(得分:2)

在正常使用中,else if完全没有问题。事实上,我认为这是一种重要的编码技术。

唯一的时间else if是一个问题,当你把它们加载到一起时 - 我不得不调试遗留代码,这些代码有几千行,包括if,elseif,elseif,elseif的页面......无限的。现在 是错误的代码。不要那样做。

这种情况可能会给你一个糟糕的经历,如果,但这只是糟糕的编码;如果没有别的话,你可以做得更好或更糟。

答案 7 :(得分:2)

我喜欢古老的说法“调试是编写代码的两倍,所以如果你把代码编写得很聪明,那么根据定义你就不够聪明来调试它”。所以我试着让我的代码易于阅读和阅读调试(有时这是不可能的)。话虽这么说,我不认为别的如果非常聪明,所以我会继续使用它。

答案 8 :(得分:1)

我认为这不是真的。 if,else if语句非常简单且易于调试。我想这可能取决于正在调试的人,但根据我的经验,没有任何一个区别,我没有听到有人在尖叫“如果!”在调试他的代码时。

答案 9 :(得分:0)

它实际上取决于大多数情况下要检查的条件,例如,如果您要检查成绩是否是某个字母,则可以使用多个if语句或if else if语句。确实没有区别,因为一个等级不能同时为A和C。

答案 10 :(得分:0)

使用一堆if语句与使用if然后使用else if完全不同。

示例:

if(x>5)
{
    color="blue";
}
if(x>10)
{
    color="red";
}

在这种情况下,如果我们使用15作为x,则颜色将被red覆盖。

但是,如果我们使用else if

if(x>5)
{
    color="blue";
}
else if(x>10)
{
    color="red";
}

在这种情况下,颜色会变为蓝色,因为我们会忽略秒语句,因为第一个语句已经为真。

答案 11 :(得分:0)

JDV给出的答案似乎是正确的。 我来这里寻找非常类似的答案。但是问题所有者选择的答案不是正确/正确的答案。正确/正确的答案是关于早期返回和清晰的样式,并且事实上,嵌套太多if-then-else语句通常不是一种好的编程风格。从此以后调试编写得不好的代码总是比较困难。

结论:条件代码应尽可能清晰/简单,以便在编程或调试阶段,人类可以轻松管理变量。

答案 12 :(得分:0)

我是一名首席程序员,有时我的下属会误解我。当我谈到具体案例时,他们多次将其视为“规则”并尝试在代码库中的任何地方强制执行。我不确定这是不是你的情况,或者你的老板曾经是我的下属?

关于这个问题,else if对我来说很好,但是当它们没有太多时因为else if强迫你阅读它们上面的所有表达式来实现内部代码将被执行。

答案 13 :(得分:0)

这取决于你想要完成的事情。两者都是可接受的编码形式,它只取决于你正在做什么。例如,如果要确保检查每个比较并运行所有代码的可能性,则应使用单数if构造:

if(condition1IsTrue) {
    methodThatMustRun1();
}

if(condition2IsTrue) {
    methodThatMustRun2();
}

... etc

在此示例中,检查所有条件,并且可能会运行每个代码块。

如果您只想从多个选项中运行单个代码块,那么您应该使用if else构造,最好以最常见的顺序发生,以便最不常见:

if(condition1IsTrue) {
    mostCommonMethodToRun();
} else if (separateConditionToCheckInCaseFirstFails) {
    nextMostCommonScenarioMethodToRun();
} else if (...) {
    ... etc
}

在第二个示例中,最多检查所有条件,但可能只检查一个。但是,只执行一个代码块(假设您没有条件评估为true时有默认操作)。

你的老板不一定像所有人都说的那样白痴,但你有可能误解了他的意图。当你考虑它时,所有条件代码本质上都是独立的块(第​​一个例子),由一些多选项代码组成(第二个例子)。

然而,如果他教条地说你不能用if else构造进行编程,那么你的老板可能会是个白痴。

答案 14 :(得分:0)

'if语句'的形式是:

if (condidtion1)
   statement1;
else
   statement2;

声明的有效形式之一是“if声明”。让我们将'statement2'变成'if statement'if (condition2) statement3;

if (condition1)
   statement1;
else if (condition2)
   statement3;

白色空间和定位只是为了您的利益(可读性)。编译器本身对'else if'一无所知。

这表明'if'和'else if'虽然不是一回事。 'else if'是复合语句。

语句的另一个有效形式是括号{}中包含的语句块。这就是为什么你经常(通常)在'if语句'中看到括号。是否在单一陈述中使用它们只是风格问题。

使用'else if'的原因是你不必处理你知道会评估为false的'condition'表达式。你知道这是因为你已经检查了其他条件。

也许你的老板说你可能会在这些假设中犯错,而'如果'陈述可能会隐藏微妙的错误。我想这肯定是可能的。不过,这对我来说似乎不值一提。

他对'转换声明'有什么看法?

答案 15 :(得分:0)

无论你编写什么,你都应该想到语言语法可以用来提高代码的可读性,并向你的同事说明这些代码行背后的想法。 所以...明智地选择任何一种方式。滥用的一个例子是在其他代码块中吸收许多if块。这可能会使代码难以理解且无法维护。 也许你的老板说,因为不能。

答案 16 :(得分:0)

这比以下好多了:

if (a=1) then {
  DoThis;
  EXIT;  // Not sure if this works in your language, but you know what I mean...
}
if (a=2) then {
  DoThis;
  EXIT;
}
if (a=3) then {
  DoThis;
  EXIT;
}

答案 17 :(得分:0)

您正在比较

if (a=b) do this;
if (a=c) do this;
if (a=d) do this;

要:

if (a=b) do this;
else if (a=c) do this;
else if (a=d) do this;

1)第一个示例更难调试,因为您没有像第二个示例所提供的代码的自然工作流程。

2)正如杰森指出的那样,第一个例子的表现与第二个例子不同,因为所有三个if语句都将被测试,无论如何,而第二个例子将在它变为真时停止测试。

tl;博士:你的老板错了,尽管他也有互联网接入。

答案 18 :(得分:0)

为什么不尝试使用代码中的ifs替换所有其他ifs?它会编译,但如果你幸运的话它只会按照你的需要执行......

它只是不一样,并且有一个理由为什么有If和为什么有Else IF。

例如:

if(3<5) {
 print('blah');
} else if(4<5) {
 print('blub');
}
// blah

if(3<5) {
 print('blah');
} 
if(4<5) {
 print('blub');
}
// blahblub

我个人更喜欢橘子!苹果是如此olschool ... 我认为香蕉也很好(但这会不时切换!)

还有switch语句。

那些控制结构都做了不同的事情并且不是多余的,这就是为什么它们都在那里。 并且你不能说它无关紧要,它也不是风格或更好的可读代码或其他东西。

我甚至会说每个用例都有一个最佳控制结构可供使用!

考虑一下这些例子:

if(money > 2000) {
 switch ($what-car-does-my-wife-want) {
     case "ferrari":
         echo "buying a ferrari";
         break;
     case "chevvy":
         echo "buying a chevvy";
         break;
     case "bmw":
         echo "buying a bmw";
         break;
 }

} else {
 echo "i better not buy a new car";
}
if(money > 5000) {
 echo "wow i can buy a lot of other things too!";
} else if(3000) {
 echo "wow that is a lot of money but i wish i had 5000!";
}

你唯一可以做的就是风格问题正在取代

if(money > 5000) {
 echo "wow i can buy a lot of other things too!";
} else if(money > 3000) {
 echo "wow that is a lot of money but i wish i had 5000!";
}

通过

if(money > 5000) {
 echo "wow i can buy a lot of other things too!";
} else { 
    if(money > 3000) {
     echo "wow that is a lot of money but i wish i had 5000!";
    }
}

但我认为那不是你问的吗?

答案 19 :(得分:0)

两种形式都需要相同的调试工作。我敢说“else if”语句实际上使调试变得更容易......

此外,“else if if”语句会提高性能,因为您的程序不必检查实际上相互排斥的条件!

答案 20 :(得分:0)

我也不同意。对于“其他如果”,没有什么本质上更难的;是否正确的编程方法取决于每个应用程序。在某些情况下,“switch”或“case”语句更好,但同样取决于应用程序。

在我看来,制定这样的硬性规则太有限了。

答案 21 :(得分:0)

如果“else if”是非首选构造,那么为什么几乎每种现代语言都提供它呢?我觉得你继续使用其他ifs就好了......除此之外 - 当它击中组装时,无论如何它都是跳/ goto;)