代码之家  ›  专栏  ›  技术社区  ›  Ben

最佳实践:if逻辑控制

  •  2
  • Ben  · 技术社区  · 14 年前

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

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

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

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

    //编辑

    我使用的语言主要是PHP和JavaScript,可能是C++和露比。

    7 回复  |  直到 14 年前
        1
  •  6
  •   Victor Nicollet    14 年前

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

    如果它们分布在整个函数中并且返回不同的内容,那么确实应该避免有多个返回,因为这会降低可读性。另一方面,具有检测不可接受条件并停止执行流的提前退出条件是相当标准的:

    function getFriendList() 
    {
      if (! has_internet_connection() ) return null;
      if (! is_logged_in() ) return null;
    
      return server.getFriendList();
    }
    
        2
  •  3
  •   Mark Byers    14 年前

    关于你的第二个例子 || short-circuiting 在大多数语言中,只计算必要的条件。例如,如果 bar 计算结果为true,两者都不是 baz 也不是 qux 将被评估。

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

        3
  •  2
  •   Rob    14 年前

    后者,但作为:

    function foo()
    {
    
       var result = 1;
    
       if(bar || baz || quz)
       {
           result = 0;
       }
    
       return result;
    }
    

    用“返回”来退出您的代码是不好的做法,并使调试成为噩梦——尤其是如果它是您试图调试的ELSE代码的话!控制流应该总是在函数的底部退出!

        4
  •  1
  •   Liviu Mandras    14 年前

    在C语言中,你可以使用第二个版本,因为在性能上是一样的,但是看起来更好。如果 bar 如果为true,则不再检查其他标志。

        5
  •  0
  •   wizzardz Nikhil    14 年前

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

        6
  •  0
  •   Eric K Yung    14 年前

    我认为后一个例子在编码方面更好。在OR语句中,atmost one condition为true语句为true。所以如果第一个条件是真的,就不会再考虑其他条件了。速度和效率没有损失。

        7
  •  0
  •   paxdiablo    14 年前

    这完全取决于语言。许多语言都会短路评估,因此,如果 bar 是的,其他两个不被计算,任何一个半正派的编译器都会在这种情况下优化它们。在你提到的四种语言中(C++、露比、PHP和JavaScript),它们都会进行短路评估。

    而且,不管“避免多重回报”的人群会告诉你什么,那就是 你应该像羊一样遵守规则。这是为了避免出现很难看到返回(或循环中断)发生的情况。你的第一个解决方案不会比你的第二个解决方案更受这个问题的困扰。

    盲目地追随教条而不理解其背后的原因,应该是一种可处以痛苦折磨的罪行。