¿Debo poner nuevas líneas antes o después de los operadores binarios? [cerrado]

11

Cuando esté en Python o Javascript, siempre debe colocar operadores binarios al final de la línea anterior, para evitar que las nuevas líneas terminen su código prematuramente; Te ayuda a detectar errores.

Pero en C o C ++, esto no es un problema, así que me pregunto:

¿Hay alguna razón para que prefiera la segunda versión a la primera?

return lots_of_text
       + 1;

versus

return lots_of_text +
       1;

(Por ejemplo, ¿uno de ellos ayuda a prevenir otros tipos de errores? ¿O uno de ellos se considera más legible?)

usuario541686
fuente
No, no deberías hacer eso en Python, principalmente porque no tiene el efecto que afirmas que tiene. Un operador final no causa una continuación de línea; una barra invertida o paréntesis, corchetes o llaves no cerrados sí.
@delnan: Yo (con mucho cuidado) nunca dije que causa una continuación de línea. Soy consciente de que todavía necesita incluir caracteres de agrupación. Dije que ayuda a evitar errores con el final prematuro de su línea, lo que hace, al darle un error.
user541686
Ya veo, pero tampoco hace eso. Al menos nunca lo he visto suceder (y sigo estrictamente la regla de PEP 8 sobre poner nuevas líneas después de los operadores) y no puedo imaginar un código no inventado que sea válido con la nueva línea antes del operador pero no después del operador. Por ejemplo, código como en su primer fragmento también errores (debido a la sangría). ¿Alguien no agrega muescas al dividir una línea?
@delnan: En realidad, es muy fácil arruinar accidentalmente la sangría con su editor de texto, por ejemplo, al editar en masa o al hacer una selección rectangular. Y si eso sucede durante el mantenimiento, no obtendrá un error en el primer caso y se le escapará silenciosamente, pero obtendrá un buen error en el segundo caso.
user541686
44
No estoy seguro de por qué esto fue rechazado. Parece una pregunta de estilo de codificación razonable.
Stuart Marks el

Respuestas:

18

Como puede ver en las respuestas, no hay consenso sobre este asunto. A menos que trabaje en un equipo, use lo que le resulte más cómodo.


Yo prefiero insertar un salto de línea antes de los operadores.

Cada vez que tengo que romper líneas, generalmente pongo como máximo un término del mismo "nivel" en una línea:

Ley de gravitación de Newton en Python:

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

Compare esto con:

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

Quiero saber, que "divido por distancia al cuadrado", no quiero saber, que "mass_2 se divide", porque no es así como pienso en las expresiones matemáticas.

Además, generalmente quiero saber primero, qué estoy haciendo (operador), antes de preocuparme por lo que hago (operandos).

O considere esta declaración SQL enrevesada:

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

Esto me permite ver cómo las condiciones individuales se conectan muy fácilmente, simplemente deslizando de arriba a abajo sin tener que leer cada línea hasta el final para encontrar el operador en lugar de:

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

Pienso en lo primero en términos de " Xes cierto", luego lo modifico diciendo: " Y esto también es cierto", lo cual me parece más natural que al revés. Además, el primero es mucho más fácil de analizar visualmente.

O un ejemplo de PHP:

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

Una vez más, puedo leer la lectura verticalmente para ver que simplemente estoy concatenando texto, porque la mayoría de las veces siento que en realidad no me importa lo que está dentro de las cadenas / condiciones.

Por supuesto, no aplicaría este estilo incondicionalmente. Si poner la nueva línea después de un operador parece tener más sentido para mí, lo haría, pero no puedo pensar en un ejemplo en este momento.

phant0m
fuente
Se agregó paréntesis faltantes al primer ejemplo.
Kevin Cline
1
+1: exactamente correcto; las matemáticas siempre se componen para que las líneas de continuación comiencen con un operador.
Kevin Cline
+1 por las mismas razones que usted describe, pero su ejemplo de PHP me parece bastante extraño. ¿No deberían ser esos concatos ., no .=?
Izkata
@Izkata oh sí, tienes razón, por supuesto. Gracias. Kevin: Los paréntesis eran correctos;) Simplemente los force
alineé
11

