Oui
Vous devez toujours utiliser des parenthèses ... vous ne contrôlez pas l'ordre de priorité ... le développeur du compilateur le fait. Voici une histoire qui m'est arrivée à propos de la non utilisation de parenthèses. Cela a affecté des centaines de personnes sur une période de deux semaines.
Raison du monde réel
J'ai hérité d'une application main-frame. Un jour, hors du bleu clair, il a cessé de fonctionner. C'est ça ... pouf ça vient de s'arrêter.
Mon travail consistait à le faire fonctionner aussi vite que possible. Le code source n'avait pas été modifié depuis deux ans, mais tout à coup, il s'est arrêté. J'ai essayé de compiler le code et il s'est cassé sur la ligne XX. J'ai regardé la ligne XX et je ne pouvais pas dire ce qui ferait la rupture de la ligne XX. J'ai demandé les spécifications détaillées pour cette application et il n'y en avait pas. La ligne XX n'était pas le coupable.
J'ai imprimé le code et commencé à l'examiner de haut en bas. J'ai commencé à créer un organigramme de ce qui se passait. Le code était si compliqué que je ne pouvais même pas en comprendre le sens. J'ai arrêté d'essayer de l'organigramme. J'avais peur de faire des changements sans savoir comment ce changement affecterait le reste du processus, d'autant plus que je n'avais aucun détail sur le fonctionnement de l'application ni sur son emplacement dans la chaîne de dépendance.
J'ai donc décidé de commencer en haut du code source et d'ajouter des freins à ligne et à ligne pour rendre le code plus lisible. J'ai remarqué que, dans certains cas, certaines conditions étaient réunies AND
et OR
qu'il n'était pas clairement possible de distinguer entre les données AND
éditées et les données OR
éditées. J'ai donc commencé à mettre des parenthèses sur les conditions AND
et OR
pour les rendre plus lisibles.
Alors que je descendais lentement pour le nettoyer, je sauvegardais périodiquement mon travail. A un moment, j'ai essayé de compiler le code et une chose étrange s'est produite. L'erreur avait dépassé la ligne de code d'origine et était maintenant plus basse. Alors j'ai continué, speparating le AND
et OR
conditions avec parens. Quand j'ai fini de le nettoyer, ça a fonctionné. Allez comprendre.
J'ai ensuite décidé de visiter l'atelier des opérations et de leur demander s'ils avaient récemment installé de nouveaux composants sur le châssis principal. Ils ont dit oui, nous avons récemment mis à jour le compilateur. Hmmmm.
Il s'est avéré que l'ancien compilateur évaluait l'expression de gauche à droite malgré tout. La nouvelle version du compilateur a également évalué les expressions de gauche à droite, mais un code ambigu, ce qui signifie une combinaison peu claire de AND
et OR
ne peut pas être résolu.
La leçon que j'ai apprise de cela ... TOUJOURS, TOUJOURS, TOUJOURS utiliser des parens dans des AND
conditions distinctes et des OR
conditions lorsqu'ils sont utilisés conjointement.
Exemple simplifié
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(Code jonché de plusieurs d'entre eux)
Ceci est une version simplifiée de ce que j'ai rencontré. Il y avait aussi d'autres conditions avec des énoncés de logique booléenne composés.
Je me souviens de l'avoir malmené pour:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
Je ne pouvais pas le réécrire car il n'y avait pas de spécifications. L'auteur original était parti depuis longtemps. Je me souviens d'une pression intense. Un cargo tout entier était bloqué dans le port et ne pouvait être déchargé car ce petit programme ne fonctionnait pas. Pas d'avertissement. Aucune modification du code source. Il m'est simplement apparu de demander aux Opérations du réseau si elles modifiaient quoi que ce soit après avoir remarqué que l'ajout de parenthèses avait modifié les erreurs.