最佳实践:如果是逻辑控制

时间:2010-11-15 07:22:20

标签: if-statement coding-style

关于编码标准,速度和效率,对于这种情况,下列哪一项是更好的编程实践?

function foo() {
  if(bar)   { return 0; }
  if(baz)   { return 0; }
  if(qux)   { return 0; }
}

function foo() {
  if(bar || baz || qux) { return 0; }
}

我倾向于第一个,因为只需要评估一个条件因此会更快,但是多个return s不好......?

// EDIT

我要应用的语言主要是PHP和Javascript,可能是C ++和Ruby。

7 个答案:

答案 0 :(得分:5)

今天几乎每一种编程语言uses short-circuit evaluation for ||,这意味着这两个例子在控制流和性能方面都是等价的。

如果它们遍布整个函数并且它们返回不同的东西,那么确实应该避免多次返回,因为这会降低可读性。另一方面,具有检测不可接受的条件并停止执行流程的早期条件是相当标准的:

function getFriendList() 
{
  if (! has_internet_connection() ) return null;
  if (! is_logged_in() ) return null;

  return server.getFriendList();
}

答案 1 :(得分:3)

关于您的第二个示例,||在大多数语言中都是short-circuiting,因此只会评估必要的条件。例如,如果bar评估为true,则不会评估bazqux

知道这一点,我可能会选择第二个例子。

答案 2 :(得分:2)

后者但是:

function foo()
{

   var result = 1;

   if(bar || baz || quz)
   {
       result = 0;
   }

   return result;
}

以“返回”的方式退出你的代码是不好的做法,并使调试成为一场噩梦 - 特别是如果你正试图调试的是别人的代码!控制流应始终从功能的底部退出!

答案 3 :(得分:1)

在C#中你可以使用第二个版本,因为性能相同但看起来更好。如果bar为真,则不再检查其他标志。

答案 4 :(得分:0)

完全取决于语言。许多语言都会进行短路评估,这样,如果bar为真,则其他两个语句不会被评估,并且任何半合适的编译器都会在这种情况下优化那些相同的东西。在您提到的四种语言(C ++,Ruby,PHP和Javascript)中,它们都进行短路评估。

而且,尽管“避免多次回归”的人群会告诉你,那就是规则你应该像羊一样遵循。这意味着要避免很难看到返回(或循环中断)的位置。你的第一个解决方案不会受到这个问题的影响。

盲目追随教条而不理解其背后的原因应该是一种可以受到酷刑折磨的罪行。

答案 5 :(得分:0)

在第二种情况下,因为你正在使用逻辑-OR,所以只有在必要的情况下才会检查第二个条件,所以我想用第二个条件更好的编码标准。

答案 6 :(得分:0)

在我看来,后一个例子在编码方面更好。在OR语句中,最多只有一个条件为真,该语句为真。因此,如果第一个条件为真,则不会再考虑其他条件。没有速度或效率的损失。