Casi siempre rompo líneas antes de los operadores binarios para dejar claro a los lectores del código que esta es la continuación de una expresión y no la siguiente declaración. Esto es importante si la siguiente declaración normalmente se sangraría. Por ejemplo, considere una declaración if que tenga una expresión condicional compleja:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

La segunda parte de la expresión condicional se confunde fácilmente con la primera declaración de la parte de entonces. Esto puede ser bastante confuso si la primera parte de la condición es larga y el && termina muy a la derecha. Compare esto con la alternativa:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Esto parece un poco extraño, pero deja bastante claro que la segunda parte de la condición no es el comienzo de una declaración.

Hago esto también en otros contextos, pero la declaración if es la más importante, ya que la sangría es ambigua. Por supuesto, uno podría cambiar la sangría o la colocación de la llave, pero esto también parece extraño.

tl; dr el extremo izquierdo de la línea es más significativo para la comprensión de lectura rápida, por lo que colocar el operador en el extremo izquierdo es un marcador más destacado de que esta es una expresión continua, no una declaración.

Stuart Marks
fuente
Pensamiento interesante, pero todavía encuentro esto bastante confuso (especialmente cuando se hace +y -que también podría entenderse como operadores de prefijo unario). La solución habitual para que las líneas continuas se destaquen es sangrarlas más (es decir, en dos niveles).
Konrad Rudolph
"La segunda parte de la expresión condicional se confunde fácilmente con la primera declaración de la parte de entonces": esto no sucede si alinea verticalmente "{" y "}" (misma columna) para hacer el principio y el final del bloque se destacan más claramente.
Giorgio
8

Siempre usaría el primero. Desea que quede claro lo que está haciendo con ese 1 allí. Si lo viera y hubiera un muro de texto encima de ese 1, no tendría idea de lo que estaba sucediendo en cuanto al uso de ese 1.

El '+' al lado de 1 deja en claro que, como mínimo, estoy haciendo algo con el 1 en cuestión en lugar de pasar el rato diciendo "Estoy en tu código amigo ..." sin razón aparente.

Ingeniero mundial
fuente
secundado ...........
James
7

Siento que ayuda enormemente la comprensión lectora cuando una línea indica que la declaración continúa en la siguiente línea al tener el operador binario al final y, por lo tanto, la declaración es incompleta. El punto y coma que falta no es suficiente para que lo entienda de inmediato.

Esto puede ser simplemente una cuestión de hábito, pero a menos que trabaje exclusivamente en idiomas que requieren el punto y coma (lo cual me parece poco realista dada la omnipresencia de los scripts de shell, los archivos MAKE y los lenguajes como Python), probablemente tampoco tendrá ese hábito.

EDITAR: Giorgio hace un excelente punto en los comentarios: este uso hace eco de la puntuación común , tanto en matemáticas como en lenguajes naturales. Tu escribirias

Me hundo,
por lo tanto nadé

Se podría no escribir

Me hundo
, por lo tanto nadé

Konrad Rudolph
fuente
3
+1: También tiendo a leer el + al final de la línea como una coma que separa dos elementos en una lista de operandos. Por esta razón, prefiero poner el + al final de una línea como lo haría con una coma (nunca comenzaría una línea con una coma).
Giorgio
@Giorgio Este punto es tan excelente que lo he robado para mi respuesta. Espero puedas perdonarme.
Konrad Rudolph
Adelante: me siento honrado. ;-)
Giorgio
77
El código no es inglés, y creo que es una analogía falsa usar las reglas de sintaxis en inglés como una forma de justificar las convenciones de codificación. No me gusta el estilo del operador final, pero admito que Konrad tiene un buen punto sobre lenguajes como Python.
M. Dudley
3
En la composición matemática, el salto de línea siempre es antes que un operador, nunca después. En el ejemplo prosaico, el operador es "por lo tanto". En la prosa inglesa, las comas son esencialmente marcas de aliento.
Kevin Cline