代码之家  ›  专栏  ›  技术社区  ›  Rahul Vyas

是否有必要在每个if条件中编写其他部分?

  •  13
  • Rahul Vyas  · 技术社区  · 14 年前

    10 回复  |  直到 6 年前
        1
  •  18
  •   paxdiablo    14 年前

    那是个可怕的主意。您将得到以下表单的代码:

    if (something) {
        doSomething();
    } else {
    }
    

    else 我完全无法理解。这听起来像是那些手头有太多空闲时间的人制定的规则之一。尽快解雇他们,或者至少平静地离开:-)

        2
  •  8
  •   Jon Skeet    14 年前

    不,你当然不会 至少在大多数语言中(你没有具体说明;很可能有一种语言 这是一个我当然不会的例子:

    public void DoSomething(string text)
    {
        if (text == null)
        {
            throw new ArgumentNullException("text");
        }
        // Do stuff
    }
    

    现在你 能够 在这里把方法的主要工作放在一个“else”子句中,但这会增加不必要的嵌套。再加上几个条件,整个事情就变成了一团看不懂的烂摊子。

    根据我的经验,这种“提前出局”的模式相当普遍——既适用于返回值,也适用于例外情况。我知道有些人喜欢方法的单一返回点,但在我使用的语言(Java、C#)中,这往往会导致代码可读性大大降低和嵌套加深。

    现在,有一种情况,争论的余地更大,那就是两个分支都是终端,但它们实际上都不是捷径:

    public int DoSomething()
    {
        // Do some work
        if (conditionBasedOnPreviousWork)
        {
            log.Info("Condition met; returning discount");
            return discount;
        }
        else
        {
            log.Info("Condition not met; returning original price");
            return originalPrice;
        }
    }
    

    (请注意,我故意给这两个分支更多的工作要做,而不仅仅是返回-否则一个条件语句将是合适的。)

    如果没有“else”这个词会更容易理解吗?这其实是个人选择的问题,我不会说我总是始终如一。使两个分支都相等地缩进会以某种方式赋予它们相等的权重,并且可能会鼓励以后通过反转条件进行重构的可能性。。。然而,如果我们刚刚通过了“返回原价”,那么 进入之内 if块和移动折扣案例 如果一个if块的第一眼看上去不那么明显正确。

        3
  •  5
  •   Abhinav Sarkar    14 年前

    if - else 是语句,不返回值。所以你可以快乐地只写 if else 每次之后

    如果 其他的 . 但仍有一些情况下,您可能不需要 其他的 部分。Clojure对于此类案件有 when 如果-否则 nil 其他的 切忌写。

    (when (met? somecondition)
      (dosomething))
    
        4
  •  4
  •   Dan J    14 年前

    http://en.wikipedia.org/wiki/Cargo_cult_programming

    是否包含空 else { } 块将以某种方式提高代码的质量、可读性或健壮性?我想不是。

        5
  •  1
  •   baumann    11 年前

    纯粹从语义的角度来看,我想不出一个案例 如果没有一个隐含的else。

    如果汽车在我到达墙前不停下来,我就撞车,否则我就不会撞车。

    撇开语义不谈:

    这个问题的答案取决于环境,以及错误的结果是什么。


    我想,你会发现,尽管一开始它看起来太多的工作,拼写出来,将成为宝贵的10年后,当你重温代码。但是,如果你错过了一个重要的“反条件”,那肯定不是世界末日。

    然而:安全、安全还是生命关键代码?那是另一回事。

    在这种情况下,你要做两件事。
    F级irst:Rather than 测试一个错误,你想证明有 一个错误。这需要对进入任何模块都持悲观态度。你以为一切都错了 直到你证明它是正确的。

    bool everyThingIsSafe = true;
    if(darnThereIsAProblem())
    {
       reportToUserEndOfWorld();
    }
    return everyThingIsSafe;
    

    哎呀。我忘了把所有的安全都设成假的。

    处理故障。
    是的,我本可以把支票立即退回的任务分配给everyThingIsSafe()。
    严格地说,它所代表的隐含意义是合理的。
    给食品和药物管理局/安全审计员,也许不是。
    如果它是显式的,可以指向测试,它的else,并且我清楚地处理了这两个条件。

    我为医疗设备编码已经25年了。在本例中,您需要else,您需要本例中的默认值,并且它们从不为空。你想知道到底会发生什么,或者尽可能接近。因为忽视一个条件可能会杀人。

    查一下Therac-25。8人重伤。3人死亡。

        6
  •  1
  •   Akshay Khale    5 年前

    else 部分用于 if 声明。

    事实上,大多数开发商更喜欢和建议避免 其他的

    就是这样

    if (number >= 18) {
        let allow_user = true;
    } else {
        let allow_user = false;
    }
    

    let allow_user = false;
    if (number >= 18) {
        let allow_user = true;
    }
    
        7
  •  0
  •   Thom Smith    14 年前

    这纯粹是风格和清晰度的问题。很容易想象,如果语句,特别是简单的语句,对于它们来说,else是非常多余的。但是,当你有一个更复杂的条件,也许处理了许多不同的情况,它往往可以明确宣布,否则,什么都不应该做。在这种情况下,我会留下 // do nothing

        8
  •  0
  •   Laramie    14 年前

    if (someCondition)
        bar();
        notbar();  //won't be run conditionally, though it looks like it might
    
    foo();
    

    我会写信的

     if (someCondition){
            bar();
            notbar();  //will be run
     }
     foo();
    
        9
  •  0
  •   Cem Kalyoncu    10 年前

    我知道我迟到了,但我做了很多思考,并想分享我的结果。

    在关键代码中,必须考虑每个分支。写一个else是没有必要的,但是留下一个else是没有必要的标记以及为什么。这将有助于评论者。观察:

    //negatives should be fixed
    if(a < 0) {
        a+=m;
    }
    //else value is positive
    
        10
  •  -1
  •   InsertNickHere    14 年前

    有时没有其他部分…包含一个空的部分只会使代码的可读性降低。

        11
  •  -1
  •   Ahmed Aman    14 年前

    不,你不必。。

    另外,我不认为这是一个好主意的可读性,因为你会有很多空的 阻碍。这可不好看。