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

Rah*_*yas 14 programming-languages concept

我问的问题可能会被关闭,但我只想知道是否有必要写下每个if条件的一部分.我的一位高级程序员告诉我"你应该把其他部分写入每一个条件".假设我们没有条件写入else部分那么我们该怎么办?我假设这里将进行健康的讨论....

pax*_*blo 16

这是一个可怕的想法.您最终获得了表单的代​​码:

if (something) {
    doSomething();
} else {
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以认为更具可读性或可维护性,完全没有根本不可能else.这听起来像是由那些手上有太多空闲时间的人组成的规则之一.让他们尽可能快地解雇,或者至少平静而安静地离开:-)


Jon*_*eet 8

不,你肯定不会到-至少在大多数语言.(你没有指明;很可能有一种语言可以强制执行此操作.)这是一个我肯定会这样做的例子:

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

现在你可以将方法的主要工作放在这里的"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果没有"其他",这会更具可读性吗?这真的是个人选择的问题,我不会声称我总是一致的.两个分支同等地缩进使得它们在某种程度上具有相同的权重 - 并且可能鼓励稍后通过反转条件进行重构的可能性......而如果我们刚刚进入"返回原始价格",则重构将其放入 if块中乍一看,将折扣案移出一个if块就不那么明显了.


Abh*_*kar 5

在像 Java 和 C 这样的命令式语言中,if - else是一个语句并且不返回值。所以你可以愉快地只写if一部分然后继续。而且我认为这是更好的做法,而不是else在每个if.

然而,在像 Haskell 和 Clojure 这样的函数式语言中,if是一个表达式,它必须返回一个值。所以它必须以else. 但是,在某些情况下,您可能不需要某个else部分。Clojure的,对于这种情况,有when它包装宏if - else返回nilelse部分,避免写它。

(when (met? somecondition)
  (dosomething))
Run Code Online (Sandbox Code Playgroud)