Devrais-je utiliser des parenthèses dans les instructions logiques même si cela n'est pas nécessaire?

100

Disons que j'ai une condition booléenne a AND b OR c AND det que j'utilise un langage dans lequel l' ANDordre de priorité des opérations est supérieur à celui de OR. Je pourrais écrire cette ligne de code:

If (a AND b) OR (c AND d) Then ...

Mais en réalité, cela équivaut à:

If a AND b OR c AND d Then ...

Existe-t-il des arguments pour ou contre l'inclusion des parenthèses superflues? Est-ce que l'expérience pratique suggère qu'il vaut la peine de les inclure pour plus de lisibilité? Ou est-ce un signe qu'un développeur doit vraiment s'asseoir et avoir confiance en les bases de son langage?

Jeff Bridgman
la source
90
Je suis peut-être paresseux, mais je préfère avoir des parenthèses dans la plupart des situations de ce type pour des raisons de lisibilité.
Thorsten Müller
6
Moi aussi. J'espère juste que je le ferai plus pour la lisibilité et moins parce que je suis trop paresseux pour devenir confiant / compétent dans les bases de ma langue.
Jeff Bridgman
16
Un bon usage des parenthèses est comme un bon usage de la grammaire. 2 * 3 + 2pourrait être le même que, (2 * 3) + 2mais le second est plus facile à lire.
Reactgular
16
@ Mathew Peut-être si vous êtes faible en maths. Pour les cas plus complexes, utilisez des parenthèses. Mais pour les plus aveuglément évidents (BODMAS…), ils réduisent davantage la lisibilité que l’aider à cause de l’encombrement.
Konrad Rudolph
3
Cela dit, la même priorité de AND / OR est valable dans Basic, Python, SQL ... j'ai l'impression que c'est la règle dans la grande majorité des langues modernes (bien que pas toutes).
Tim Goodman

Réponses:

118

Les bons développeurs s'efforcent d'écrire du code clair et correct . Les parenthèses conditionnelles, même si elles ne sont pas strictement requises, aident à la fois.

En ce qui concerne la clarté , pensez aux parenthèses comme les commentaires dans le code: elles ne sont pas strictement nécessaires et, en théorie, un développeur compétent devrait pouvoir comprendre le code sans eux. Et pourtant, ces indices sont extrêmement utiles, car:

  • Ils réduisent le travail requis pour comprendre le code.
  • Ils fournissent une confirmation de l'intention du développeur.

De plus, des parenthèses supplémentaires, tout comme les indentations, les espaces et autres normes de style, aident à organiser visuellement le code de manière logique.

Pour ce qui est de l' exactitude , les conditions sans parenthèses sont une recette pour des erreurs stupides. Lorsqu'ils se produisent, ils peuvent constituer des bogues difficiles à trouver, car souvent, une condition incorrecte se comporte correctement la plupart du temps et n'échoue qu'occasionnellement.

Et même si vous comprenez bien, la prochaine personne à travailler sur votre code ne peut pas, soit ajouter des erreurs à l'expression, soit mal comprendre votre logique, et donc ajouter des erreurs ailleurs (comme le fait remarquer à juste titre LarsH).

J'utilise toujours des parenthèses pour les expressions combinant andet or(ainsi que pour les opérations arithmétiques présentant des problèmes de priorité similaires).

utilisateur82096
la source
3
Bien que j'ai entendu dire que les commentaires sont des excuses (pour un code mauvais / difficile à lire) ... il y a de bonnes chances que vous l'ayez mieux écrit. Je suppose que vous pourriez dire une chose semblable à propos des parenthèses.
Jeff Bridgman
6
Un autre aspect de la correction consiste à le conserver par le biais de modifications: alors que le développeur initial peut obtenir la priorité sans parenthèses lorsqu’il écrit pour la première fois le code avec le but et le contexte à l’esprit, il (ou un autre) qui se présente plus tard et ne se souvient pas de tout les détails risquent de gâcher le problème lorsqu'ils ajoutent plus de termes à l'expression. (C'était déjà en grande partie déjà impliqué mais je sentais que cela valait la peine d'être souligné.)
LarsH
1
@LarsH, merci, j'ai ajouté ceci explicitement à la réponse.
8
+1 "Ils fournissent une confirmation de l'intention du développeur." - n'importe quel programmeur (OK, peut-être pas tous, mais tous ceux qui résident ici ...) peut déterminer ce que le compilateur fera avec la logique la plus complexe. Absolument personne ne peut déterminer ce que le développeur original avait prévu (y compris lui-même) dans les semaines à
venir
2
Je pense que @JeffBridgman faisait référence à un point de vue assez bien connu, selon lequel "les commentaires peuvent parfois être une odeur de code". Voir par exemple le résumé de Jeff Atwood qui inclut la question "Pouvez-vous refactoriser le code pour que les commentaires ne soient plus nécessaires?". Je dirais que si votre commentaire explique pourquoi votre code est si peu intuitif, cela peut certainement indiquer que quelque chose ne va pas. Dans de tels cas, il est judicieux de simplifier le code. Cependant, je suis tout à fait d’accord avec votre réponse et prend des parenthèses.
Daniel B
94

