Coding style 在IF块中放什么,在ELSE块中放什么?

Coding style 在IF块中放什么,在ELSE块中放什么?,coding-style,function-exit,Coding Style,Function Exit,这是一个次要的风格问题,但添加到代码中的每一点可读性都很重要 所以如果你有: if (condition) then { // do stuff } else { // do other stuff } 你如何决定是这样更好,还是这样更好: if (!condition) then { // do other stuff { else { // do stuff } 我的启发是: 保持条件为正(小于 阅读时的心理计算) 将最

这是一个次要的风格问题,但添加到代码中的每一点可读性都很重要

所以如果你有:

if (condition) then
{
   // do stuff
}
else
{
   // do other stuff
}
你如何决定是这样更好,还是这样更好:

   if (!condition) then
   {
     // do other stuff
   {
   else
   {
     // do stuff
   }
我的启发是:

  • 保持条件为正(小于 阅读时的心理计算)
  • 将最常见的路径放入 第一街区

  • 我喜欢第一个。条件应该尽可能简单,并且应该相当明显,哪种情况下更简单,哪种情况下更简单!条件

    我更喜欢将最常见的路径放在第一位,并且我非常相信减少嵌套,因此我将尽可能中断、继续或返回,而不是埃尔辛。我通常更喜欢针对正面条件进行测试,或者将负面条件反转为正面条件

    if (condition)
        return;
    
    DoSomething();
    

    我发现,通过大幅度减少else的使用,我的代码更具可读性和可维护性,当我不得不使用else时,它几乎总是一个更结构化的switch语句的最佳候选者。

    这取决于您的流程。对于许多函数,我将使用前提条件:

    bool MyFunc(variable) {
        if (variable != something_i_want)
            return false;
    
        // a large block of code
        // ...
        return true;
    }
    

    如果我在每种情况下都需要做一些事情,我将使用
    If(positive_子句){}else{}
    格式。对我来说,这取决于条件,例如:

    if (!PreserveData.Checked)
    {  resetfields();}
    
      if (!some_function_that_could_fail())
      {
         // Error handling code
      }
      else
      {
         // Success code
      }
    

    我倾向于用我想要的逻辑与自己交谈,并将其编码到我头脑中的小声音中。

    如果代码是为了检查错误情况,我宁愿将代码放在第一位,“成功”代码放在第二位;从概念上讲,这使函数调用及其错误检查代码保持在一起,这对我来说很有意义,因为它们是相关的。例如:

    if (!PreserveData.Checked)
    {  resetfields();}
    
      if (!some_function_that_could_fail())
      {
         // Error handling code
      }
      else
      {
         // Success code
      }
    

    我同意奥利在可能的情况下使用积极的if子句

    请不要这样做:

    if (somePositiveCondition)
    else {
        //stuff
    }
    

    我曾经在我工作过的一个地方看到过很多这样的情况,我常常想知道是否有一个编码员不知道如何不工作…

    一般来说,如果一个明显大于另一个,我会将较大的一个设为
    if

  • 把公共路径放在第一位
  • 将负支票转换为正支票(
    !full==空)

  • 我知道这不是你想要的,但是。。。许多开发人员使用一个“guard子句”,即一个否定的“if”语句,该语句会尽快脱离方法。在这一点上,没有真正的“其他”

    例如:

    if (blah == false)
    {
        return; // perhaps with a message
    }
    
    // do rest of code here...
    
    有一些核心的c/c++/汇编人员会告诉你,你正在破坏你的CPU!!!(在许多情况下,处理器倾向于使用“true”语句,并尝试“预取”下一步要做的事情……因此理论上任何“false”条件都会刷新管道,并且速度会慢几微秒)


    在我看来,我们正处于“更好”(更容易理解)的代码胜于几微秒的CPU时间的时刻。

    我认为对于单个变量,not运算符足够简单,命名问题开始变得更加相关

    永远不要给变量命名,如果需要的话,使用同义词表并找到相反的名称。我见过很多像这样糟糕的代码

    if (not_dead) {
    } else {
    }
    
    而不是显而易见的

    if (alive) {
    } else {
    }
    
    然后您可以合理地使用(非常可读,无需反转代码块)

    如果我们讨论更多的变量,我认为最好的规则是简化条件。一段时间后,项目往往会遇到以下情况:

    if (dead || (!dead && sleeping)) {
    } else {
    }
    
    也就是说

    if (dead || sleeping) {
    } else {
    }
    

    始终注意条件是什么,以及如何简化它们

    如果您必须有多个退出点,请将它们放在第一位,并说明清楚:

    if TerminatingCondition1 then
      Exit
    if TerminatingCondition2 then
      Exit
    
    现在我们可以继续做一些平常的事情:

    if NormalThing then
      DoNormalThing
    else
      DoAbnormalThing
    
    两个(相互矛盾的)教科书引用:

    放置if/else的最短子句 最上面

    --艾伦·霍卢布,“足够的绳子射中你自己的脚”,第52页

    将正常情况置于if之后,而不是else之后


    --Steve McConnell,“代码完成,第二版”,第356页,软件是知识捕获。你在编码某人关于如何做某事的知识

    软件应该符合问题的“自然”要求。当有疑问时,问问其他人,看看人们到底说了什么,做了什么

    “常见”情况是什么都不做?然后呢

    if( common ) {
        // pass
    }
    else {
        // great big block of exception-handling folderol
    }
    
    还是你这么做

    if( ! common ) {
        // great big block of except-handling folderol
    }
    
    “总是积极的”规则并不是你首先想要的。您希望看到更像下面这样的规则

  • 总是自然的——它应该读起来像英语(或者组织中的通用语言)
  • 在可能的情况下,首先是常见案例——因此它们看起来很常见
  • 在可能的情况下使用积极逻辑;消极逻辑可以用在通常这样说的地方,也可以用在通常情况下无所事事的地方

  • 如果两条路径中的一条非常短(1到10行左右),而另一条则长得多,那么我将遵循,并将较短的代码段放入If中。这使得在查看代码时更容易在一个屏幕上看到if/else流


    如果这是不可能的,那么我将构建尽可能简单的条件。

    当我查看数据验证时,我尝试将我的条件设置为“白名单”——也就是说,我测试我将接受的条件:

    if DataIsGood() then
       DoMyNormalStuff
    else
       TakeEvasiveAction
    
    而不是相反,它往往退化为:

    if SomeErrorTest then
      TakeSomeEvasiveAction
    else if SomeOtherErrorCondition then
      CorrectMoreStupidUserProblems
    else if YetAnotherErrorThatNoOneThoughtOf then
      DoMoreErrorHandling
    else
      DoMyNormalStuff
    

    通常可以使条件为正,而无需切换if/else块

    改变

       if (!widget.enabled()) {
         // more common 
       } else {
         // less common 
       }
    


    英特尔奔腾分支预测预取“如果”情况的指令。如果它改为跟随“else”分支:它将刷新指令管道,从而导致暂停

    如果你非常关心绩效:将最可能的结果放在“如果”子句中

    就我个人而言,我是这样写的

    if (expected)
    {
       //expected path
    }
    else
    {
       //fallback other odd case
    } 
    

    我总是把最有可能的放在第一位

    在Perl中,我有一个额外的控制结构来帮助实现这一点。if的倒数

    unless (alive) {
         go_to_heaven;
    } else {
         say "MEDIC";
    }
    

    如果你有正确和错误的条件,那么我会选择一个积极的条件-这减少了混乱,一般来说,我相信会使你的代码更容易阅读

    另一方面,如果你使用的是一种语言
    unless ($foo) {
        $bar;
    }
    
    if(condition)
    {
    doSomething();
    }
    else
    {
    System.out.println("condition not true")
    }
    
    if(!condition)
    {
    doSomething();
    }
    else
    {
    System.out.println("condition true");
    }