将条件扁平化为重构

时间:2009-05-28 18:51:02

标签: refactoring coderush

考虑:

if (something) {
    // Code...
}

安装CodeRush后,建议:

if (!something) {
    return;
}
// Code...

有人可以解释一下这更好吗?肯定没有任何好处。

9 个答案:

答案 0 :(得分:7)

孤立,正如你所呈现的那样 - 没有任何好处。但是mark4o是正确的:它不那么嵌套,如果你看一下就会变得非常清楚,比如一个4级的嵌套:

public void foo() {
    if (a)
        if (b)
            if (c)
                if (d)
                    doSomething();
}

public void foo() {
    if (!a)
        return;
    if (!b)
        return;
    if (!c)
        return;
    if (!d)
        return;
    doSomething();
}
像这样的早期回报提高了可读性。

答案 1 :(得分:5)

在某些情况下,在方法开头验证所有输入更简洁,如果有任何不正确的话,只需拯救。您可以进行一系列单级if检查,在您确信输入良好之前,会连续检查越来越多的具体事项。然后,该方法的其余部分将更容易编写,并且往往具有更少的嵌套条件。

答案 2 :(得分:4)

较少的嵌套水平。

答案 3 :(得分:3)

这是一种用于可维护性的传统重构。参见:

http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html

有一个条件,这不是一个很大的进步。但它遵循“快速失败”原则,当你有很多条件时,你真的开始注意到它的好处。如果您在“结构化编程”中长大,通常建议函数具有单个退出点,则可能看起来不自然,但如果您曾尝试调试具有三个级别或更多嵌套条件的代码,您将开始欣赏它

答案 4 :(得分:2)

它可以用来使代码更具可读性(通过较少的嵌套)。请参阅here以获取一个好例子,并here了解有关优点的详细讨论。

这种模式通常用于取代:

void SomeMethod()
{
    if (condition_1)
    {
        if (condition_2)
        {
            if (condition_3)
            {
                // code
            }
        }
    }
}

使用:

void SomeMethod()
{
    if (!condition_1) { return; }
    if (!condition_2) { return; }
    if (!condition_3) { return; }

    // code
}

这对眼睛来说更容易。

答案 5 :(得分:0)

我不认为CodeRush会推荐它 - 而只是提供它作为选项。

答案 6 :(得分:0)

IMO,这取决于something!something是否属例外。如果something发生时存在大量代码,那么使用!something条件对于易读性和潜在的嵌套减少更有意义。

答案 7 :(得分:0)

好吧,以这种方式看待它(我将以php为例):

您填写表格并转到此页面:validate.php

示例1:

<?php

if (valid_data($_POST['username'])) {

    if (valid_data($_POST['password'])) {

        login();

    } else {
        die();
    }

} else {
    die();
}

?>

VS

<?php

if (!valid_data($_POST['username'])) {
    die();
}

if (!valid_data($_POST['password'])) {
    die();  
}

login();

?>

哪一个更好,更容易维护?请记住,这只是验证两件事。想象一下注册页面或其他内容。

答案 8 :(得分:0)

我记得很清楚,因为我已经和

一起去了大学工作
if (!something) {
    return;
}
// Code...

格式。我的讲师认为,在一个函数中有一个以上的退出点是不好的做法。我以为那是坚果和20多年的计算机编程,我仍然这样做。

公平地说,他生活在一个语言法语为C语言的时代,其功能往往很长,并且充满嵌套条件,很难追踪发生的事情。

然而,现在,简单就是王道:保持功能小并对它们进行良好评论是使事物易读和可维护的最佳方式。