Peu importe que vous ayez confiance en votre compréhension de la langue. Ce qui compte le plus, c’est l’appréhension du langage du n00b qui vous suit.

Écrivez votre code de la manière la plus claire et la plus claire possible. Des parenthèses supplémentaires aident souvent (mais pas toujours). Mettre une seule déclaration sur une ligne aide souvent. La cohérence dans le style de codage aide souvent.

Trop de parenthèses existent, mais c’est l’une des situations dans lesquelles vous n’avez pas besoin de conseils - vous le saurez quand vous le verrez. À ce stade, modifiez votre code pour réduire la complexité de l'instruction plutôt que de supprimer les parenthèses.

Dan Pichelman
la source
72
N'oubliez pas que même si vous êtes développeur solo lorsque vous êtes malade, fatigué ou utilisez du code que vous avez écrit l'année dernière; votre niveau de compréhension est réduit à celui d'un n00b.
Dan Neely
30
There is such a thing as too many parenthesis- tu n'es évidemment pas liseuse;)
paul
18
C'est un mauvais conseil: n'écris pas pour les noobs. Cela réduira (considérablement) la qualité de votre code car vous ne pouvez pas utiliser d'idiomes bien établis allant au-delà des deux premiers chapitres d'un livre pour débutant.
Konrad Rudolph
10
@ KonradRudolph: c'est peut-être vrai, mais n'écrivez pas pour les seuls gars qui connaissent l'art de la programmation informatique de bout en bout, ou soyez prêt à avoir à déboguer leur code après coup, et ne savez pas pourquoi vous avez fait les choses de cette façon. . Le code est lu beaucoup plus qu'il n'est écrit.
Hayem
15
@dodgethesteamroller: J'ai vu beaucoup trop de développeurs compétents / respectés qui introduisaient des bogues de priorité (tout le monde a une mauvaise journée de temps en temps) qui restent inaperçus pendant des siècles. Pour les bons développeurs qui connaissent les règles de priorité, le risque d'erreurs / fautes de frappe non détectées est trop élevé. Pour tous les autres, le risque est plus élevé. Les meilleurs développeurs sont les développeurs qui avaient l'habitude de se rappeler les règles de priorité du langage, mais les ont oubliés à cause de l'utilisation habituelle de parenthèses pour tout ce qui n'est pas évident.
Brendan
32

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 ANDet ORqu'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 ANDet ORpour 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 ANDet ORconditions 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 ANDet ORne peut pas être résolu.

La leçon que j'ai apprise de cela ... TOUJOURS, TOUJOURS, TOUJOURS utiliser des parens dans des ANDconditions distinctes et des ORconditions 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.

