嵌套条件与意外结果的返回

时间:2012-08-09 23:32:52

标签: php coding-style conditional

考虑以下两种编码风格:

嵌套条件:

if(is_numeric($user_id)) {

    // .. do stuff
    if(is_valid_user($user_id)) {
        return foo($user_id);
    } else {
        return FALSE;
    }

} else {
    return FALSE;
}

VS。只是在出现问题时停止:

if(!is_numeric($user_id)) {
    return FALSE;
}    

// .. do stuff

if(!is_valid_user($user_id)) {
    return FALSE;
}

return foo($user_id);

这当然至少部分是关于味道;但这两种不同的风格叫什么?

什么时候优先于另一个?

还有其他可能更清晰的编码风格吗?

3 个答案:

答案 0 :(得分:1)

您可以完全取消else

if (is_numeric($user_id)) {

    // do stuff

    if (is_valid_user($user_id))    
        return foo($user_id);
}

return false;

更清洁,更少的代码,仍然易于阅读/理解。

答案 1 :(得分:1)

与您的问题相关的另一种编码风格是每个方法/函数只有一个return语句。

学校经常教这个原则。我认为Martin Fowler是最初基于一些在线搜索的支持者。

主要原因可能与PHP无关,但在C语言中,例如,如果你在需要清理的函数中动态分配了内存,那么在整个地方返回会导致重复的代码,泄漏的内存,或者必须使用goto来获取释放内存的代码。

答案 2 :(得分:1)

我通常认为最少嵌套更容易阅读。因此,我更喜欢第二种风格。当然,使用什么样的风格无关紧要,我甚至会稍微改变你的第二个例子,让我更容易阅读。

if(!is_numeric($user_id)) return FALSE;

// .. do stuff

if(!is_valid_user($user_id)) return FALSE;

return foo($user_id);

对我来说,右边的回复陈述让他们脱颖而出。此外,将整个事情放在一行上可以帮助我将这些语句描绘成门,并轻松地将代码转换为部分......但这只是我。