Devo colocar novas linhas antes ou depois dos operadores binários? [fechadas]

11

Quando você está em Python ou Javascript, sempre deve colocar operadores binários no final da linha anterior, para evitar que novas linhas encerrem seu código prematuramente; ajuda a detectar erros.

Mas em C ou C ++, isso não é um problema, então estou me perguntando:

Existe alguma razão para eu preferir a segunda versão à primeira?

return lots_of_text
       + 1;

versus

return lots_of_text +
       1;

(Por exemplo, um deles ajuda a evitar outros tipos de erros? Ou é um deles considerado mais legível?)

user541686
fonte
Não, você não deve fazer isso no Python, principalmente porque não tem o efeito que você afirma ter. Um operador à direita não causa uma continuação de linha; uma barra invertida ou com parênteses, colchetes ou chaves não fechados.
@ delnan: Eu (com muito cuidado) nunca disse que causa uma continuação de linha. Estou ciente de que você ainda precisa incluir caracteres de agrupamento. Eu disse que ajuda a evitar erros com a sua linha terminando prematuramente, o que ocorre, dando a você um erro.
user541686
Entendo, mas isso também não acontece. Pelo menos eu nunca vi isso acontecer (e sigo estritamente a regra do PEP 8 sobre colocar novas linhas após os operadores) e não consigo imaginar código não artificial que seja válido com a nova linha antes do operador, mas não depois do operador. Por exemplo, o código como no seu primeiro snippet também erros (devido ao recuo). Alguém não adiciona recuos ao dividir uma linha?
@ delnan: Na verdade, é muito fácil estragar acidentalmente o recuo com o seu editor de texto, por exemplo, ao editar em massa ou fazer uma seleção retangular. E se / quando isso acontecer durante a manutenção, você não receberá um erro no primeiro caso e ele passará silenciosamente por você, mas você receberá um bom erro no segundo caso.
user541686
4
Não sei por que isso foi prejudicado. Parece uma questão de estilo de codificação razoável.
Stuart Marks

Respostas:

18

Como você pode ver nas respostas, não há consenso sobre esse assunto. A menos que você trabalhe em equipe, use o que mais lhe agrada.


Eu prefiro inserir uma nova linha antes dos operadores.

Sempre que tenho que quebrar linhas, geralmente coloco no máximo um termo do mesmo "nível" em uma linha:

Lei da gravitação de Newton em Python:

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

Compare isso com:

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

Quero saber que "divido pela distância ao quadrado", não quero saber, que "mass_2 fica dividido", porque não é assim que penso em expressões matemáticas.

Além disso, geralmente quero saber primeiro o que estou fazendo (operador), antes de me preocupar com o que faço (operandos).

Ou considere esta instrução SQL complicada:

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

Isso me permite ver como as condições individuais são conectadas com muita facilidade, apenas deslizando de cima para baixo sem ter que ler todas as linhas até o final para encontrar o operador em vez de:

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

Penso no primeiro em termos de " Xé verdade", depois retifico isso dizendo: " E isso também é verdade", o que me parece mais natural do que o contrário. Além disso, acho o primeiro muito mais fácil de analisar visualmente.

Ou um exemplo de PHP:

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

Mais uma vez, posso apenas ler rapidamente na vertical para ver que estou simplesmente concatenando o texto, porque na maioria das vezes sinto que realmente não me importo com o que está dentro das strings / condições.

Claro, eu não aplicaria esse estilo incondicionalmente. Se colocar a nova linha após um operador parecer fazer mais sentido para mim, eu faria isso, mas não consigo pensar em um exemplo no momento.

phant0m
fonte
Adicionado parênteses ausentes no primeiro exemplo.
kevin Cline
1
+1: exatamente certo; a matemática é sempre digitada, de modo que as linhas de continuação começam com um operador.
Kevin cline
+1 pelas mesmas razões que você descreve, mas seu exemplo PHP parece bastante estranho para mim. Esses concats não deveriam ser apenas ., não é .=?
Izkata
@ Izkata oh sim, você está correto, é claro. Obrigado. Kevin: Os parênteses estavam corretos;) Eu só alinhado-los comforce
phant0m
11