Michael Riley - AKA Gunny
la source
22
Cela semble être une meilleure illustration de la raison pour laquelle il est important d'avoir un bon compilateur.
Ruakh
6
@CapeCodGunny: Je suis sûr que vous ne l'avez pas fait. Mais le problème ici est que vous avez eu un mauvais fournisseur de compilateur qui a opéré un changement radical. Je ne vois pas comment vous avez appris à "TOUJOURS, TOUJOURS, TOUJOURS" résoudre ce problème, même si vous utilisez de meilleurs compilateurs.
Ruakh
5
@ruakh - Non, le fournisseur a simplement changé son analyseur de code. Je suis vieille école, je ne compte pas sur ma capacité à me souvenir de chaque système que j'ai codé ou sur lequel j'ai été impliqué. Sans documentation, tout ce que vous avez est le code source. Lorsque le code source est difficile à lire et à suivre, cela crée une situation extrêmement stressante. Les programmeurs qui n'utilisent pas d'espaces n'ont probablement jamais eu à faire face à une situation comme celle à laquelle j'étais confronté. J'ai aussi appris qu'il était plus logique d'écrire un code comme celui-ci: See Dick; Voir Jane; Voir Dick et Jane; Des déclarations simples, faciles à lire, à commenter, à suivre.
Michael Riley - AKA Gunny le
2
Belle histoire, mais je conviens que ce n'est pas une raison pour utiliser des parenthèses. et / ou la préséance est presque universelle et sur la chose la moins susceptible de changer que l'on puisse penser. Si vous ne pouvez pas compter sur un comportement cohérent pour une opération de base aussi standard, votre compilateur est un déchet et vous êtes fatigué, peu importe ce que vous faites. Votre histoire est à 100% un problème de compilateur et à 0% un problème de code. D'autant plus que le comportement par défaut était une simple évaluation de gauche à droite - l'ordre serait toujours clair, alors pourquoi utiliser des parenthèses?
7
Je pense qu’il ya des enseignements à tirer ici des deux côtés ... Vous feriez bien mieux de vous servir de parenthèses, en particulier lorsque l’alternative repose sur le comportement non documenté d’un compilateur en ce qui concerne le code ambigu . Et si le programmeur ne sait pas quelles expressions sont ambiguës, mieux utiliser les parens. D'un autre côté, il est dangereux de changer le comportement d'un compilateur, mais au moins cela a jeté une erreur dans les cas où le comportement a changé. Cela aurait été pire si le compilateur n'avait pas généré d'erreur, mais avait commencé à compiler différemment. L'erreur vous a protégé des bugs inaperçus.
LarsH
18

Oui, s'il y a un mélange de 'et' et 'ou'.

Aussi bonne idée de () ce qui est logiquement une vérification.

Bien que le mieux est d’utiliser des fonctions de prédicat bien nommées et d’évacuer la plupart des vérifications et conditions présentes, en laissant les choses simples et lisibles.

Balog Pal
la source
6
Certes, il y a de très bonnes chances que vous a AND bdeviez probablement être remplacé par une fonction ou une valeur boolen pré-calculée ayant un nom plus descriptif.
Jeff Bridgman
14

Les parenthèses sont sémantiquement redondantes, donc le compilateur s'en fiche, mais c'est un fil rouge - la vraie préoccupation est la lisibilité et la compréhension du programmeur.

Je vais prendre la position radicale ici et donner un copieux « non » aux parenthèses dans a AND b OR c AND d. Chaque programmeur doit savoir par cœur que la priorité dans les expressions booléennes ne va PAS> ET> OU , comme si vous vous souveniez Veuillez excuser ma chère tante Sally pour les expressions algébriques. La ponctuation redondante ajoute simplement un fouillis visuel dans le code sans aucun avantage pour la lisibilité du programmeur.

En outre, si vous utilisez toujours des parenthèses dans les expressions logiques et algébriques, vous ne pouvez plus les utiliser comme marqueur de "quelque chose de délicat se passe ici - faites attention!" C'est-à-dire que dans les cas où vous souhaitez remplacer la priorité par défaut et faire évaluer l'addition avant la multiplication, ou OU avant, les parenthèses constituent un joli drapeau rouge pour le prochain programmeur. Trop d'utilisation d'eux quand ils ne sont pas nécessaires, et vous devenez le garçon qui a pleuré Wolf.

Je ferais une exception pour tout ce qui ne relève pas du domaine de l'algèbre (qu'il soit booléen ou non), tel que les expressions de pointeur en C, où tout ce qui est plus compliqué que des idiomes standard tels que *p++ou p = p->nextdevraient probablement être mis entre parenthèses pour que le déréférencement et l'arithmétique soient droits. Et, bien sûr, rien de tout cela ne s'applique aux langues telles que Lisp, Forth ou Smalltalk qui utilisent une forme de notation polonaise pour les expressions; mais pour la majorité des langues traditionnelles, la priorité logique et arithmétique est totalement normalisée.

