15

可以使用哪些控制结构来代替多个嵌套的 IF 语句。

例如:

function change_password($email, $password, $new_password, $confirm_new_password)
{
    if($email && $password && $new_password && $confirm_new_password)
    {
        if($new_password == $confirm_new_password)
        {
            if(login($email, $password))
            {
                if(set_password($email, $new_password))
                {
                    return TRUE;
                }
            }
        }
    }
}       

这个函数是这样使用的:

if(!change_password($email, $password, $new_password, $confirm_new_password)
{
    echo 'The form was not filled in correctly!';
    exit;
}

我这样调用我的所有函数,我想知道我的编码风格是否有问题。我有疑问,因为如果我遵循这个设计,那么这意味着我编写的每个函数都将嵌套在 IF 中,检查每个阶段是否存在错误。这是别人做的吗?

我没有看到很多其他这样编写的脚本,嵌套的 IF 形成一个三角形,并且只有在中间有所需的结果。如果没有达到中间,那么事情就搞砸了。

这是一个好的函数结构吗?

4

3 回答 3

37

嵌套太深通常是个坏主意——这是意大利面条式的逻辑,难以理解。由于您的每个验证步骤都取决于前一个阶段是否成功,因此根本不要嵌套 - 只是在阶段失败时退出:

function change_password(blah blah blah) {
   if (!$condition1) {
      return false;
   }
   if (!$condition2) {
      return false;
   }
   etc....


   // got here, must have succeeded
   return true;
}

这清楚地表明了逻辑序列是什么。

于 2012-08-07T04:31:53.583 回答
4

if我认为它绝对是可读性好的,与只使用一个语句相比更容易理解

if (blah and blah and blah and blah and blah and blah and blah) {}

但是我仍然更喜欢这样做 - 太多的缩进会有点烦人:

function change_password($email, $password, $new_password, $confirm_new_password)
{
    if (!$email || !$password || !$new_password || !$confirm_new_password) return false;
    if ($new_password != $confirm_new_password) return false;
    if (!login($email, $password)) return false;
    if (!set_password($email, $new_password)) return false;

    return true;
}
于 2012-08-07T04:34:15.687 回答
0

嵌套它们可能会很好,因为通过更改顺序,您可以避免进行额外的比较。你现在所做的看起来不错,但是如果你把它写成这样,你的函数效率会降低:

function change_password($email, $password, $new_password, $confirm_new_password)
{
    if($new_password == $confirm_new_password && $email && $password && $new_password && $confirm_new_password)
    {
        if(login($email, $password))
        {
            if(set_password($email, $new_password))
            {
                return TRUE;
            }
        }

    }
}

如果 $new_password == $confirm_new_password 为真,但 $email 为空,您将进行额外比较。

正如其他人所说,还有其他方法可以在不嵌套所有内容的情况下解决这个问题,这在功能上是等效的。

于 2012-08-07T04:36:31.207 回答