Java 为什么是;否则";很少在“之后使用”;如果是x,则返回“;?

Java 为什么是;否则";很少在“之后使用”;如果是x,则返回“;?,java,coding-style,if-statement,function-exit,Java,Coding Style,If Statement,Function Exit,此方法: boolean containsSmiley(String s) { if (s == null) { return false; } else { return s.contains(":)"); } } 可以等效地写为: boolean containsSmiley(String s) { if (s == null) { return false; } return s.c

此方法:

boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }
    else {
        return s.contains(":)");
    }
}
可以等效地写为:

boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }

    return s.contains(":)");
}
根据我的经验,第二种形式更常见,尤其是在更复杂的方法中(可能有几个这样的退出点),对于“抛出”和“返回”也是如此。然而,第一种形式可以说使代码的条件结构更加明确。有什么理由选择一个而不是另一个


(相关:)

在这种情况下,
否则
将是多余的,并且会为函数的主代码创建不必要的额外缩进。

第一种形式更简单-当您返回值时,您会自动离开所处函数的范围并返回给调用方,因此,此后的任何代码只有在if语句的计算结果不为true并随后返回任何内容时才会执行。

我认为可读性很好。如果您正在扫描代码屏幕,试图找出代码的作用,那么它会向开发人员提供一个可视提示


…但实际上并不需要它,因为我们对代码的注释都很好,对吗?:)

在我看来,第二个更有意义。它更像是一个“默认”动作,就像一个开关。如果它与任何其他出口点都不匹配,那么就这样做。你真的不需要其他人。我会说,如果整个函数只有if和elseif,那么else就有意义了,因为它是一个巨大的条件。如果其中运行了多个条件和其他函数,则将使用末尾的默认返回。

我更喜欢这样写:

boolean containsSmiley(String s) {
    return s != null && s.contains(":)");
}
if (inputVar == thingOne) {
    doFirstThing();
} else if (inputVar == secondThing) {
    doSecondThing();
} else {
    doThirdThing();
}

else
是冗余的。此外,一些IDE(Eclipse)和分析工具(可能是FindBugs)可能会将其标记为警告或错误,因此在这种情况下,程序员可能会将其删除。

而使用else是正确的,并且在逻辑和可运行性方面没有任何问题,我喜欢避免函数在if/else范围之外没有返回语句的初始WTF时刻。

这是一个宗教争论,在一天结束时,这并不重要。我甚至认为第一种形式在某些情况下更具可读性。如果在
If-elseif-elseif-else
中有大量代码,那么乍一看就更容易看到默认返回值是什么

if (s == null) {
    return false;
}
else if (s.Contains(":))")) {
    return true;
}
else if (s.Contains(":-(")) {
    return false;
}

return s.contains(":)");
这是一种模式,称为。其思想是预先进行所有检查,以减少嵌套条件,从而提高可读性

从链接:

double getPayAmount() {
    double result;
    if (_isDead) {
        result = deadAmount();
    } else {
        if (_isSeparated) {
            result = separatedAmount();
        } else {
            if (_isRetired) {
                result = retiredAmount();
            } else {
                result = normalPayAmount();
            }
        }
    }

    return result;
}
使用Guard子句,您将看到以下结果:

double getPayAmount() {
    if (_isDead) return deadAmount();
    if (_isSeparated) return separatedAmount();
    if (_isRetired) return retiredAmount();

    return normalPayAmount();
};

原则是“实体不能超出必要性而倍增。”

根据我的经验,这取决于代码。如果我在“防范”什么,我会:

if (inputVar.isBad()) {
    return;
}

doThings();
要点很清楚:如果该语句为false,我不希望函数继续

另一方面,有些函数具有多个选项,在这种情况下,我将这样编写:

boolean containsSmiley(String s) {
    return s != null && s.contains(":)");
}
if (inputVar == thingOne) {
    doFirstThing();
} else if (inputVar == secondThing) {
    doSecondThing();
} else {
    doThirdThing();
}
即使它可以写为:

if (inputVar == thingOne) {
    doFirstThing();
    return;
}
if (inputVar == thingTwo) {
    doSecondThing();
    return;
}
doThingThree();
return;

它实际上归结为哪种方式最清楚地显示了代码在做什么(不一定是哪一位代码最短或缩进最少)。if语句正在检查/强制执行您的契约/不接收空值的期望。出于这个原因,我更愿意看到它与函数的其余部分分离,因为它与您试图实现的实际逻辑没有任何关系(尽管这种情况非常简单)


不过,在大多数情况下,我更喜欢代码在意图上尽可能明确。如果您可以对您的函数进行一些重构,使其更易于其他人阅读,那么就这样做。作为一名专业程序员,你的目标应该是为那些在你之后必须维护你的代码的人(包括两年后的你自己)编程。任何你能帮助他们的事情都值得去做。

正如你所看到的,不同的人对可读性有不同的看法。有些人认为代码行数越少,代码可读性越好。另一些人认为第二种形式的对称性使它更具可读性


我的看法是,可能两种观点都是正确的。。。为了那些持有它们的人。由此推论,您无法编写人人都认为可读性最佳的代码。因此,最好的建议是按照你的法定编码标准去做(如果它在这方面有什么规定的话),并且通常使用你的常识。(如果你被一个口口声声说他的方式是“正确的”的笨蛋压得喘不过气来……那就顺其自然吧。)

你会看到这一切:

if (condition) {
    return var;
}
// by nature, when execution reaches this point, condition can only be false,
// therefore, the else is unnecessary
return other_var;
大多数情况下,在这种情况下添加else子句不仅是不必要的,而且在很多情况下,编译器会对它进行优化

想想计算机是如何看待这个代码的(就机器代码而言,为了演示起见,这里简化为伪代码):

代码(同样,这是一个伪代码,不是程序集)的作用方式与
if/then/else
条件代码的作用方式完全相同

对于许多人来说,一个函数有多个可能的退出点被认为是不好的和/或令人困惑的做法,因为程序员必须考虑通过代码的每一条可能的路径。另一种做法是:

return (condition) ? var : other_var;

这简化了代码,并且不会创建任何新的退出点。

因为如果在这种情况下使用else,eclipse中有一个可选(默认关闭)警告;)

好吧,有些原因只是惯例,但上面的形式有一个优点


编写返回语句时,通常将最后一条语句作为默认返回值。这主要有助于重构-否则子句往往会被其他结构所包围,或者可能意外地被移到树的更深处。

从维护的角度来看,我更喜欢一个退出点而不是多个退出点。最终结果可以在一个出口点而不是n个出口点修改(或修饰)。

第二种形式i
boolean containsSmiley(String s) {
    if (s == null)   // The curly braces are not even necessary as the if contains only one instruction.
        return false;

    return s.contains(":)");
}
boolean constainsSMiley(String s) {
    return string.IsNullOrEmpty(s) ? false : s.Contains(":)");
}
boolean containsSmiley(String s) {
    assert s != null : "Quit passing null values, you moron.";
    return s.contains(":)");
}