dodgethesteamroller
la source
1
+1, les parenthèses pour plus de clarté conviennent, mais ANDvs ORest un cas relativement simple que je voudrais faire connaître aux autres développeurs de mon équipe. Je crains que parfois "utiliser des parenthèses pour plus de clarté", c’est vraiment "utiliser des parenthèses, de sorte que je n’ai jamais à prendre la peine d’apprendre la priorité".
Tim Goodman
1
Dans toutes les langues que je travaille régulièrement est .memberavant les opérateurs unaires, avant unaire opérateurs binaires, *et /avant +et -avant <et >et ==avant &&avant ||avant l' affectation. Ces règles sont faciles à retenir car elles correspondent à mon "bon sens" concernant la manière dont les opérateurs sont normalement utilisés (par exemple, vous ne donneriez pas ==plus de priorité à +ou 1 + 1 == 2cesser de fonctionner) et couvrent 95% des questions de liste de priorité que j'aurais. .
Tim Goodman
4
@ TimGoodman Oui, tout à fait, à vos deux commentaires. Les autres répondants semblent penser qu'il s'agit d'une question noire ou blanche: utilisez des parenthèses tout le temps, sans exception, ou passez inaperçu du siège de votre pantalon dans un océan de règles arbitraires et impossibles à retenir, votre code débordant. avec des bugs potentiels difficiles à repérer. (Métaphores mixtes très intentionnelles.) Évidemment, la modération est la bonne solution. La clarté du code est importante, mais il est également essentiel de bien connaître vos outils. Vous devriez pouvoir vous attendre à une certaine compréhension minimale de la programmation et des principes de la CS de la part de vos coéquipiers.
dodgethesteamroller
8

Comme je le vois:

OUI les avantages:

  • L'ordre des opérations est explicite.
  • Vous protège des futurs développeurs qui ne comprennent pas l'ordre des opérations.

Oui les inconvénients:

  • Peut entraîner un code encombré et difficile à lire

AUCUN avantage:

  • ?

NON Inconvénients:

  • L'ordre des opérations est implicite
  • Le code est moins gérable pour les développeurs sans une bonne compréhension de l'ordre des opérations.
MetaFight
la source
Bien dit, bien que je pense que "peut entraîner un code encombré et difficile à lire" est plutôt subjectif.
FrustratedWithFormsDesigner
2
En quoi l'explicitation de la sémantique de votre code rend-elle la lecture difficile?
Mason Wheeler
1
Je suis d'accord avec les autres dans la remise en question de votre "oui contre". Je pense que c'est presque toujours le contraire.
@ Frustré aussi subjectif que l'affirmation opposée. Sens, pas du tout, vraiment. Juste difficile à mesurer.
Konrad Rudolph
1
@MasonWheeler: Bien que je convienne que les parens explicites sont très importants dans de nombreux cas, je peux voir comment on peut exagérer en rendant explicite la sémantique. Je trouve 3 * a^2 + 2 * b^2plus facile à lire que (3 * (a^2)) + (2 * (b^2))parce que le format et la priorité sont familiers et standard. De même, vous pourriez (pour être extrême) interdire l'utilisation de fonctions et de macros (ou de compilateurs!) Afin de rendre la sémantique de votre code plus explicite. Évidemment, je ne le préconise pas, mais j'espère pouvoir répondre à votre question sur les raisons pour lesquelles il faut imposer des limites (un équilibre) pour rendre les choses explicites.
LarsH
3

Existe-t-il des arguments pour ou contre l'inclusion des parenthèses superflues? Est-ce que l'expérience pratique suggère qu'il vaut la peine de les inclure pour plus de lisibilité? Ou est-ce un signe qu'un développeur doit vraiment s'asseoir et avoir confiance en les bases de son langage?

Si personne d'autre n'avait à revoir mon code, je ne pense pas que je m'en soucierais.

