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

Programming languages 是否有必要在每个if条件下编写其他部分?,programming-languages,concept,Programming Languages,Concept,我问的问题可能已经结束了,但我只想知道是否有必要编写每个if条件的其他部分。我的一位高级程序员对我说,“你应该在每个if条件下编写其他部分”。假设我们没有写其他部分的条件,那么我们该怎么办?我想这里会有一场健康的讨论….不,你不必 另外,我认为这对于可读性不是一个好主意,因为您将有很多空的else块。这可不好看。危险!危险,威尔·罗宾逊 包含空的else{}块是否会以某种方式提高代码的质量、可读性或健壮性?我想不是。那是个可怕的主意。您将得到以下表单的代码: if (something) {

我问的问题可能已经结束了,但我只想知道是否有必要编写每个if条件的其他部分。我的一位高级程序员对我说,“你应该在每个if条件下编写其他部分”。假设我们没有写其他部分的条件,那么我们该怎么办?我想这里会有一场健康的讨论….

不,你不必


另外,我认为这对于可读性不是一个好主意,因为您将有很多空的else块。这可不好看。

危险!危险,威尔·罗宾逊


包含空的
else{}
块是否会以某种方式提高代码的质量、可读性或健壮性?我想不是。那是个可怕的主意。您将得到以下表单的代码:

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

我无法理解为什么有人会认为它比没有
更具可读性或可维护性。这听起来像是那些有太多空闲时间的人制定的规则之一。尽快解雇他们,或者至少平静地离开:-)

不,但我个人选择总是包括封装支架以避免

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

foo();
我会写信的

 if (someCondition){
        bar();
        notbar();  //will be run
 }
 foo();
不,你当然不必——至少在大多数语言中是这样。(您没有具体说明;很可能有一种语言确实执行了这一点。)下面是一个我当然不会给出的示例:

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块的重构乍一看就不那么明显正确。

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

这纯粹是风格和清晰度的问题。很容易想象,如果语句,特别是简单的语句,使用else是非常多余的。但是当你有一个更复杂的条件,也许处理了许多不同的情况,它通常可以明确地声明,否则,什么都不应该做。在这些情况下,我会在另外一个空的else中留下一个
//do nothing
注释,以明确该空格是故意留空的。

在Java和C等命令式语言中,
if-else
是一个语句,不返回值。因此,您可以愉快地只编写
if
部分,然后继续。我认为这是更好的做法,而不是在每个
if
之后添加空的
else
s

但是,在Haskell和Clojure等函数式语言中,
if
是一个表达式,它必须返回一个值。因此,它必须通过
成功。但是,在某些情况下,您可能不需要
else
部分。对于这种情况,Clojure有一个
when
宏,它在
else
部分包装
if-else
以返回
nil
,并避免写入它

(when (met? somecondition)
  (dosomething))

纯粹从语义的角度来看,我想不出一个案例 其中没有一个隐含的else用于每个if

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

撇开语义不谈:

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

商业代码?按照编码标准执行。
依我看,你会发现,把它拼出来,虽然起初似乎太多的工作,但在10年后,当你重温这段代码时,它将变得非常宝贵。但是,如果你错过了一个重要的“反条件”,那肯定不是世界末日

然而:安全、安全或生命关键代码?那是一个不同的故事

在这种情况下,您需要做两件事。
第一:与其测试故障,不如证明没有故障。这需要对任何模块的入口持悲观态度。你以为一切都错了 直到你证明它是正确的。
第二:在生活中至关重要:你永远不想伤害病人

bool everyThingIsSafe = true;
if(darnThereIsAProblem())
{
   reportToUserEndOfWorld();
}
return everyThingIsSafe;
哎呀。我忘了把一切都设为安全。
被称为“狙击手”的程序现在被欺骗了。如果我将evertthingisafe初始化为false,我总是安全的,但是现在我需要else子句来指示没有错误。
是的,我本可以把它改成阳性检测,但我需要其他的 处理故障。
是的,我可以让everyThingIsSafe()立即返回支票。 然后测试标志以报告问题。一个隐式的else,为什么不显式?
严格地说,它所代表的隐含意义是合理的。
食品和药物管理局/安全审核员,可能不会。
如果它是明确的,可以指向测试,它的其他,并且我清楚地处理了这两个条件

我一直在编码
//negatives should be fixed
if(a < 0) {
    a+=m;
}
//else value is positive
if (number >= 18) {
    let allow_user = true;
} else {
    let allow_user = false;
}
let allow_user = false;
if (number >= 18) {
    let allow_user = true;
}