Quels sont quelques exemples où l'utilisation de parenthèses dans un programme abaisse la lisibilité?

StackOverflow https://stackoverflow.com/questions/2442088

Question

J'ai toujours pensé que les parenthèses meilleure lisibilité, mais dans mon manuel il y a une déclaration que l'utilisation de parenthèses réduit considérablement la lisibilité d'un programme. Quelqu'un at-il des exemples?

Était-ce utile?

La solution

Je peux trouver beaucoup d'où le contre- manque de la lisibilité entre parenthèses abaissées, mais le seul exemple que je peux penser à ce que l'auteur a pu vouloir dire quelque chose comme ceci:

if(((a == null) || (!(a.isSomething()))) && ((b == null) || (!(b.isSomething()))))
{
   // do some stuff
}

Dans le cas ci-dessus, le () autour de la méthode appelle est inutile, et ce genre de code peut bénéficier de l'affacturage en des termes dans les variables. Avec toutes ces parens proches du milieu de la condition, il est difficile de voir exactement ce qui est groupé avec quoi.

boolean aIsNotSomething = (a == null) || !a.isSomething();  // parens for readability
boolean bIsNotSomething = (b == null) || !b.isSomething();  // ditto
if(aIsNotSomething && bIsNotSomething)
{
   // do some stuff
}

Je pense que ce qui précède est plus facile à lire, mais c'est une opinion personnelle. Cela peut être ce que l'auteur parlait.

Quelques bonnes utilisations de parens:

  • de faire la distinction entre l'ordre de fonctionnement lorsque des changements de comportement sans les parenthèses
  • pour distinguer entre l'ordre de fonctionnement lorsque le comportement est pas affecté, mais une personne qui ne connaît pas les règles contraignantes assez bien va lire votre code. La règle bon citoyen.
  • pour indiquer que l'expression dans les parens doit être évaluée avant dans une expression plus grande: System.out.println("The answer is " + (a + b));

utilisation Peut-être source de confusion parens:

  • dans des endroits où il ne peut peut-être avoir un autre sens, comme devant a.isSomething() ci-dessus. En Java, si a est un Object, !a par lui-même est une erreur, si clairement !a.isSomething() doit nier la valeur de retour de l'appel de méthode.
  • pour relier ensemble un grand nombre de conditions ou expressions qui seraient plus claires si rompu. Comme dans l'exemple de code au-dessus, brisant la déclaration importante paranthetical en petits morceaux peut permettre le code à franchissait dans un débogueur plus simplement, et si les conditions / valeurs sont nécessaires plus tard dans le code, vous ne finissent pas à répéter les expressions et faire le travail deux fois. Ceci est subjectif, cependant, et de toute évidence dénuée de sens si vous utilisez uniquement les expressions 1 place et votre débogueur vous montre les expressions intermédiaires évalués de toute façon.

Autres conseils

Apparemment, votre manuel est écrit par quelqu'un qui déteste Lisp.

De toute façon, il est une question de goût, il n'y a pas de vérité unique pour tout le monde.

Je pense que les parenthèses ne sont pas une meilleure façon d'améliorer la lisibilité de votre code. Vous pouvez utiliser une nouvelle ligne pour souligner les conditions d'exemple si la déclaration. Je ne l'utilise entre parenthèses si elle n'est pas nécessaire.

Eh bien, pensez à quelque chose comme ceci:

Result = (x * y + p * q - 1) % t et

Result = (((x * y) + (p * q)) - 1) % t

Personnellement, je préfère l'ancien (mais c'est juste moi), parce que ce dernier me fait penser les paranthèses sont là pour changer l'ordre réel des opérations, alors qu'en fait ils ne le font pas. Votre manuel peut également consulter quand vous pouvez diviser vos calculs en plusieurs variables. Par exemple, vous aurez probablement quelque chose comme ça lors de la résolution d'une ax^2+bx+c=0 quadratique:

x1 = (-b + sqrt(b*b - 4*a*c)) / (2*a)

Ce qui ne semble sorte de laid. Cela ressemble mieux à mon avis:

SqrtDelta = sqrt(b*b - 4*a*c);
x1 = (-b + SqrtDelta) / (2*a);

Et voici un exemple simple, lorsque vous travaillez avec des algorithmes qui impliquent beaucoup de calculs, les choses peuvent devenir vraiment moche, donc diviser les calculs en de multiples parties contribuera à la lisibilité plus parantheses sera.

Parenthèses réduisent la lisibilité quand ils sont évidemment redondante . Le lecteur s'attend d'être là pour une raison, mais il n'y a pas de raison. Par conséquent, un hoquet cognitive.

Qu'est-ce que je veux dire par "évidemment" redondant?

  • Parenthèses sont redondants quand ils peuvent être supprimés sans changer le sens du programme.

  • Parenthèses qui sont utilisés pour désambiguïser opérateurs infixes sont pas « évidemment redondant », même quand ils sont redondants, sauf peut-être dans le cas très particulier des opérateurs de multiplication et d'addition. La raison: de nombreuses langues ont entre 10-15 niveaux de priorité, beaucoup de gens travaillent dans plusieurs langues, et personne ne peut attendre de se rappeler toutes les règles. Il est souvent préférable de lever l'ambiguïté, même si entre parenthèses sont redondants.

  • Toutes les autres parenthèses redondantes sont évidemment redondantes.

parenthèses redondantes sont souvent trouvées dans le code écrit par quelqu'un qui apprend une nouvelle langue; peut-être l'incertitude au sujet de la nouvelle syntaxe conduit à parenthésage défensive. Purger les!


Vous avez demandé des exemples. Voici trois exemples que je vois à plusieurs reprises dans le code ML et le code Haskell écrit par les débutants:

  • Parenthèses entre if (...) then sont toujours redondants et distrayant. Ils font le look auteur comme un programmeur C. Il suffit d'écrire if ... then.

  • Les parenthèses autour d'une variable sont stupides, comme dans print(x). Parenthèses ne sont jamais nécessaires autour d'une variable; l'application de la fonction doit être écrit print x.

  • Les parenthèses autour d'une application de fonction sont redondantes si cette application est un opérande dans une expression infixée. Par exemple,

    (length xs) + 1
    

    doit toujours être écrit

    length xs + 1
    

Tout poussé à l'extrême et / ou galvaudé peut rendre le code illisible. Il ne serait pas trop difficile de faire la même demande avec des commentaires. Si vous avez déjà regardé le code qui avait un commentaire pour pratiquement chaque ligne de code serait vous dire qu'il était difficile à lire. Ou vous pourriez avoir des espaces autour de chaque ligne de code qui rendrait chaque ligne facile à lire, mais normalement la plupart des gens veulent des lignes apparentées similaires (qui ne justifient pas une méthode en petits groupes) pour regrouper.

Vous devez aller bien au-dessus du dessus avec eux pour endommager vraiment la lisibilité, mais comme une question de goût personnel, j'ai toujours trouvé;

return (x + 1);

et similaire dans le code C et C ++ pour être très irritant.

Si une méthode ne prend pas de paramètres pourquoi besoin d'un () vide pour appeler method()? Je crois en groovy que vous n'avez pas besoin de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top