首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么"else“很少用在"if x then return”之后?

为什么"else“很少用在"if x then return”之后?
EN

Stack Overflow用户
提问于 2010-07-16 12:06:12
回答 20查看 21.4K关注 0票数 69

此方法:

代码语言:javascript
复制
boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }
    else {
        return s.contains(":)");
    }
}

可以等效地写成:

代码语言:javascript
复制
boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }

    return s.contains(":)");
}

根据我的经验,第二种形式更常见,特别是在更复杂的方法中(可能有几个这样的退出点),对于“抛出”和“返回”也是如此。然而,第一种形式可以说使代码的条件结构更加明确。有什么理由更喜欢其中之一吗?

(相关:Should a function have only one return statement?)

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2010-07-16 12:20:45

根据我的经验,这取决于代码。如果我在“防范”某件事,我会这样做:

代码语言:javascript
复制
if (inputVar.isBad()) {
    return;
}

doThings();

要点很清楚:如果这句话是假的,我不希望函数继续执行。

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

代码语言:javascript
复制
if (inputVar == thingOne) {
    doFirstThing();
} else if (inputVar == secondThing) {
    doSecondThing();
} else {
    doThirdThing();
}

即使它可以写成:

代码语言:javascript
复制
if (inputVar == thingOne) {
    doFirstThing();
    return;
}
if (inputVar == thingTwo) {
    doSecondThing();
    return;
}
doThingThree();
return;

这实际上归结于哪种方式最能清楚地显示代码正在做什么(不一定哪一位代码最短或缩进最少)。

票数 74
EN

Stack Overflow用户

发布于 2010-07-16 12:08:03

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

票数 92
EN

Stack Overflow用户

发布于 2010-07-16 12:19:21

这是一种称为Guard Clause的模式。这个想法是在前面做所有的检查,以减少嵌套条件,增加可读性。

从链接:

代码语言:javascript
复制
double getPayAmount() {
    double result;
    if (_isDead) {
        result = deadAmount();
    } else {
        if (_isSeparated) {
            result = separatedAmount();
        } else {
            if (_isRetired) {
                result = retiredAmount();
            } else {
                result = normalPayAmount();
            }
        }
    }

    return result;
}

使用Guard子句,您将看到以下结果:

代码语言:javascript
复制
double getPayAmount() {
    if (_isDead) return deadAmount();
    if (_isSeparated) return separatedAmount();
    if (_isRetired) return retiredAmount();

    return normalPayAmount();
};
票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3261849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档