Declarações de linha única e boas práticas

11

Recentemente, adquiri um hábito que muitos de vocês talvez desaprovam, mas que, no final, me ajuda a ficar de olho na estrutura global do código, e não na estrutura de um único método (às vezes) repetitivo: agrupar um número de instruções em uma única linha, assim:

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

em oposição a

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

Costumo fazer isso em tarefas repetitivas para manter a "beleza" geral do código e para me ajudar a rastrear a estrutura do programa com facilidade, mas admito que pode não ser uma boa prática. Na verdade, eu uso muito, então gostaria de saber o que você pensa sobre isso. Além disso, você acha que alguém que precisaria manter meu código tem problemas com essa abordagem?

Do utilizador
fonte
5
Esta pode ser uma boa pergunta para codereview.stackexchange.com
1
Vou ter problema se eu fosse manter. A primeira coisa que eu faria é fazer um CTRL + F para ";" e colocar uma quebra de linha. Mas isso sou só eu :-). Eu gosto de uma linha apenas se eu tiver uma razão para, por exemplo, inicializar propriedades habilitadas de algumas caixas de texto com um valor padrão de false: textBox1.Enabled = textBox2.Enabled = false;
Arun
2
Se você estiver fazendo uma pergunta sobre o estilo de codificação, ajudaria se você especificasse o idioma.
Caleb
3
Embora isso não ocorra no exemplo dado, como você colocará um ponto de interrupção na segunda ou terceira ou na declaração ... se estiver colocando todos em uma linha?
Marjan Venema
1
E também, estou acostumado a formatação automatizada (Java), onde o código tem uma aparência uniforme de qualquer maneira.
Kwebble

Respostas:

22

Eu realmente acho que a legibilidade sofreria muito tanto para você quanto para qualquer outra pessoa que estivesse lendo o código. Tudo faz sentido quando você o escreve pela primeira vez, porque está ativamente em sua mente. É diferente quando você está escaneando código para ver quais variáveis ​​e funções estão ... você está destruindo sua própria capacidade de escanear seu próprio código. Isso é uma enorme falta de nenhum, e além ruim se ninguém nunca tem que ler o seu código.

Além disso, pense em como você lê o código. É sempre de cima para baixo, rolando para baixo. Seu método não combina com isso e até introduz um dos problemas mais feios possíveis na leitura de código; rolando horizontalmente . Nunca subestime o quão difícil isso pode dificultar a leitura do código. Você nunca rola na horizontal, nunca faz as pessoas rolarem horizontalmente, em quase qualquer contexto é extremamente antinatural.

Além disso, se o seu problema for entrada repetitiva de código ... não se esqueça de Ctrl-C. No seu código de exemplo, pode ser mais eficiente digitar tudo manualmente, mas se você precisar copiar várias linhas várias vezes, parece que seria tão eficiente copiar a linha um mais uma nova linha, cole-a x vezes e faça as alterações, menos propensas a digitar também.

Ah, e erros de digitação! Prejudicar a legibilidade do seu código assim pode tornar um pesadelo descobrir qual das 50 declarações de variáveis ​​que você definiu incorretamente. A maioria dos compiladores fornece erros nos números de linha e coluna agora, mas encontrar um erro em uma linha é MUITO mais fácil do que encontrar uma coluna.

Ben Brocka
fonte
2
a) Código de leitura / verificação - A maioria das pessoas, ao ler o código, lê os primeiros caracteres da linha e segue em frente, a menos que seja "interessante", e então lê mais algumas. Erros do compilador: Na maioria das vezes eu interpreto o erro do compilador como "Problema com a linha <x>". somente se eu puder; t resolvê-lo instantaneamente (raro), então eu realmente li o erro.
mattnz
19

Uma declaração por linha também facilita a visualização do que mudou em uma comparação lado a lado.

Hugo
fonte
2
Esse é provavelmente o maior motivo, se alguém precisar mesclar esse código, quase todas as ferramentas de mesclagem facilitarão o isolamento e o movimento de linhas, em vez de substrings de linhas.
anon
@anon Bom argumento sobre ferramentas de mesclagem também; uma declaração por linha significa menos conflitos de mesclagem para limpar.
Hugo Hugo
10

Embora o exemplo não mostre isso, há outro problema ao agrupar várias instruções em uma linha. E se uma das cinco instruções que você possui em uma única linha lança uma exceção?

Seu rastreamento de pilha dirá "EBlah na linha N" ... e agora você não tem idéia de qual dessas cinco instruções lançou a exceção.

(O mesmo acontece com uma declaração excessivamente longa de qualquer tipo.)

