Dois-je mettre des sauts de ligne avant ou après les opérateurs binaires? [fermé]

11

Lorsque vous êtes en Python ou Javascript, vous devez toujours mettre des opérateurs binaires à la fin de la ligne précédente, afin d'empêcher les sauts de ligne de terminer votre code prématurément; il vous aide à détecter les erreurs.

Mais en C ou C ++, ce n'est pas un problème, donc je me demande:

Y a-t-il une raison pour laquelle je préfère la deuxième version à la première?

return lots_of_text
       + 1;

contre

return lots_of_text +
       1;

(Par exemple, l'un d'eux permet-il d'éviter d'autres types d'erreurs? Ou l'un d'eux est-il considéré comme plus lisible?)

user541686
la source
Non, vous ne devriez pas faire cela en Python, principalement parce que cela n'a pas l'effet que vous prétendez avoir. Un opérateur de fin ne provoque pas de continuation de ligne; une barre oblique inverse ou des parenthèses, des crochets ou des accolades non fermés le font.
@delnan: Je n'ai (très soigneusement) jamais dit que cela provoque une continuation de ligne. Je suis conscient que vous devez toujours inclure des caractères de regroupement. J'ai dit que cela aide à prévenir les erreurs avec votre ligne se terminant prématurément, ce qu'il fait, en vous donnant une erreur.
user541686
Je vois, mais ça ne fait pas ça non plus. Au moins, je n'ai jamais vu cela se produire (et je respecte strictement la règle de PEP 8 sur la mise en ligne après les opérateurs) et je ne peux pas imaginer un code non artificiel qui soit valide avec la nouvelle ligne avant l'opérateur mais pas après l'opérateur. Par exemple, le code comme dans votre premier extrait de code contient également des erreurs (dues à l'indentation). Quelqu'un n'ajoute-t-il pas d'indentations lors du fractionnement d'une ligne?
@delnan: Il est en fait très facile de visser accidentellement l'indentation avec votre éditeur de texte, par exemple lors d'une édition en bloc ou d'une sélection rectangulaire. Et si / quand cela se produit pendant la maintenance, vous n'obtiendrez pas d'erreur dans le premier cas et elle glissera silencieusement par vous, mais vous obtiendrez une belle erreur dans le second cas.
user541686
4
Je ne sais pas pourquoi cela a été rejeté. Cela semble être une question de style de codage raisonnable.
Stuart marque

Réponses:

18

Comme vous pouvez le voir dans les réponses, il n'y a pas de consensus sur cette question. À moins que vous ne travailliez en équipe, utilisez ce avec quoi vous êtes plus à l'aise.


je préfère insérer une nouvelle ligne avant les opérateurs.

Chaque fois que je dois rompre des lignes, je mets généralement au plus un terme du même "niveau" sur une ligne:

Loi de gravitation de Newton en Python:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

Comparez cela à:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

Je veux savoir, que je "divise par la distance au carré", je ne veux pas savoir, que "mass_2 se divise", parce que ce n'est pas ainsi que je pense des expressions mathématiques.

De plus, je veux généralement savoir d'abord ce que je fais (opérateur), avant de me soucier de ce que je fais avec (opérandes).

Ou considérez cette instruction SQL alambiquée:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

Cela me permet de voir comment les conditions individuelles sont connectées très facilement, simplement en survolant de haut en bas sans avoir à lire chaque ligne jusqu'à la fin pour trouver l'opérateur par opposition à:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

Je pense à la première en termes de « Xest vrai», puis je modifie cela en disant: « ET c'est également vrai», ce qui me semble plus naturel que l'inverse. De plus, je trouve le premier beaucoup plus facile à analyser visuellement.

Ou un exemple PHP:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

Encore une fois, je peux simplement parcourir la lecture verticalement pour voir que je concatène simplement du texte, car la plupart du temps, je sens que je ne me soucie pas vraiment de ce qui se trouve à l'intérieur des chaînes / conditions.

Bien sûr, je n'appliquerais pas ce style sans condition. Si mettre la nouvelle ligne après un opérateur me semble plus logique, je le ferais, mais je ne peux pas penser à un exemple pour le moment.

phant0m
la source
Ajout de parenthèses manquantes au premier exemple.
kevin cline
1
+1: exactement à droite; les mathématiques sont toujours composées de sorte que les lignes de continuation commencent par un opérateur.
kevin cline
+1 pour les mêmes raisons que vous décrivez, mais votre exemple PHP me semble assez étrange. Ces concats ne devraient-ils pas simplement l'être ., non .=?
Izkata
@Izkata oh oui, vous avez bien sûr raison. Merci. kevin: Les parenthèses étaient correctes;) Je viens de les aligner avecforce
phant0m
11