Quase sempre quebro linhas antes de operadores binários para deixar claro aos leitores do código que essa é a continuação de uma expressão e não a próxima declaração. Isso é importante se a próxima instrução normalmente for recuada. Por exemplo, considere uma instrução if que tenha uma expressão condicional complexa:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

A segunda parte da expressão condicional é facilmente confundida com a primeira declaração da parte então. Isso pode ser bastante confuso se a primeira parte da condição for longa e o && terminar bem à direita. Compare isso com a alternativa:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Isso parece um pouco estranho, mas deixa bem claro que a segunda parte da condição não é o início de uma declaração.

Também faço isso em outros contextos, mas a declaração if é a mais importante, pois a indentação é ambígua. Obviamente, pode-se alterar o recuo ou posicionamento da chave, mas isso também parece estranho.

tl; dr a extremidade esquerda da linha é mais significativa para a compreensão rápida da leitura, portanto, colocar o operador na extremidade esquerda é um marcador mais proeminente de que essa é uma expressão contínua, não uma declaração.

Stuart Marks
fonte
Pensamento interessante, mas ainda acho isso bastante confuso (especialmente quando concluído +e -que também pode ser entendido como operadores de prefixo unários). A solução usual para destacar as linhas contínuas é recuá-las mais (ou seja, em dois níveis).
Konrad Rudolph
"A segunda parte da expressão condicional é facilmente confundida com a primeira instrução da parte então.": Isso não acontece se você alinhar "{" e "}" verticalmente (mesma coluna) para criar o início e o fim do bloco se destacam mais claramente.
Giorgio
8

Eu sempre usaria o primeiro. Você quer que fique claro o que está fazendo com esse 1 lá. Se eu visse isso e houvesse uma parede de texto acima desse número 1, eu não teria ideia do que estava acontecendo quanto ao uso desse número.

O '+' próximo a 1 deixa claro que, no mínimo, eu estou fazendo algo com o 1 em questão, em vez de sair "Estou todo do seu código ..." sem motivo aparente.

Engenheiro Mundial
fonte
destacado ...........
James
7

Eu sinto que isso ajuda tremendamente a compreensão de leitura quando uma linha indica que a declaração continua na próxima linha ao ter o operador binário no final e, assim, tornar a declaração incompleta. O ponto e vírgula ausente não é suficiente para que eu entenda imediatamente.

Isso pode ser simplesmente uma questão de hábito, mas, a menos que você trabalhe exclusivamente em linguagens que exijam ponto-e-vírgula (o que acho bastante irrealista, dada a difusão de scripts de shell, makefiles e linguagens como Python), você provavelmente também não terá esse hábito.

EDIT: Giorgio faz uma excelente observação nos comentários: esse uso ecoa pontuação comum , tanto em matemática quanto em línguas naturais. Você escreveria

Eu afundo,
pois nadei

Você não escreveria

Eu afundo
, pois nadei

Konrad Rudolph
fonte
3
+1: também costumo ler o + no final da linha como uma vírgula separando dois itens em uma lista de operandos. Por esse motivo, prefiro colocar o + no final de uma linha, como faria com uma vírgula (nunca iniciaria uma linha com uma vírgula).
Giorgio
@Giorgio Este ponto é tão excelente que eu o roubei pela minha resposta. Espero que você possa me perdoar.
Konrad Rudolph
Vá em frente: sinto-me honrado. ;-)
Giorgio
7
Código não é inglês, e acho que é uma analogia falsa usar regras de sintaxe em inglês como uma maneira de justificar convenções de codificação. Não gosto do estilo de operador à direita, mas admito que o Konrad tem um bom argumento sobre linguagens como Python.
M. Dudley
3
Na tipografia matemática, a quebra de linha é sempre antes de um operador, nunca depois. No exemplo prosaico, o operador é "portanto". Na prosa inglesa, vírgulas são essencialmente marcas de respiração.
kevin Cline