Frank Shearar
fonte
2
O mesmo conceito se aplica à depuração, onde mais uma vez a granularidade é tipicamente um número de linha.
David Hammen
2
Oh meu sim, isso pode ser um problema. Um "favorito" é quando você solta um ponteiro nulo em algo como foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(sintaxe Java / C #). Classificar através desse tipo de confusão é sempre melhor com linhas extras (e variáveis ​​temporárias ... e um Brick Of Clue 2D6 para o desenvolvedor original).
Donal Fellows
7

Uma declaração por linha é um estilo de codificação amplamente usado. Como resultado, a maioria dos desenvolvedores que olharem para o seu código no futuro provavelmente estremecerá quando virem várias instruções por linha. Quando você está acostumado a ver algo de uma maneira, pode ser desorientador ver de outra maneira.

Por esse motivo, desaconselho, exceto em raras circunstâncias.

Igby Largeman
fonte
4

Fiz isso pela última vez há 25 anos, usando linguagens interpretadas em pequenos micros rodando com baixas velocidades de clock, onde cada espaço ou retorno de carro eliminado dava um aumento de desempenho.

Eu estremeço agora ao pensar nisso (embora tenha sido feito por um bom motivo).

Infelizmente, esse código é difícil de ler e, portanto, difícil de manter.

rapid_now
fonte
1
Então, você o escreve corretamente e tira o espaço em branco e qualquer outra preparação para a sua "cópia da máquina". Assim como reduzir o javascript hoje em dia.
CaffGeek
1
Sim - eu escrevi um programa para reprocessar código-fonte assim também - em 1986. Outra coisa que espero nunca precisar fazer novamente.
quickly_now
1

Sintaticamente, não há realmente nada de errado com isso. Realmente depende do estilo de codificação da sua equipe.

Como a maior parte do código que eu vi (incluindo o código que está dentro dos cabeçalhos c ++ padrão) é feita dessa maneira, eu usaria seu primeiro método.

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";
George curioso
fonte
0

Esse é um estilo de codificação realmente incomum.

Eu recomendo que você use linhas vazias para delimitar partes lógicas do código.

svick
fonte
0

Ir muito longe para a direita pode criar tantos problemas quanto várias linhas.

Eu tive que lidar com algumas instruções sql com dezenas de campos. Normalmente, eu colocaria uma por linha, mas em algumas ocasiões, consolidei 3 ou 4 em uma linha. Parece uma boa ideia durante o desenvolvimento, quando você tem que rolar para cima e para baixo várias vezes.

Lamento voltar a este código. Ter linhas extras não parece criar muito problema, então eu costumo limpá-las.

JeffO
fonte
0

Além disso, você acha que alguém que precisaria manter meu código tem problemas com essa abordagem?

Depois de colocar as mãos na cabeça por um minuto, ele usará suas funcionalidades IDE Regex favoritas para separar automaticamente todo esse código ilegível em uma instrução por linha.

Basta uma rápida olhada no exemplo que você mostrou é suficiente para entender o quanto mais legível é a segunda abordagem.

É muito mais fácil acompanhar o fluxo vertical da página, sem ter os olhos para mover horizontalmente para sempre.

Veja o seu exemplo: você sabe imediatamente que o código tem tudo a ver com a Textpropriedade de textBoxobjetos diferentes e eles contêm string como valores. Bem direto.

Jose Faeti
fonte
0

Eu pessoalmente não usaria esse estilo. Resumir

Prós

  • menos linhas de código para percorrer
  • pode ser usado para agrupar semanticamente o código para expressar: "um monte de coisas de atribuição". Mas você sempre pode refatorar esse bloco em uma função se isso o incomodar demais.

Contras

  • difícil de ler, geralmente é mais fácil ler o código horizontalmente (deslizar, sem movimento dos olhos, ...)
  • diff facilmente se torna um pesadelo, incluindo a fusão
  • mais difícil de alterar (copiar e colar, comentar, ...)
  • a depuração pode ser um problema em muitos IDEs, pois eles trabalham em linhas, em vez de expressões individuais.
MaR
fonte
Alguns dos "contras" às vezes podem ser profissionais. Por exemplo, suponha que um pedaço de código tenha oito operações consecutivas do formulário if (x > maxX) {x=maxX; peggedAny = true;}. Se cada uma dessas operações caber facilmente em uma única linha, prefiro oito linhas como essa do que dezenas de linhas que dividem as declarações. Se essas comparações fossem usadas em lugares suficientes, quatro instruções do formulário peggedAny |= pegValueMinMax(ref x, minX, maxX);poderiam ser melhores, mas alguém que lesse isso teria que ler pegValueMinMaxpara ver o que faz.
22714
Além disso, se um pequeno pedaço de uma linha for alterado, um "diff" considerará isso como uma alteração na linha inteira. Se a linha se comportar funcionalmente como uma unidade, isso seria uma coisa boa. Caso contrário, se uma operação semântica for dividida entre várias linhas, alterações em algumas linhas poderão afetar a operação de maneiras que não seriam aparentes.
Supercat