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