“If (if = 0 == value)…” ne fait-il pas plus de mal que de bien? [fermé]


49

C'est l'une des choses que je déteste le plus quand je le vois dans le code de quelqu'un d'autre. Je sais ce que cela signifie et pourquoi certaines personnes le font de cette façon ("et si je mettais accidentellement '=' à la place?"). Pour moi, c'est comme quand un enfant descend les escaliers en comptant les pas à haute voix.

Quoi qu'il en soit, voici mes arguments contre:

  • Cela perturbe le flux naturel de lecture du code du programme. Nous, les humains, disons "si la valeur est zéro" et non pas "si zéro est la valeur".
  • Les compilateurs modernes vous avertissent lorsque vous avez une tâche dans votre condition, ou en fait si votre condition consiste uniquement en une tâche qui, oui, a l'air suspecte quand même.
  • Vous ne devez pas oublier de mettre double '=' lorsque vous comparez des valeurs si vous êtes programmeur. Vous pouvez aussi oublier de mettre "!" lors du test de non-égalité.

17
Je ne m'en soucie pas beaucoup non plus, mais c'est assez loin dans ma liste personnelle de bête noire.
Adam Crossland

7
Et les programmeurs manquent parfois le double '='. C'est une erreur facile à commettre et très facile à négliger.
Etrange

8
Comment est-ce pas constructif ou pas une vraie question?
TheLQ

7
Ceci est fermé alors voici ma courte opinion: comment les gens peuvent-ils se rappeler d’écrire 0 == valuesans s’écrire ==?? Je veux dire blimey, si vous y réfléchissez, pourquoi ne pas l'écrire correctement pour commencer.
Dr. Hannibal Lecter

3
@muntoo: Selon les compilateurs, beaucoup de choses sont "correctes", je ne pense pas que ce soit un très bon point de repère.
Dr. Hannibal Lecter

Réponses:


59

Ah, oui, "Yoda conditionals" ("Si la valeur est zéro, exécutez ce code, vous devez!"). Je pointe toujours ceux qui prétendent être "meilleurs" vers des outils tels que la charpie (1). Ce problème particulier a été résolu depuis la fin des années 70. La plupart des langues modernes ne compileront même pas une expression du même type if(x = 10), car elles refusent de contraindre le résultat de l'affectation à un booléen.

Comme d'autres l'ont dit, ce n'est certainement pas un problème, mais cela provoque un peu de dissonance cognitive.


32
+1 pour "conditionnels de Yoda". En fait, j'ai adoré ça. :)
Bobby Tables

3
Alors que la commande est bien, j'objecte à la comparaison à zéro au lieu de fonte booléenne simple, if(!value).
SF.

1
Vous considérez donc que les assignations dans une condition sont une erreur?

4
"La plupart des langues modernes ne compileront même pas cela" Le problème survient lorsque vous utilisez une langue qui contraint le résultat de l'attribution à un booléen. Le langage le plus populaire auquel je peux penser est le JavaScript. C'est pourquoi j'utilise toujours les conditions yoda même en Java pour ne pas oublier de le faire lorsque j'écris en javascript. Je permute entre les deux assez souvent pour que cela puisse (et ait) été un problème.
Sam Hasler

3
Est-ce que quelqu'un connaît un compilateur qui ne compilera pas if (0 == x)?
Kristopher Ives

56

C'est odieux parce que cela impose un impôt mental faible mais perceptible.

Les gens lisent de gauche à droite dans pratiquement tous les langages de programmation (et la plupart des langages naturels).

Si je vois 123 == x, la façon dont je l'analyse mentalement est la suivante:

  • 123- et alors? information incomplète.
  • == - Bon, 123 c'est 123, pourquoi le tester ...
  • x- ok, c'est ce qui nous préoccupe. Ce n'est que maintenant que j'ai le contexte.
  • Retournez à reconsidérer 123et pourquoi x y est comparé.

Quand je vois x == 123l'analyse mentale, c'est:

  • x- Fournit le contexte, je sais de quoi il s'agit. Je peux choisir d'ignorer le reste. Sur la base du flux précédent, j'ai une bonne idée du pourquoi et de ce qui va arriver (et soyez surpris si c'est différent).
  • == - J'ai pensé ainsi.
  • 123 - Ouaip.

La perturbation est faible (dans un exemple simple), mais je le remarque toujours .

