Dernièrement, j'ai beaucoup travaillé en PHP et plus particulièrement dans le cadre WordPress. Je remarque beaucoup de code sous la forme de:
if ( 1 == $options['postlink'] )
Où je m'attendais à voir:
if ( $options['postlink'] == 1 )
Est-ce une convention trouvée dans certaines langues / cadres? Y a-t-il une raison pour laquelle la première approche est préférable à la seconde (du point de vue du traitement, de l'analyse ou même du point de vue humain?)
Ou est-ce simplement une question de goût? J'ai toujours pensé qu'il était préférable, lors de l'exécution d'un test, que l'élément variable testé par rapport à une constante soit à gauche. Cela semble mieux correspondre à la façon dont nous poserions la question en langage naturel: "si le gâteau est au chocolat" plutôt que "si le chocolat est le gâteau".
Réponses:
La principale raison de faire cela (ce qu'on appelle "Yoda conditionnel") est pour éviter les accidents par lesquels vous utilisez accidentellement un opérateur d'affectation (
=
) au lieu de l'opérateur de comparaison d'égalité (==
).C'est-à-dire si vous avez commis l'erreur de faire:
La déclaration sera évaluée à
true
(ou, dans le cas de certaines langues, comme PHP, une valeur de vérité) et vous aurez un bogue difficile à trouver.Mais si vous avez fait:
Vous recevrez une erreur fatale, car vous ne pouvez pas affecter
$foo
à un entier.Mais comme vous l'avez fait remarquer, inverser l'ordre rend généralement les choses moins lisibles. Ainsi, de nombreuses normes de codage (mais pas toutes, y compris WordPress ) suggèrent ou exigent
$foo == 1
malgré les avantages de la recherche de bogues1 == $foo
.En règle générale, mon conseil est de respecter la norme de codage établie, le cas échéant: pour WordPress, cela signifie que vous devez utiliser le conditionnel de Yoda.
Lorsqu'il n'y en a pas et qu'il est impossible d'en établir un par consensus avec vos pairs, c'est le choix du revendeur.
la source
:=
l’opérateur d’affectation (avec==
pour test d’égalité) afin d’éviter ce genre de problème.=
place de==
. La différence est tellement accentuée partout que je ne les ai jamais confondus. D'autre part, j'ai lu beaucoup de codes qui sont source de confusion ou qui sont difficiles à comprendre. En tant que tel, je mettrais les priorités sur la lisibilité :). Peu importe, bonne réponse.-Wall -Werror
ou l’équivalent de votre compilateur / interprète. Il existe très peu de situations dans lesquelles une affectation dans une condition est correcte, encore moins lisible. Beaucoup de langues ne le permettent même pas.if($foo = 1)
Equivaut àtrue
dans certaines langues, en PHP , il évalue à 1 au lieu;if($foo = 20)
évalue à 20;if($foo = 0)
évalue à 0, ce qui contrairement aux autres est faux. Cela peut ajouter toute une couche de complexité au bogue.C'est un mécanisme de codage défensif destiné à prévenir une utilisation accidentelle de l'opérateur d'assignation.
Considérons une mauvaise utilisation / erreur de l'opérateur d'affectation à la place de l'opérateur d'égalité
La condition ci-dessus deviendrait toujours vraie, mais ce n'est probablement pas ce que le programmeur d'origine avait en tête. Considérez, à sa place, cette
Ici, PHP (et la plupart des autres langues) refuserait de s’exécuter, car il est impossible d’attribuer quoi que ce soit à la valeur fixe de
1
. En codant toutes les instructions conditionnelles de cette manière, vous vous assurez automatiquement de l'absence d'utilisation accidentelle d'un opérateur d'affectation dans une condition.la source
J'aime utiliser cette convention en Java pour supprimer la possibilité d'une exception de pointeur nul. Donc, quelque chose comme ça ne vous causera aucun problème ni besoin de code supplémentaire:
la source
En pratique, de nombreux compilateurs vous avertiront si vous écrivez "if (x = 1)" au lieu de "if (x == 1)", car il s'agit très probablement d'une erreur.
Avec Clang, vous pouvez éviter l'avertissement en disant efficacement au compilateur "Je le pense vraiment, et je sais ce que je fais", et cela se fait en écrivant "if ((x = 1))". Notez les parenthèses supplémentaires. Cela fonctionne aussi dans d'autres situations. si (faux) déclaration; peut vous avertir que la déclaration n'est jamais exécutée; if ((false)) statement; ne donne pas cet avertissement.
la source
if ($array = getSomething()){ // ..so something with $array }