Je me demande quand c'est une mauvaise idée d'utiliser plusieurs instructions IF imbriquées.
par exemple:
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;
}
}
}
}
}
Cette fonction est utilisée comme ceci:
if(!change_password($email, $password, $new_password, $confirm_new_password)
{
echo 'The form was not filled in correctly!';
exit;
}
J'appelle toutes mes fonctions comme ça, et je me demande s'il y a quelque chose qui ne va pas avec mon style de codage. J'ai des doutes parce que si je suis cette conception, cela signifie que chaque fonction que j'écrirai sera imbriquée avec des IF, vérifiant s'il y a des erreurs à chaque étape. Est-ce ce que font les autres?
Je ne vois pas beaucoup d'autres scripts écrits comme ça, avec les IF imbriqués faisant une forme de triangle et n'ayant que le résultat souhaité au milieu. Si le milieu n'est pas atteint, alors quelque chose a foiré.
Est-ce une bonne structure de fonction?
Nidifier trop profondément est généralement une mauvaise idée - c'est une logique de spaghetti et difficile à suivre. Étant donné que chacune de vos étapes de vérification dépend de la réussite de l'étape précédente, ne vous imbriquez pas du tout - renflouez-vous simplement lorsqu'une étape échoue:
function change_password(blah blah blah) {
if (!$condition1) {
return false;
}
if (!$condition2) {
return false;
}
etc....
// got here, must have succeeded
return true;
}
Cela montre clairement quelle est la séquence logique.
Je pense qu'il est certainement bien lisible et peut facilement être compris par rapport à l'utilisation d'une seule instruction if
comme
if (blah and blah and blah and blah and blah and blah and blah) {}
Cependant, je préférerais toujours le faire de cette façon - trop d'indentation peut devenir un peu ennuyeux:
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;
}
Il peut être bon de les imbriquer, car en changeant l'ordre, vous pourrez éviter de faire des comparaisons supplémentaires. Ce que vous faites maintenant semble bien, mais votre fonction serait moins efficace si vous l'écriviez à la place comme suit:
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;
}
}
}
}
Si $ new_password == $ confirm_new_password est vrai, mais $ email est vide, vous aurez fait une comparaison supplémentaire.
Comme d'autres l'ont dit, il existe d'autres façons de procéder sans imbriquer tout, qui seront fonctionnellement équivalentes.