Mettre la valeur en premier peut être une bonne idée si vous souhaitez attirer l’attention, par exemple if (LAUNCH_NUKES == cmd). Normalement, ce n'est pas l'intention.


5
Exactement. Dans les langues naturelles, la constante est toujours la dernière pour la même raison: si la lumière est rouge ...
mojuba

2
@mojuba C'est vrai, c'est presque universel. Bizarrement, il y a quelques langages naturels où l'objet vient avant le sujet (ordre OVS / OSV), mais ils sont tous obscurs.
dbkk

1
D'autre part, certains d'entre nous ont tendance à lire les symboles avant la variable. Ils sont plus accrocheurs. Je vais donc analyser =ou ==avant 123ou x, et je ne finirai même pas par traduire le code en anglais dans ma tête.
Izkata

En outre, la plupart des compilateurs avertiront correctement si le système le leur demande, à moins que l'un d'entre eux utilise des accolades supplémentaires. Il essaie donc de résoudre un problème qui ne se pose pas.
Déduplicateur

47

Nocif? Non, cela fonctionne dans les deux sens.

Mauvaise pratique? Discutable, au mieux. C'est une simple programmation défensive.

Vaut la peine de dormir? Nah.


8
Et quand je le lis, je comprends immédiatement le code, ce qui est pour moi la raison la plus importante de débattre d’un style de codage. Je suis totalement d'accord, pas la peine de perdre le sommeil.
Jeff Siver

17

Ceci est fondamentalement flaimbait.

Non, cela ne fait pas plus de mal que de bien. Facile.

Plus de mots?

Argument du compilateur? Euh, ish, peut-être - ne misez pas trop sur le complier pour vous sauver de vous-même.

"Tu ne devrais pas oublier" - bien duh - non bien sûr tu ne devrais pas entre temps je suis fatigué, j'ai codé toute la journée j'ai dû utiliser deux langues différentes et parfois, juste parfois, être humain, je le fais une erreur.

Le point essentiel de ce type de comportement est qu’il est défensif, il n’est pas là parce que vous vous attendez à faire des erreurs plus que vous n’avez une assurance parce que vous vous attendez à un crash ... mais si vous le faites, il est agréable d’être couvert.

Difficile à lire? Vous vous plaignez qu'un programmeur décent devrait avoir == câblé (ce qui fait toutes sortes de mauvaises hypothèses) mais que le même programmeur décent ne peut pas lire 0 == valeur ??

Ne pas nuire, a des avantages potentiels, question idiote, laisser les autres le faire s’ils le souhaitent et passer à autre chose.


6
Je pense que 0 == la valeur n'est pas naturelle pour ceux qui ont étudié l'algèbre bien avant d'étudier la programmation.
mojuba

4
Ce n'est pas le problème - oui, vous avez raison, il ne lit pas bien mais une grande partie de ce que nous écrivons en tant que programmeurs ne correspond pas exactement à un langage naturel et c'est une question d'interprétation. vous voyez
Murph

4
Bravo .. Sans oublier le fait que, parce qu'il lit anormalement, vous êtes enclin à y porter une attention particulière, ce qui risque de vous faire prendre des erreurs.
mocj

7
@mocj - Par conséquent, nous devrions tous coder de la manière la plus obtuse possible pour que les lecteurs de notre code aient réellement besoin de lire notre code?
Kaz Dragon

6
@mocj - Je vous en remercie, mais votre argument était que le "bégaiement du cerveau" pendant que vous lisez le conditionnel de Yoda est une bonne chose. Je pose la question que, si tel est le cas, devrions-nous chercher à écrire tout le code de manière à causer des "bégaiements"? Véritable question.
Kaz Dragon


10

Je n'ai jamais pensé que l'ensemble "Et si j'oubliais un =?" jamais vraiment tenu beaucoup de poids. Oui, vous pouvez faire une faute de frappe, mais nous faisons tous des fautes de frappe, il semble idiot de changer tout votre style de codage parce que vous avez peur de vous tromper. Pourquoi ne pas définir toutes vos variables et fonctions en minuscules sans aucune ponctuation, car vous pourriez oublier de mettre quelque chose en majuscule ou un trait de soulignement un jour?


5
Ce n'est pas le but de la question, le but est "est-ce nocif" - et ce n'est pas le cas. Une très légère irritation au pire, mais pas nuisible.
Murph