Mais, d'après mon expérience:

  • Je regarde mon code à nouveau de temps en temps (parfois des années après l'avoir écrit)
  • D'autres regardent parfois mon code
    • Ou même avoir à développer / résoudre le problème!
  • Ni moi ni l'autre ne me souviens exactement de ce que je pensais en l'écrivant
  • Écrire du code cryptique "minimiser le nombre de caractères" nuit à la lisibilité

Je le fais presque toujours parce que je me fie à ma capacité de lire rapidement et de ne pas faire de petites erreurs beaucoup plus avec des pairs que rien d’autre.

Dans votre cas, je ferais presque assurément quelque chose comme:

if (a AND b) then ab = true
if (c AND d) then cd = true
If (ab OR cd) Then ...

Oui, c'est plus de code. Oui, je peux faire à la place des opérateurs fantaisistes. Non, je n'aime pas trop le risque que j'écrive le code d'un an ou plus dans le futur. J'ai mal interprété les opérateurs fantaisistes. Que se passe-t-il si j'écrivais du code dans une langue qui avait une priorité différente ET / OU et que je devais revenir en arrière pour résoudre ce problème? Est-ce que je vais y aller, "aha! Je me souviens de cette petite chose intelligente que j'ai faite! Je n'avais pas à inclure les parens quand j'ai écrit cette année, bonne chose que je me souvienne maintenant!" si cela se produit (ou pire, quelqu'un d'autre qui n'était pas au courant de cette intelligence ou qui a été jeté dans une situation de type "solution immédiate")?

Séparer avec () rend beaucoup plus facile de parcourir rapidement et de comprendre plus tard ...

Enderland
la source
7
Si vous voulez faire ça, pourquoi pas ab = a AND b?
Eric
1
Peut-être parce abque restera inchangé sinon a AND b.
Armali
3

Cas général

En C #, la multiplication et la division ont la priorité sur l'addition et la soustraction.

Pourtant, StyleCop, un outil qui applique un style commun à l’ensemble de la base de code avec un objectif supplémentaire, à savoir la règle SA1407, consiste à atténuer le risque que des bogues ne soient introduits par code . Cette règle produira un avertissement avec un morceau de code comme ceci:

var a = 1 + 2 * 3;

Il est clair que le résultat est 7et non 9, mais néanmoins, StyleCop suggère de mettre des parenthèses:

var a = 1 + (2 * 3);

Votre cas particulier

Dans votre cas particulier, il existe une priorité de AND par rapport à OR dans la langue que vous utilisez.

Ce n'est pas comme ça que chaque langue se comporte. Beaucoup d'autres traitent ET et OU de manière égale.

En tant que développeur travaillant principalement avec C #, lorsque j'ai vu votre question pour la première fois et lu le code sans lire ce que vous aviez écrit auparavant, ma première tentation a été de dire que les deux expressions ne sont pas identiques. J'espère que j'ai lu toute la question avant de commenter.

Cette particularité et le risque que certains développeurs pensent que ET et OU ont la même priorité rend encore plus important l’ajout de parenthèses.

N'écrivez pas de code dans le but de montrer que vous êtes intelligent. Écrivez un code avec un objectif de lisibilité, y compris par des personnes qui ne sont peut-être pas familiarisées avec tous les aspects de la langue.

Arseni Mourzenko
la source
1
"C'est très rare": selon Stroustrup2013, C ++ 11 semble avoir une priorité différente de AND et OR (p. 257). Pareil pour Python: docs.python.org/2/reference/expressions.html
Dirk
10
Re: "Chaque langue que je connais traite ET et OU également": je doute que cela soit vrai. S'il est vrai, alors vous ne savez pas une des dix langues les plus populaires (C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, et Ruby), et en aucune position à commenter ce qui est "peu commun", encore moins "très peu commun".
Ruakh
1
Je suis d’accord avec ruakh et j’ai cherché C ++ 11, python, matlab et java.
Dirk
3
Les langues dans lesquelles AND et OR sont des opérateurs binaires, et qui ne considèrent pas AND comme ayant une priorité plus élevée que OR, sont des merdes braindamaged dont les auteurs sont des flunkies en informatique. Cela vient de la notation logique. Bonjour, "somme de produits" ne veut-il rien dire? Il existe même une notation booléenne qui utilise la multiplication (juxtaposition de facteurs) pour AND et le symbole + pour OR.
Kaz
3
@ruakh Vous venez de faire mon point pour moi. Parce qu'il y a une poignée de cas pathologiques, cela ne signifie pas que vous ne devriez pas apprendre la préséance booléenne standard et présumer qu'elle est valable jusqu'à preuve du contraire. Nous ne parlons pas de décisions de conception arbitraires ici; L'algèbre booléenne a été inventée bien avant les ordinateurs. En outre, montrez-moi la spécification Pascal dont vous parlez. Ici et ici montrer ET avant OU.
dodgethesteamroller
1

Comme tout le monde l'a dit, utilisez des parenthèses à chaque fois, cela rend l'expression plus lisible. Cependant, si l'expression est compliquée, je conseillerais d' introduire de nouvelles fonctions pour les sous-expressions .

Honza Brabec
la source
0

Ou est-ce un signe qu'un développeur doit vraiment s'asseoir et avoir confiance en les bases de son langage?

Si vous utilisez strictement la langue au singulier, peut-être. Maintenant, prenez tous les langages que vous connaissez, des âges aux plus modernes, de la compilation au scripting en passant par le SQL et votre propre DSL que vous avez inventé le mois dernier.

Vous souvenez-vous des règles de priorité exactes pour chacune de ces langues, sans regarder?

Sécurise
la source
1
Et comme @Cape Cod Gunny l'a noté ci-dessus, même si vous pensez connaître une langue froide, le compilateur / run-time peut changer en dessous de vous.
Jordanie
0

"Dois-je utiliser des parenthèses dans les instructions logiques même si cela n’est pas nécessaire?"

Oui, parce que deux personnes les trouveront utiles:

  • Le prochain programmeur, dont les connaissances, les compétences ou le style peuvent être différents

  • L'avenir vous qui revenez à ce code à une date ultérieure!

Michael Durrant
la source
-1

Les conditionnelles complexes sont "l'algèbre de Boolean", ce que vous écrivez d'une manière qui donne l'impression qu'elle ressemble beaucoup à l'algèbre, et que vous utiliseriez certainement des parens pour l' algèbre , n'est-ce pas?

Les règles vraiment utiles sont celles de la négation:

!(A || B) <=> !A && !B
!(A && B) <=> !A || !B

Ou, dans un format un peu plus clair:

!(A + B) <=> !A * !B
!(A * B) <=> !A + !B

ce qui est vraiment clairement juste algèbre quand écrit comme:

-1*(A + B) = -A + -B
-1*(A * B) = -A * -B

Mais nous pouvons également appliquer la réflexion à la simplification algébrique et à l’extension:

(A && B) || (C && D) => 
((A && B) || C) && ((A && B) || D) => 
(AC && BC) && (AD && BD) =>
AC && BC && AD && BD

bien que dans le code vous devez écrire:

(A||C) && (B||C) && (A||D) && (B||D)

ou, dans un format un peu plus clair:

(A + B) * (C + D) => 
((A + B) * C) + ((A + B) * D) => 
(AC + BC) + (AD + BD) =>
AC + BC + AD + BD

Fondamentalement, une condition est toujours juste une expression algébrique, et en utilisant clairement une parenthèse, vous pouvez plus facilement appliquer les différentes règles algébriques que vous connaissez déjà à l'expression, y compris votre ancien concept de "simplifier ou élargir cette formule".

Narfanator
la source
2
Je ne suis pas sûr que vous répondiez réellement à la question, puisque vous menez votre réponse avec une hypothèse qui n'est pas nécessairement vraie. Est-ce que j'utiliserais des parenthèses pour l'algèbre? Pas tout le temps. Si cela aide à la lisibilité, alors certainement, mais d’autres l’ont déjà exprimé ici. Et développer l'algèbre mathématique dans d'autres formes ne correspond pas exactement à la programmation: que se passera-t-il si vous vérifiez le statut de quelques valeurs de chaîne?
Derek
Si l'algèbre booléenne correspondante est suffisamment compliquée pour justifier des parens, votre conditionnel devrait probablement utiliser des parens. Si c'est assez simple pour ne pas mériter des parens, vous n'avez pas à le faire ou vous ne devriez pas le faire. Quoi qu’il en soit, y penser comme une expression mathématique clarifie probablement la question.
Narfanator
Mes exemples ci-dessus utilisent deux et quatre booléens. Si vous vérifiez le statut de deux valeurs de chaîne ou plus, cela correspond. Chaque contrôle correspond à une variable booléenne; indépendamment du fait que cette vérification est égalité entière ou chaîne; inclusion de chaîne, de tableau ou de hachage; une expression complexe elle-même ... Peu importe; tout ce qui compte, c’est que vous avez plus d’une mesure de vrai / faux dans votre expression.
Narfanator
2
Juste tatillonne, mais !(A + B) <=> !A + !Bet -1*(A + B) = -A + -Bne doit pas l'opérateur a été renversé de +à *la deuxième expression?
Jeff Bridgman
-1

Je vais utiliser des parenthèses même si cela est facultatif, car cela aide à mieux comprendre pour tout le monde, pour celui qui écrit le code ainsi que pour celui qui est prêt à le voir. Dans votre cas, même les opérateurs booléens ont la priorité, cela pourrait bien fonctionner au début, mais nous ne pouvons pas dire que cela vous aidera dans tous les cas. Je préfère donc utiliser la parenthèse utilisateur dans toutes les conditions qui peuvent l'exiger ou éventuellement.

Singa Selva Sankar
la source
-1

Oui. Vous devez utiliser dans tous les cas lorsque vous sentez que votre code sera plus clair. N'oubliez pas que votre code doit être suffisamment clair pour que les autres puissent comprendre sans lire vos commentaires dans le code. C'est donc une bonne pratique d'utiliser des parenthèses et des accolades. Gardez également à l'esprit que cela peut dépendre de la pratique particulière de votre entreprise / équipe. Il suffit de maintenir une approche et de ne pas mélanger.

DeveloperArnab
la source