我想知道使用多个嵌套的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形成三角形,只在中间有所需的结果。如果没有达到中间位置,那么就会搞砸了。
这是一个很好的功能结构吗?
答案 0 :(得分:31)
嵌套太深通常是一个坏主意 - 这是意大利面条的逻辑,很难遵循。由于您的每个验证步骤都取决于前一阶段的成功,因此根本不要嵌套 - 只需在阶段失败时挽救:
function change_password(blah blah blah) {
if (!$condition1) {
return false;
}
if (!$condition2) {
return false;
}
etc....
// got here, must have succeeded
return true;
}
这使得它明确地清楚了逻辑顺序是什么。
答案 1 :(得分:2)
我认为它绝对具有良好的可读性,与仅使用一个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;
}
答案 2 :(得分:1)
嵌套它们可能会很好,因为通过更改顺序,您可以避免进行额外的比较。你现在正在做的事情看起来不错,但如果你把它写成:
,你的功能效率会降低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为true,但$ email为空,则您将进行额外的比较。
正如其他人所说,还有其他方法可以解决这个问题而不需要嵌套所有东西,这在功能上是相同的。