1
Dans les langages dynamiques - absolument, vous pouvez mal saisir un symbole et perdre votre temps plus tard à chercher la source de votre bug
mojuba

3
avec tout le respect que je vous dois, quand vous avez passé la nuit (ou deux) et que vous trouvez que la source (en code C ++) est = = au lieu de ==, cela aurait un certain poids.
DevSolo

2
@DevSolo: Je pense que cela devrait vraiment se produire une ou deux fois dans votre carrière, mais pas plus que cela
mojuba

9

Certaines personnes l'utilisent pour expliquer clairement ce que fait une condition. Par exemple:

Voie 1:

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

Voie 2:

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

Certaines personnes pensent que le deuxième exemple est plus concis ou l'inversion des arguments illustre l'intérêt d'un test (conditionnel) avant le test lui-même.

En réalité, cela ne me dérange pas vraiment. J'ai un faible pour le style et le plus important est l'incohérence. Donc, faites-le de la même manière, de manière cohérente et cela ne me dérangera pas de lire votre code.

Mélangez-le au point où il semble que six personnes différentes avec leur propre style se soient travaillées en même temps, je suis un peu agacé.


4
Le deuxième exemple m'a fait aller "hein?" Le premier est beaucoup plus lisible. Excellent exemple. :)
Mateen Ulhaq

6

Pour moi, c'est un conditionnement simple. En tant que personne qui a appris (dans les années 90) le C et le C ++, je m'y suis habituée et je l'utilise encore, même si les raisons en sont tirées.

Une fois que vous êtes "conditionné" à regarder le côté gauche pour la "constante", cela devient une seconde nature.

Je ne l'utilise également que pour l'équivalence (ou l'équivalence négative), pas pour supérieur / inférieur à.

Je suis complètement d'accord avec la réponse de W / @ Wonko.


5

Le cas dans lequel je trouve cela utile est celui où la partie variable du if est assez longue et voir les valeurs facilite la lecture du code. Les langages d'espace de noms en pointillés en ont les meilleurs exemples.

Par exemple, quelque chose sur lequel j'ai travaillé avec l'authentification unique a eu une situation où vous pouviez avoir deux sessions simultanées si un certain type d'erreur se produisait et était récupéré d'une certaine manière. Je dois donc ajouter un gestionnaire à l'intérieur si quelque chose comme ça:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

Certes, dans cet exemple, il existe d'autres moyens de le faire, mais il s'agirait d'un cas où la version avec le numéro premier serait potentiellement plus lisible.


2
Je pense que le mot clé ici est "d'autres façons de faire cela";)
mojuba

dans ce cas, oui, mais dans certains cas, cela reste le résultat le plus lisible. Mon seul argument est qu'il existe des raisons légitimes de le faire, autres que la lutte contre le comportement linguistique et idéologique et le type-o
Bill

Pour être honnête, j’ai des difficultés avec les conditions de Yoda pour <= et> =. Le signe == est une autre affaire, parce que dans ma tête, je peux simplement changer les symboles, mais dans votre cas, je dois me rappeler que count () doit être supérieur ou égal à 2, ce qui est assez ennuyant de pouvoir en déduire un signe plus petit ou égal.
Alex

3

Et pourtant, les erreurs se produisent. Et parfois, vous voulez une affectation dans un opérateur de boucle où vous pourriez sinon vérifier l’égalité, ou du moins il est pratique courante de l’utiliser.

Je maintiens quelque chose. Le conseil que j’ai suivi (éventuellement de Code Complete) est de garder ce qui devrait être la valeur inférieure sur la gauche lors des comparaisons. Je discutais de cela avec un collègue un peu plus tôt et il pensait que c'était un peu fou mais je m'y suis habitué.

Alors je dirais:

if ( 0 <= value )

Mais je dirais aussi:

if ( value <= 100 )

Égalité Je vais plutôt vérifier avec la variable de gauche, elle est simplement plus lisible.


1
Je suis habitué à utiliser if(y > x)tout le temps. Sauf si yc'est une constante.
Mateen Ulhaq

J'avais l'habitude de le faire de cette façon, mais une fois que j'ai eu l'idée d'avoir les valeurs les plus basses à gauche, j'ai trouvé que mon code était beaucoup plus lisible en un coup d'œil.
Glenatron
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.