Je rompt presque toujours les lignes devant les opérateurs binaires afin de faire comprendre aux lecteurs du code qu'il s'agit de la continuation d'une expression et non de la déclaration suivante. Ceci est important si la prochaine déclaration est normalement en retrait. Par exemple, considérons une instruction if qui a une expression conditionnelle complexe:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

La deuxième partie de l'expression conditionnelle est facilement confondue avec la première instruction de la partie alors. Cela peut être assez déroutant si la première partie de la condition est longue et que le && se termine bien à droite. Comparez cela avec l'alternative:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Cela semble un peu étrange, mais cela montre clairement que la deuxième partie de la condition n'est pas le début d'une instruction.

Je le fais également dans d'autres contextes, mais l'instruction if est la plus importante, car l'indentation est ambiguë. Bien sûr, on pourrait changer l'indentation ou le placement de l'accolade, mais cela semble aussi étrange.

tl; dr l'extrémité gauche de la ligne est plus importante pour une compréhension rapide de la lecture, donc placer l'opérateur à l'extrémité gauche est un marqueur plus important que c'est une expression continue, pas une déclaration.

Marques Stuart
la source
Pensée intéressante mais je trouve toujours cela assez déroutant (surtout quand on en a fini avec +et -qui pourrait également être compris comme des opérateurs de préfixe unaires). La solution habituelle pour faire ressortir les lignes continues est de les indenter davantage (c'est-à-dire par deux niveaux).
Konrad Rudolph
"La deuxième partie de l'expression conditionnelle est facilement confondue avec la première instruction de la partie alors.": Cela ne se produit pas si vous alignez verticalement les "{" et "}" (même colonne) pour faire le début et la fin du bloc ressortent plus clairement.
Giorgio
8

J'utiliserais toujours le premier. Vous voulez qu'il soit clair ce que vous faites avec cela 1 là-bas. Si je voyais cela et qu'il y avait un mur de texte au-dessus de cela, je n'aurais aucune idée de ce qui se passait en ce qui concerne l'utilisation de ce dernier.

Le '+' étant à côté de 1 indique clairement que je fais au moins quelque chose avec le 1 en question plutôt que de traîner "Je suis tout dans votre code mec ..." sans raison apparente.

Ingénieur du monde
la source
détaché ...........
James
7

Je pense que cela aide énormément à la compréhension de la lecture lorsqu'une ligne indique que l'instruction continue dans la ligne suivante en ayant l'opérateur binaire à la fin, et donc en rendant l'instruction incomplète. Le point-virgule manquant ne me suffit pas pour le comprendre immédiatement.

Cela peut simplement être une question d'habitude, mais à moins que vous ne travailliez exclusivement dans des langues qui nécessitent le point-virgule (ce que je trouve assez irréaliste étant donné l'omniprésence des scripts shell, des makefiles et des langages tels que Python), vous n'aurez probablement pas non plus cette habitude.

EDIT: Giorgio fait un excellent point dans les commentaires: cet usage fait écho à la ponctuation courante , à la fois en mathématiques et en langues naturelles. Tu écrirais

Je coule,
donc j'ai nagé

Tu n'écrirais pas

Je coule
, donc j'ai nagé

Konrad Rudolph
la source
3
+1: J'ai également tendance à lire le + à la fin de la ligne comme une virgule séparant deux éléments dans une liste d'opérandes. Pour cette raison, je préfère mettre le + à la fin d'une ligne comme je le ferais avec une virgule (je ne commencerais jamais une ligne avec une virgule).
Giorgio
@Giorgio Ce point est si excellent que je l'ai volé pour ma réponse. J'espère que tu peux me pardonner.
Konrad Rudolph
Allez-y: je me sens honoré. ;-)
Giorgio
7
Le code n'est pas anglais, et je pense que c'est une fausse analogie d'utiliser les règles de syntaxe anglaise comme moyen de justifier les conventions de codage. Je n'aime pas le style d'opérateur de fin, mais j'avoue que Konrad a un bon point sur les langages comme Python.
M. Dudley
3
En composition mathématique, le saut de ligne est toujours devant un opérateur, jamais après. Dans l'exemple prosaïque, l'opérateur est "donc". Dans la prose anglaise, les virgules sont essentiellement des marques de souffle.
kevin cline