jeudi 16 décembre 2010
Évaluer des conditions multiples dans une instruction IF
Publié par Infinite Loop, à 19 h 55
1 commentaire
Dans du code source, une instruction IF est quelque chose qu'on comprend généralement assez facilement. Elle comprend une ou plusieurs conditions qui, une fois évaluées, permettent de savoir si on doit ou non exécuter le code subséquent.
À partir de cet exemple qui récupère un enregistrement de la base de données :
$record = $connection->query('SELECT * FROM employee_sales WHERE employee = 18');Je suis convaincu que vous êtes déjà tombé sur du code dont la condition du if ressemblait à ça (peut-être l'avez-vous écrite vous-même ?) :
/*
Imaginez la structure obtenue :
$record = array(
'active' => true,
'salary' => 40000,
'weeklySales' => 1200,
'weeklyAverage' => 1000,
'hours' => 35
);
*/
if($record['active'] && ($record['salary'] / ($record['hours'] * 52) > 20) && ($record['weeklySales'] >= $record['weeklyAverage']) && ((($record['weeklySales'] - $record['weeklyAverage']) * 52) > (0.25 * $record['salary']) ) ){Vous trouvez ça difficile à comprendre ? Je suis d'accord. J'ai vraiment fait exprès pour rendre ça compliqué pour rien, uniquement pour illustrer mon propos. Sur le coup, le programmeur qui écrit le code dans ce style a probablement eu le souçi de minimiser le nombre de lignes au détriment de la compréhension pour le prochain programmeur qui héritera du projet (ou vous-même, 1 an plus tard).
// mérite un bonus!
}
Quand c'est à moi que ça arrive, j'ai l'habitude de reformater le code avant même d'essayer de le comprendre. C'est plus simple à lire et ça évite de faire des erreurs de syntaxe lors de l'édition.
Pour une question de clareté et de lisibilité, certains pourront opter pour un formatage qui liste une condition par ligne :
if( $record['active']C'est déjà plus clair.
&& ($record['salary'] / ($record['hours'] * 52) > 20)
&& ($record['weeklySales'] >= $record['weeklyAverage'])
&& ((($record['weeklySales'] - $record['weeklyAverage']) * 52) > (0.25 * $record['salary']) )
){
// mérite un bonus!
}
Sinon, une solution alternative serait de créer une liste des conditions dans un array. Comme toutes les conditions seraient évaluées individuellement à true ou false, on obtiendrait un array du type : array(true, true, true, false) dans lequel on n'aurait qu'à s'assurer qu'il n'y a aucune valeur fausse.
$conditions = array(Qui plus est, un autre avantage est de laisser de l'espace pour pouvoir ajouter un commentaire à la suite de chaque condition. Juste pour préserver la bonne humeur du programmeur qui reprendra le flambeau de votre projet dans un avenir proche.
$record['active'],
($record['salary'] / ($record['hours'] * 52) > 20),
($record['weeklySales'] >= $record['weeklyAverage']),
((($record['weeklySales'] - $record['weeklyAverage']) * 52) > (0.25 * $record['salary']) )
);
if( !in_array(false, $conditions) ){
// mérite un bonus!
}
Excellent, je n'y aurai jamais pensé !
Bon, on peut quand même être d'accord, que ce n'est que pour l'exemple ? .. parce que là, pour savoir quelle condition a échoué...