100 votes

Meilleure façon de formater une instruction if avec plusieurs conditions

Si vous voulez qu'un code soit exécuté en fonction de deux ou plusieurs conditions, quelle est la meilleure façon de formater cette instruction if ?

premier exemple:-

if(ConditionOne && ConditionTwo && ConditionThree)
{
   Code to execute
}

Deuxième exemple:-

if(ConditionOne)
{
   if(ConditionTwo )
   {
     if(ConditionThree)
     {
       Code to execute
     }
   }
}

qui est le plus facile à comprendre et à lire, sachant que chaque condition peut être un long nom de fonction ou autre.

4voto

Omar Kooheji Points 14073

Le second est un exemple classique de la Anti-modèle de la flèche Donc je l'éviterais...

Si vos conditions sont trop longues, extrayez-les en méthodes/propriétés.

3voto

RB. Points 17993

Le premier est plus facile, parce que, si vous le lisez de gauche à droite, vous obtenez : "Si quelque chose ET quelque chose d'autre ET quelque chose d'autre ALORS", ce qui est une phrase facile à comprendre. Le deuxième exemple se lit comme suit : "Si quelque chose ALORS, si quelque chose d'autre ALORS, si quelque chose d'autre ALORS", ce qui est maladroit.

De même, si vous souhaitez utiliser des OU dans votre clause, comment le feriez-vous dans le deuxième style ?

0voto

Brad Gilbert Points 12724

En Perl, vous pourriez faire ceci :

{
  ( VeryLongCondition_1 ) or last;
  ( VeryLongCondition_2 ) or last;
  ( VeryLongCondition_3 ) or last;
  ( VeryLongCondition_4 ) or last;
  ( VeryLongCondition_5 ) or last;
  ( VeryLongCondition_6 ) or last;

  # Guarded code goes here
}

Si l'une des conditions n'est pas remplie, l'opération se poursuit, après le blocage. Si vous définissez des variables que vous souhaitez conserver après le bloc, vous devrez les définir avant le bloc.

-3voto

Tiper Loc Points 1

Je suis confronté à ce dilemme depuis longtemps et je n'arrive toujours pas à trouver une solution adéquate. À mon avis, la seule bonne solution est d'essayer d'abord de se débarrasser des conditions précédentes pour ne pas avoir à en comparer 5 d'un coup.

S'il n'y a pas d'autre solution, comme d'autres l'ont suggéré, décomposez-la en plusieurs parties et raccourcissez les noms ou regroupez-les. Par exemple, si toutes les parties doivent être vraies, utilisez quelque chose comme "si aucun faux dans le tableau de x, alors exécutez".

Si tout échoue, @Eoin Campbell a donné de très bonnes idées.

-4voto

CodeDriller Points 3

Lorsque la condition est vraiment complexe, j'utilise le style suivant (exemple concret de PHP) :

if( $format_bool &&
    (
        ( isset( $column_info['native_type'] )
            && stripos( $column_info['native_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['driver:decl_type'] )
            && stripos( $column_info['driver:decl_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['pdo_type'] )
            && $column_info['pdo_type'] == PDO::PARAM_BOOL
        )
    )
)

Je pense que c'est plus agréable et plus lisible que d'imbriquer plusieurs niveaux de if() . Et dans certains cas comme celui-ci, vous ne pouvez tout simplement pas diviser une condition complexe en plusieurs parties, car sinon vous devriez répéter les mêmes déclarations dans les documents suivants if() {...} bloc plusieurs fois.

Je pense également qu'ajouter un peu d'"air" dans le code est toujours une bonne idée. Cela améliore grandement la lisibilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X