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

时间:2010-08-03 05:59:34

标签: programming-languages concept

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

11 个答案:

答案 0 :(得分:16)

这是一个可怕的想法。您最终获得了以下形式的代码:

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

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

答案 1 :(得分:8)

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

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;
    }
}

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

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

答案 2 :(得分:4)

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

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

包含空else { }块会以某种方式提高代码的质量,可读性或稳健性吗?我想不是。

答案 3 :(得分:4)

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

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

(when (met? somecondition)
  (dosomething))

答案 4 :(得分:1)

纯粹从语义的角度来看这个 - 我想不出一个案例 每个if都没有隐含的else。

如果在我到达墙壁之前车没有停下来我会崩溃,否则我不会崩溃。

除了语义:

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

商业代码?做你的编码标准所说的 恕我直言,你会发现拼写它,虽然最初似乎太多的工作,从你现在重新访问该代码10年后将变得非常宝贵。但是,如果你错过了一个重要的“反条件”,它肯定不会是世界末日。

但是:安全,安全或生命关键代码?那是一个不同的故事。

在这种情况下,你想做两件事 第一:你想要证明是一个错误,而不是测试一个错误。这需要对任何模块的进入持悲观态度。你认为一切都是错的 直到你证明它是正确的。
第二:生命危急:你永远不想伤害病人。:

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

糟糕。我忘了将everyThingIsSafe设为false 调用此snippit的例程现在被骗了。如果我将evertThingIsSafe初始化为false - 我总是安全的,但现在我需要else子句来表明没有错误。
是的,我本来可以把它变成一个积极的测试 - 但后来我需要其他的 处理故障。
是的,我可以分配everyThingIsSafe()立即返回支票。 然后测试该标志以报告问题。隐含的其他,为什么不明确?
严格地说,这代表隐含的其他是合理的 对于FDA /安全审核员,也许不是。
如果它是明确的,可以指向测试,它的其他,并且我清楚地处理了这两个条件。

我已经为医疗设备编码了25年。在这种情况下,你想要else,你想要在这种情况下的默认值,它们永远不会是空的。你想知道到底会发生什么,或者尽可能地知道。因为忽视一个条件可能会杀死某人。

查看Therac-25。 8人重伤。 3死了。

答案 5 :(得分:0)

不,你没必要..

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

答案 6 :(得分:0)

不,但我个人选择始终包含封装大括号以避免

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

foo();

我会写

 if (someCondition){
        bar();
        notbar();  //will be run
 }
 foo();

答案 7 :(得分:0)

有时候没有其他部分....而且包含一个空的只是使代码不那么可读imho。

答案 8 :(得分:0)

这纯粹是风格和清晰度的问题。很容易想象,如果陈述,特别是简单的陈述,其他的话将是多余的。但是当你有一个更复杂的条件,或许可以处理许多不同的情况时,通常可以澄清明确声明否则,什么都不应该做。在这些情况下,我会在其他空的其他内容中留下// do nothing条评论,以清楚该空格是有意留空的。

答案 9 :(得分:0)

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

在关键代码中,每个分支都必须考虑到。写一个其他的没有必要,但留下一个其他不必要的标记和原因。这将有助于审稿人。观察:

//negatives should be fixed
if(a < 0) {
    a+=m;
}
//else value is positive

答案 10 :(得分:0)

否,不需要为else语句编写if部分。

实际上,大多数开发人员都喜欢并建议避免使用else块。

那是

代替写作

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

大多数开发人员更喜欢:

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