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