Aparelhos devem aparecer em sua própria linha? [fechadas]

273

O aparelho deve estar na sua própria linha ou não? O que você acha disso?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

ou deveria ser

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

ou mesmo

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

Por favor, seja construtivo! Explique por que, compartilhe experiências, faça backup com fatos e referências.

Tom Wijsman
fonte
104
Acho o "== true" mais perturbador do que a escolha do posicionamento da chave.
Dan Dyer
11
@ Dan: Eu acho que sempre explicando a expressão condicional ajuda muito na clareza.
usar o seguinte comando
4
A única razão pela qual isso importaria seria se o seu IDE / editor não oferecer suporte ao reconhecimento de colchetes.
leeand00
4
@ leeand00: alguns de nós ainda imprimem código complexo / desconhecido para estudá-lo / anotá-lo. Uma boa impressora bonita atenua a maioria dos problemas.
Shog9
2
triste a pergunta está encerrada. Após algum tempo de uso da sintaxe baseada em recuos, mudei para (talvez estranha) outra estrutura de chaves. Como sua primeira chave de fechamento na última linha do bloco. (após a linha do código)
cnd 16/03/2012

Respostas:

88

Quando eu era estudante, costumava colocar chaves na mesma linha, para que houvesse menos linhas e o código fosse impresso em menos páginas. Observar um único caractere de colchete impresso como a única coisa em uma linha é irritante. (ambiente, desperdício de papel)

Porém, ao codificar aplicativos grandes, permitir que algumas linhas com apenas chaves sejam acessíveis, considerando o sentimento de "agrupamento" que ele proporciona.

Seja qual for o estilo escolhido, seja consistente para que não se torne uma sobrecarga para o seu cérebro processar vários estilos em partes de código relacionadas . Em diferentes cenários (como acima), eu diria que não há problema em usar estilos diferentes, é mais fácil alternar o contexto em um nível alto.

dbza
fonte
6
Por outro lado, o suporte na nova linha é um ANSI STANDARD, K&R não. Mas a beleza dos padrões é que existem tantos diferentes (veja também uncyclopedia.wikia.com/wiki/AAAAAAAAA ! Na enciclopédia).
Quandary 31/03
"existem menos linhas" Eu tenho Terabytes de espaço e muitos pixels. Por que eu deveria me preocupar em usar mais linhas?
12431234123412341234123
1
@ 12431234123412341234123: Acho que ele quis dizer porque algumas pessoas imprimem o código para revisão de código. E cada nova linha não absolutamente necessária é desperdiçada em papel ou um km² de forrest desperdiçado em escala. No entanto, se você não imprimi-lo (certamente não o faço), o ANSI é muito melhor que o K&R. Além disso, qualquer pessoa que pretenda imprimir provavelmente deve usar um formatador de código automatizado - portanto, essa é uma questão de ferramentas, não de estilo de codificação.
Quandary
247

Você nunca deve fazer o terceiro método.

Poupar nas chaves pode poupar algumas pressionamentos de tecla na primeira vez, mas o próximo codificador que vem junto adiciona algo à sua cláusula else sem perceber que o bloco está faltando chaves, vai causar muita dor.

Escreva seu código para outras pessoas.

rhettg
fonte
113
Eu gostaria de saber onde esse pouco de sabedoria se originou. Porque escrever seu código para as pessoas que não se preocupam em lê-lo é quase tão inútil como você pode começar ...
Shog9
69
O segundo programador pode adicionar seus próprios aparelhos quando ele adiciona algo. Ele não é estúpido e, em uma convenção de codificação que incentiva a omissão de chaves para coisas simples como essa, ele saberá procurar.
Ken Bloom
25
As chaves opcionais não são opcionais. Existem poucas decisões de design piores que foram tomadas em C e transferidas para seus descendentes. O fato de ele viver em um idioma tão recente quanto o C # me deixa com raiva.
Adam Crossland
28
Não importa quão inteligente você seja ou quão arraigado seja o padrão de codificação em torno dos caracóis omitidos em linha única: se você estiver procurando resolver um problema ou bug, provavelmente sentirá falta deles. E para um total geral de 2 segundos de trabalho, é realmente tão ruim ser explícito?
Jordânia
11
Há uma vantagem no estilo nº 3 que está faltando: você obtém mais código na tela ao mesmo tempo.
Loren Pechtel
203

Por um longo tempo, argumentei que eles tinham igual valor, ou tão próximos de igual que o possível ganho ao fazer a escolha certa estava muito, muito abaixo do custo de discutir sobre isso.

Ser consistente é importante , no entanto. Então eu disse: vamos jogar uma moeda e começar a escrever o código.

Já vi programadores resistirem a mudanças como essa antes. Deixe isso para trás! Eu mudei muitas vezes na minha carreira. Eu até uso estilos diferentes no meu C # do que no meu PowerShell.

Alguns anos atrás, eu estava trabalhando em uma equipe (~ 20 desenvolvedores) que decidiu pedir informações, tomar uma decisão e aplicá-la em toda a base de código. Teríamos 1 semana para decidir.

Muitos gemidos e revirar os olhos. Muitos "eu gosto do meu jeito, porque é melhor", mas sem substância.

Enquanto estudávamos os pontos mais delicados da pergunta, alguém perguntou como lidar com esse problema no estilo "prepare-se-na-mesma-linha":

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

Observe que não é imediatamente óbvio onde a lista de parâmetros termina e o corpo começa. Comparado a:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

Fizemos algumas leituras sobre como as pessoas em todo o mundo haviam lidado com esse problema e descobrimos o padrão de adicionar uma linha em branco após a chave aberta:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Se você quiser fazer uma pausa visual, é melhor fazê-lo com uma chave. Então suas quebras visuais também se tornam consistentes.

Edit : Duas alternativas para a solução 'extra blank blank' ao usar K&R:

1 / Recuar os argumentos da função de maneira diferente do corpo da função

2 / Coloque o primeiro argumento na mesma linha que o nome da função e alinhe outros argumentos em novas linhas ao primeiro argumento

Exemplos:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/Editar

Eu ainda argumento que a consistência é mais importante do que outras considerações, mas se não temos um precedente estabelecido , o melhor caminho é seguir em frente.

Jay Bazuzi
fonte
33
Para sua informação, posso parecer uma pessoa razoável, mas na verdade sou louca. Para blocos simples de linha única, não usarei chaves nem novas linhas, criando 'if (foo) bar ()' uma única linha. Eu me esforço para tornar meu código simples o suficiente para que não seja um problema.
Jay Bazuzi
38
Vim aqui para postar exatamente isso. Muitas pessoas que mantêm a chave de abertura na mesma linha seguem-na com uma linha em branco (especialmente no início das classes e métodos), porque, caso contrário, é difícil separar o cabeçalho da classe / método do corpo. Bem, se você usar uma linha extra de qualquer maneira, é melhor colocar a chave lá e obter o benefício adicional de ser mais fácil ver o recuo.
Yevgeniy Brikman 29/10/10
27
Não vi a linha em branco - estou mais familiarizado com o recuo duplo dos parâmetros para MyFunction () quando eles se desviam para outra linha.
Armand
34
Quebrar os parâmetros em várias linhas como essa é enlouquecedor.
Fosco
10
O argumento "parâmetro da função" é um arenque vermelho. Obviamente, os argumentos devem ter dupla intenção. Não há problema algum em diferenciá-lo do código a seguir.
David Ongaro 22/03
99

As regras principais são:

  1. Siga o padrão de codificação existente do projeto.
  2. Se não houver um padrão de codificação e você estiver editando uma base de código existente pertencente a outra pessoa - seja consistente com o estilo do código existente, não importa o quanto você goste / não.
  3. Se você estiver trabalhando em um projeto de campo verde - discuta com outros membros da equipe e chegue a um consenso sobre um padrão de codificação formal ou informal.
  4. Se você estiver trabalhando em um projeto de campo verde como o único desenvolvedor - decida-se e seja implacavelmente consistente.

Mesmo que você não tenha restrições externas, é melhor (IMO) procurar um padrão de codificação existente (amplamente utilizado) ou uma diretriz de estilo e tentar seguir. Se você seguir seu próprio estilo, há uma boa chance de que você se arrependa em alguns anos.

Por fim, um estilo que é implementado / implementável usando verificadores de estilo e formatadores de código existentes é melhor do que aquele que precisa ser "imposto" manualmente.

Stephen C
fonte
10
Esta resposta merece mais votos.
ASHelly #
1
consistência é a chave
MediaVince
70

O benefício do primeiro método é que ele é mais verticalmente compacto, para que você possa ajustar mais código na tela, e é por isso que eu prefiro. O único argumento que ouvi a favor do segundo método é que facilita o pareamento entre colchetes de abertura e fechamento, mas a maioria dos IDE tem um atalho de teclado para isso, e na verdade é uma declaração falsa - em vez de emparelhar um colchete de abertura a um fechamento colchete você pode emparelhar um colchete de fechamento com a expressão "início do bloco" (se, além disso, por enquanto) no mesmo nível de indentação, para que seja fácil determinar onde está o início do bloco.

Não vejo razão para desperdiçar uma linha inteira apenas entre parênteses quando a construção anterior para / enquanto / se já indica visualmente o início de um bloco.

Dito isto, acredito que o colchete de fechamento deve estar em sua própria linha, porque precisamos de algo para indicar o fim de um bloco e sua estrutura de indentação de maneira visível.

EpsilonVector
fonte
12
Não ... estou dizendo por que reduzir a quantidade de código que pode caber na tela fazendo algo que não contribui para a clareza do código?
EpsilonVector
6
Quando eu estava começando a codificação eu gostei cada cinta em sua própria linha, agora eu prefiro o primeiro método
Nim Chimpsky
57
Há um enorme corpo de pesquisa, que remonta ao início da Era do Vapor (Weinberg, "Psicologia da Programação de Computadores"), que mostra que a compreensão do programador diminui DRAMATICAMENTE quando a quantidade de código que deve ser visualizada é maior do que pode ser visto ao mesmo tempo (ou seja, uma tela, uma página da impressora). Este fenômeno argumenta FORTE para ver o espaço vertical como um recurso valioso, para não ser desperdiçado gratuitamente, e, portanto, o primeiro método é preferido.
John R. Strohm
10
LOL @ "desperdiçando uma linha INTEIRA". AMD! Isso não!! = P
Nick Spreitzer
6
@ Julio Na faculdade, eu preferia o método 1 fortemente, e não aguentava ler o método 2. Depois de trabalhar em uma empresa que usa C #, onde o padrão é o método 2, passei a gostar também. Agora posso ler ou usar qualquer um; ninguém me incomoda. Pessoas que têm uma reação fortemente avessa a uma ou outra geralmente estão exagerando em algo que não estão familiarizadas.
precisa saber é o seguinte
46

eu prefiro

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

sobre

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

porque a linha you.postAnswer();é muito mais fácil de ler e encontrar à primeira vista. Na segunda maneira, ela se mistura com a linha acima dela ( you.hasAnswer()), fazendo com que meus olhos tenham que se concentrar mais para lê-la.

JD Isaacks
fonte
7
Isso é verdade até que seu programa exceda a altura da tela. ;)
weberc2
13
@ weberc2 Acho que quando o seu programa excede a altura da tela, duas linhas a menos não mudam muito.
Mageek
13
10 anos atrás, eu teria concordado sobre o espaço na tela. Hoje, uso uma tela de 1920 * 1200. Cabe muito código, mais do que meu cérebro pode processar de uma só vez. O primeiro método permite-me recuar e ver os diferentes escopos abrindo / fechando sem ter que lê-lo.
LightStriker
3
Eu nunca conseguia entender por que preferia esse método, mas é exatamente isso.
Declan McKenna
2
@ Magek Isso é tardio, mas não são 2 linhas, são 2 linhas para todos os escopos. Isso é O (N), não O (1). Na verdade, não sinto tanto por isso; é mais importante que você escolha um estilo que torne longas listas de parâmetros legíveis.
weberc2
38

Eu prefiro o primeiro método. Aparelho não vale totalmente a linha separada.

O problema é que o aparelho não é importante. Eles são apenas lixo sintático , o que é absolutamente desnecessário para entender para que serve o código, qual é o seu objetivo e a maneira como é implementado. Eles são apenas um tributo às linguagens antigas do tipo C, onde o agrupamento visual de operadores era impossível devido ao pouco espaço disponível na tela.

Existem idiomas (Python, Haskell, Ruby) que são válidos sem chaves. Isso apenas confirma que os aparelhos são lixo e não deve merecer uma linha para eles sempre que possível:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}
P Shved
fonte
7
Eu não sei sobre Haskell ou Ruby, mas o Python é sensível a espaços em branco, e é por isso que não requer chaves ou outros delimitadores para indicar blocos. Os aparelhos não são apenas ruídos sintáticos; eles servem a um propósito real.
Robert Harvey
14
@ Robert, Em C você tem que fazer tanto espaço em branco quanto aparelho. No Python, você deve fazer apenas espaço em branco. Qual é melhor?
precisa saber é o seguinte
5
@ Pavel, em C 'você não precisa fazer espaço em branco.
Ken Bloom
7
Os programas do @KenBloom C sem espaço em branco são impossíveis de ler. Então você tem que fazê-los de qualquer maneira.
usar o seguinte
6
Independentemente de os aparelhos serem uma boa ideia ou não, a mera existência de linguagens que não os usam não parece um argumento a favor ou contra. Apenas sugere que é possível ter um idioma sem eles, não que seja um design de idioma bom ou ruim.
Jason
37

Use Python e evite o argumento completamente.

Mark Ransom
fonte
17
+1SyntaxError: not a chance
Seth
6
Isso simplesmente não é uma opção para a vasta e vasta maioria dos projetos. Além disso, o recuo para agrupamento tem sua parcela de problemas.
Bryan Oakley
@ Bryan, percebo que isso não é muito prático. Eu apenas pensei que era um ponto de vista que precisava estar lá fora, mais forte do que apenas um comentário. E nunca me deparei com os problemas causados ​​pelo recuo que você implica, provavelmente porque não misturo guias e espaços.
Mark Ransom
Use Go e contornar o argumento completamente (mais estática digitação, velocidade, e um compilador!) :)
weberc2
4
Em seguida, pressione a barra de espaço muitas vezes e observe o compilador / intérprete rir de você. Isso não vai acontecer na maioria dos idiomas.
Pharap 02/02
27

A posição dos aparelhos deve ser

metadados

configurável no IDE pelo programador. Dessa forma, essas chatas chaves em todo o código, independentemente do autor, têm a mesma aparência.

Jonathan
fonte
7
Concordo plenamente. É apresentação e não dados.
Petruza 9/11/12
A questão é que, se você permitir que todos definam seus próprios objetivos, as coisas ficarão confusas muito rapidamente à medida que as confirmações são feitas.
Andy
1
@ Andy: Esse é exatamente o ponto, o IDE mudará sua aparência, mas apenas no IDE! A fonte real não será tocada. Para controle de versão, você pode adicionar ganchos que convertam qualquer que seja a configuração para chaves, para uma situação comum, para que todos verifiquem o código da mesma maneira.
Klaar
@klaar Todo IDE moderno que eu usei mudará as guias para espaços e moverá as chaves para sua própria linha ou para o final da linha "abertura"; Não sei por que você acha que a fonte não é tocada nesses casos, e essa é a razão do meu comentário. Geralmente, é alterado pelos IDEs, dependendo das configurações dos desenvolvedores, o que significa que durante uma confirmação, verei muitas mudanças que são apenas ruídos à medida que as chaves foram movidas para sua própria linha, ocultando a alteração REAL que alguém fez.
Andy
@ Andy: Não existe a possibilidade de usar ganchos que convertam essas discrepâncias em espaço em branco e chaves em um padrão uniforme após a confirmação, para contornar o problema de ruído que você descreveu? De qualquer maneira, um sistema de versão adequado deve transcender coisas mesquinhas, como espaço em branco ou outras coisas sem sentido.
precisa saber é
19

Depende.

Se eu estiver codificando em Javascript ou jQuery, utilizarei o primeiro formulário:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

Mas se estou codificando em C #, utilizo a segunda forma, porque essa é a maneira canônica de fazê-lo em C #.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

Observe que seu exemplo pode ser escrito

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

em c #.

Robert Harvey
fonte
1
Pode ser escrito em vários idiomas como esse, porque uma declaração de bloco é uma declaração. Adicionando! :-)
Tamara Wijsman
2
De acordo com as "Diretrizes de projeto da estrutura", a "maneira canônica" é colocar a chave de abertura na mesma linha (isto é, a primeira forma). Apenas dizendo ...
Uwe Honekamp
3
@ Uwe: Talvez. Mas a Microsoft adotou a abordagem "chaves alinhadas" para todos os seus MSDN C # exemplos, e é cozido em Visual Studio, então ...
Robert Harvey
@Uwe: Esse é o livro de Cwalina e tem um nome terrível, pois é muito mais do que isso. O FDG no MSDN não tem nada a dizer sobre isso. Também me pergunto, por que as Diretrizes de Design do Framework dizem algo sobre a prática de codificação em C # ?
R. Martinho Fernandes
3
Você deve, de fato, colocar chaves na mesma linha em Javascript. Você pode causar erros se os chavetas estiverem em sua própria linha. Por exemplo, consulte encosia.com/…
Joseph Hansen
18

Eu prefiro o primeiro porque é mais difícil para mim ver o erro neste exemplo.

if (value > maximum);
{
    dosomething();
}

do que é neste exemplo

if (value > maximum); {
    dosomething();
}

O que ; {me parece mais errado do que uma linha que termina com, ;então é mais provável que eu note.

bmb
fonte
11
Você faz um bom argumento, mas, pessoalmente, isso só aconteceu comigo uma vez em meus 5 anos de programação. Eu não conseguia descobrir por que não estava executando, postei no SO e alguém rapidamente apontou o ponto e vírgula para mim. No entanto, toda vez que é condensado usar essa linha a menos, acho mais difícil de ler.
JD Isaacks #
6
O "; {" parece um tipo de cara de mau humor piscando ou talvez uma pessoa com bigode.
glenatron
+1 Ótimo exemplo de resposta: erro muito sutil, facilmente esquecido. Pensou provocando também no layout mostrando isso.
Therobyouknow 17/01/11
10
É claro que qualquer IDE decente sinalizará a declaração de controle vazia e qualquer compilador decente emitirá um aviso.
Dunk
@Dunk A única falha no seu argumento (com a qual concordo vigorosamente) é que muitas pessoas estão usando linguagens interpretadas hoje em dia (JavaScript, PHP, et al) que muitos "programadores" não conheceriam um compilador a partir de um duplo café com leite.
Craig
15

Eu prefiro uma ligeira variante de 1)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

Por quê?

  • Eu acho que sempre colocar aparelho na própria linha diminui a legibilidade. Só posso ajustar uma certa quantidade de código fonte na minha tela. O estilo de colchete 2) torna os algoritmos de heave com muitos loops e condicionais aninhados dolorosamente longos.

  • No entanto, quero elsecomeçar em uma nova linha porque ife elsepertenço juntos, visualmente. Se houver um suporte na frente do else, é muito mais difícil identificar o que pertence ao quê.

  • 3) se desqualifica. Todos sabemos que coisas ruins podem acontecer se você deixar de fora os parênteses e esquecer.

Alexander Gessler
fonte
1
Eu já vi esse aqui onde eu trabalho. É interessante.
Almo
1
Também gosto mais desse estilo, pois ele permite colocar comentários acima da elselinha quando necessário e / ou colocar uma linha em branco entre o if-block e o else-block para tornar as coisas menos cheias. O estilo de suporte nº 2 não faz nada além de distanciar as ações das condições. Com isso dito, o meu favorito é definitivamente nenhum estilo de suporte do python :)
sayap
4
Se maximizar o número de linhas de código na tela é importante, basta acabar com as novas linhas. Você poderá obter muitas linhas em uma tela. Prefiro não ter nada que me faça pausar e pensar enquanto lê, ou seja. minha definição de mais legível. Com os aparelhos, minha mente os ignora. Sem os aparelhos, minha mente precisa pausar e alinhar os blocos de controle. Não é uma pausa longa, mas uma pausa, no entanto.
Dunk
1
Sim, se e mais pertencem um ao outro, MAS o mesmo acontece {e} e como} está em uma linha separada, {deve estar em uma linha separada também. "Só consigo encaixar uma certa quantidade de código fonte na minha tela" E é exatamente por isso que dizer o 3) seria "desqualificar a si mesmo" não é uma opção. Depois de uma década trabalhando com 3), nunca esqueci de adicionar colchetes ao adicionar uma nova linha de código, nem conheço ninguém que já o tenha feito. Se eu precisar ajustar o código para pessoas que não sabem ler corretamente, onde isso termina? Parando de usar certos recursos de idioma, porque alguns dos leitores de códigos podem não entendê-los?
Kaiserludi

10

Eu li em algum lugar que os autores de algum livro queriam que seu código fosse formatado assim:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Mas as restrições de espaço de seus editores significavam que eles precisavam usar isso:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

Agora não sei se isso é verdade (como não consigo mais encontrá-lo), mas o último estilo é muito prevalente nos livros.

Em nível pessoal, prefiro os colchetes em uma linha separada como:

a) eles indicam um novo escopo
b) é mais fácil identificar quando há uma incompatibilidade (embora isso seja um problema menor em um IDE que destaque erros para você).


... A segunda opção também facilita os dois pontos (apenas com o recuo servindo ao objetivo do conjunto de chave / recuo). :)
weberc2

10

Ah, o único estilo de cinta verdadeira .

Tem tudo o que é necessário para um Caminho Sagrado - até mesmo um profeta (Richard "meu caminho ou a estrada" Stallman)).

O cara estava tão errado com tantas coisas, mas o GNU é perfeito quando se trata de aparelhos.


[Atualização] Eu vi a luz, e agora adoro Allman


9
Não vejo o objetivo do estilo GNU, além de modelar o código lisp. Parece muito trabalho para pouco benefício.
Robert Harvey

Não conheço ninguém que use o estilo GNU. 1 TB por todo o caminho.
Jé Queue

Você não pode fazer nada pior do que dois níveis de recuo por bloco, exceto o estilo lisp, é claro, isso é óbvio.
ergosys

4
+1 para o link nos estilos de chave. Isso mostra que, seja qual for o seu estilo, muitas pessoas excelentes discordam de você.
Florian F

@RobertHarvey Não há trabalho extra, se for, você não usa a ferramenta certa para escrever código ou configurá-lo corretamente. O benefício é um código muito mais legível, você vê todos os erros do suporte muito rapidamente e pode ler facilmente apenas o código enquanto ignora os sub-blocos.
12431234123412341234123

9

Segundo exemplo, eu sou muito grande em legibilidade. Não suporto olhar se bloqueia de outra maneira = (


1
Pesquisas indicam que é mais fácil ler código compacto quando uma base de código excede a altura da tela.
Weberc2

5
@ weberc2, você poderia fornecer DOIs para esses trabalhos de pesquisa?
Grzegorz Adam Kowalski

9

Resposta simples: o que é mais fácil de depurar?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

Em qual caso você diagnosticou o problema primeiro?

Eu não ligo muito para preferências pessoais (existem muitos outros estilos, incluindo whitesmith e outros) e não ligo muito ... desde que isso não atrapalhe minha capacidade de ler o código e depurá- lo.

Quanto ao argumento "desperdiçar espaço", não compro: tenho a tendência de adicionar linhas em branco entre grupos lógicos para tornar o programa mais claro ...


1
Ambos são fáceis de depurar, principalmente porque é um pequeno bloco de código. O recuo é consistente, facilitando a visualização dos blocos de código reais.
Htbaa

@ Htbaa: de fato :) Então, por que se preocupar?
Matthieu M.

@MatthieuM. O primeiro bloco faz mais sentido para mim, porque as novas linhas (no segundo bloco) entre a assinatura da função, a instrução for e a instrução if me fazem acreditar que não são relacionadas, mas claramente não são. Linhas em branco são para separar bits de código não relacionados; código próximo a outras linhas de código significa que elas são de fato relacionadas. Isso é tudo "imo", é claro, mas eu me perguntava qual era o seu ponto. EDIT: também qualquer IDE adequado notará qualquer chave faltando e fornecerá alguns erros ao interpretar seu código.
Klaar

7

Não é que alguém notará, mas é por isso que os aparelhos pertencem à mesma linha que o condicional (exceto condicionais muito longos, mas esse é um caso extremo):

Em C, esta é uma construção válida:

while (verdadeiro);
{
    char c;
    getchar (); // Aguardar entrada
}

Rápido! O que faz este código? Se você respondeu "loop infinito pedindo entrada", está errado! Nem chega na entrada. É pego em while(true). Observe esse ponto e vírgula no final. Esse padrão é realmente mais comum do que parece; C requer que você declare suas variáveis ​​no início de um bloco, e é por isso que uma nova foi iniciada.

Uma linha de código é um pensamento. Chaves são uma parte do pensamento que contém o condicional ou loop. Portanto, eles pertencem à mesma linha.

Christian Mann
Esse é, de longe, o melhor argumento para o estilo K&R que eu já vi, o resto é ridículo com os sistemas IDE atuais com suporte a dobragem de código. Isso se aplica apenas a idiomas no estilo C que suportam ;extremidades de bloco. É também por isso que desprezo esse sistema de finalização de blocos que o IMHO está desatualizado e a linguagem Go o comprova. Eu já vi esse problema muitas vezes, embora não neste cenário. Geralmente acontece onde eles pretendem adicionar algo à declaração e esquecer.
Jeremy
para ser usado assim postAnswer()e doSomething()deve retornar valor para o operador ternário, o que geralmente não é o caso: eles podem muito bem retornar nulos (sem valor). e também (pelo menos em c #) resultado ?:deve ser atribuído a algumas variáveis
ASh
4
Como mostra o exemplo, o recuo é muito importante do que chaves para código legível. De fato, algumas linguagens tornam o recuo a única maneira de aninhar declarações!
1
Ok, sinceramente, acho seu exemplo inconsistente difícil de ler. Não é realmente difícil, mas mais difícil do que se fosse consistente.
Almo
Eu concordo com Almo. Não é um caso de "é realmente difícil". É um caso de "é definitivamente mais difícil", mesmo que não seja difícil. Então, por que tornar as coisas mais difíceis? Nos exemplos de "brinquedos", as pessoas dão, é claro, há pouca diferença. Na minha experiência, quando eu herdo código desagradável de outra pessoa e ela usa o método 1, com muita frequência torna-se necessário prosseguir e transformá-lo no método 2 apenas para poder seguir a lógica. Por causa do fato de que isso se torna frequentemente necessário; ele responde automaticamente à pergunta sobre qual método é melhor e mais fácil de entender.
Dunk
@ Dunk: Não consigo entender código que seria visivelmente melhorado trocando esses detalhes irrelevantes.
jkerian
@ jkerian-Aparentemente, você não herdou muito código de outras pessoas que deixaram o projeto ou a empresa há muito tempo. Não consigo imaginar não encontrar essa situação por alguém com alguns anos de experiência. Mas, novamente, a situação de trabalho de todos é diferente. Além disso, se você precisar fazer revisões de código "formais", a formatação faz muita diferença. Ser capaz de ler o código naturalmente é muito importante. Claro que posso fazer uma pausa e pensar em combinar chaves, mas isso atrasa o processo. Uma maneira não requer uma pausa, as outras exigem. É por isso que não vejo por que outra opção possa ser recomendada.
Dunk
Os veteranos como eu usam três teclas para selecionar o bloco, não importa onde estejam os malditos aparelhos.
ergosys
8
Mau, mal, quero dizer terrível, terrível exemplo. O problema não é o aparelho! É o recuo louco!
R. Martinho Fernandes
@Martinho Fernandes Pensei que colocar aparelho e indentação andam juntos ...
AndrejaKo
2
não necessariamente ... faça o recuo adequado no item acima e depois alterne aleatoriamente os estilos de chaves, você verá que é compreensível.
jkerian
De fato, pensar nisso motivou minha própria resposta a essa pergunta.
jkerian
"95% dos bugs no programa que ele fez vieram de chaves incompatíveis" - apenas em idiomas interpretados, não compilados.
Mawg
3
O estilo C sempre me irritava. Ser consistente!
Christian Mann
5
+1, -1. Por que você NÃO recuou com guias, pois qualquer editor pode ajustar o comprimento da guia ao seu tamanho arbitrário? Caso contrário, você leva muitos de nós que gostam de recuos verdadeiros às 8 horas para amaldiçoar seu código.
Jé Queue
9
... assim como a maioria dos programadores que se engasgariam com isso.
Jé Queue
4
Isso parece horrível. Pense no esforço extra que você precisará realizar se quiser inserir uma linha na parte superior ou remover a linha superior. Você não pode simplesmente excluir a linha e seguir em frente; lembre-se de reinserir a chave.
Bryan Oakley
lol isso é incrível! :) melhor que o primeiro estilo!
Nawfal
Aparentemente, até tem um nome. O Horstman Syyle é mencionado na wikipedia . Eu trabalhei com uma base de código como esta, não é realmente ruim de usar.
AShelly
2
Pior seria se alguém aparecesse e fizesse: if (you.hasAnswer ()) you.postAnswer (); caso contrário você. alguma coisa (); you.doSomethingElse (); - é uma receita para erros sutis que o olho pode facilmente deslizar e o compilador também não ajudará
#
@FinnNk: Exatamente!
Chankey Pathak
2
Se alguém quiser adicionar outra declaração, poderá colocar o aparelho em si. Qualquer programador que se preze realmente deve ser capaz de descobrir isso.
Robert Harvey
Eu queria dizer que seu terceiro método está errado.
Chankey Pathak
3
@ Robert Harvey, já vi muitos codificadores experientes sentirem falta de adicionar chaves ao modificar o código existente. Penso que o problema é que o recuo é uma pista muito mais forte do que os aparelhos (especialmente porque existem vários estilos de aparelho), por isso é muito fácil ignorar o aparelho ausente se o aparelho parecer com o que você espera.
ASHelly 28/09/10
5

Eu gosto do primeiro método. Parece IMO mais limpo, e é mais compacto, o que eu gosto.

EDIT: Ah, um terço. Eu gosto desse melhor quando possível, pois é ainda menor / mais limpo.

Ullallulloo
fonte
5

Você pode escrever:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

Para responder à pergunta; Eu costumava preferir chaves em sua própria linha, mas, para evitar pensar em bugs da inserção automática de ponto e vírgula nos navegadores, comecei a usar o estilo egípcio para javascript. E ao codificar java no eclipse, eu não tinha interesse em combater (ou configurar) o estilo de chave padrão, por isso também fui com o egípcio. Agora estou bem com os dois.

FeatureCreep
fonte
para ser usado assim postAnswer()e doSomething()deve retornar valor para o operador ternário, o que geralmente não é o caso: eles podem muito bem retornar nulos (sem valor). e também (pelo menos em c #) resultado ?:deve ser atribuído a algumas variáveis
ASh
4

Quase todas as respostas aqui estão dizendo alguma variação em "Faça o que fizer, fique com uma ou duas".

Então pensei nisso por um momento e tive que admitir que simplesmente não considero isso tão importante. Alguém pode me dizer honestamente que é difícil seguir o seguinte?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

Não tenho certeza de mais ninguém ... mas não tenho absolutamente nenhum problema de alternar mentalmente entre os estilos. Demorei alguns minutos para descobrir o que o código fazia, mas esse é o resultado de eu digitar aleatoriamente a sintaxe do tipo C. :)

Na minha opinião não tão humilde, as chaves de abertura são quase completamente irrelevantes para a legibilidade do código. Existem alguns casos de canto listados acima, nos quais um estilo ou outro faz a diferença, mas, na maioria das vezes, o uso criterioso de linhas em branco limpa isso.

No FWIW, nossos estilos de codificação no trabalho usam uma forma um pouco mais estruturada 1 e uma forma modificada 3. (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

Estou curioso para saber se aqueles que preferem o formulário 2 acham melhor essa versão do formulário 1, apenas porque a linha em branco oferece uma separação visual mais forte.

jkerian
fonte
4
Como mostra o exemplo, o recuo é muito importante do que chaves para código legível. De fato, algumas linguagens tornam o recuo a única maneira de aninhar declarações!
1
Ok, sinceramente, acho seu exemplo inconsistente difícil de ler. Não é realmente difícil, mas mais difícil do que se fosse consistente.
Almo
Eu concordo com Almo. Não é um caso de "é realmente difícil". É um caso de "é definitivamente mais difícil", mesmo que não seja difícil. Então, por que tornar as coisas mais difíceis? Nos exemplos de "brinquedos", as pessoas dão, é claro, há pouca diferença. Na minha experiência, quando eu herdo código desagradável de outra pessoa e ela usa o método 1, com muita frequência torna-se necessário prosseguir e transformá-lo no método 2 apenas para poder seguir a lógica. Por causa do fato de que isso se torna frequentemente necessário; ele responde automaticamente à pergunta sobre qual método é melhor e mais fácil de entender.
Dunk
@ Dunk: Não consigo entender código que seria visivelmente melhorado trocando esses detalhes irrelevantes.
jkerian
@ jkerian-Aparentemente, você não herdou muito código de outras pessoas que deixaram o projeto ou a empresa há muito tempo. Não consigo imaginar não encontrar essa situação por alguém com alguns anos de experiência. Mas, novamente, a situação de trabalho de todos é diferente. Além disso, se você precisar fazer revisões de código "formais", a formatação faz muita diferença. Ser capaz de ler o código naturalmente é muito importante. Claro que posso fazer uma pausa e pensar em combinar chaves, mas isso atrasa o processo. Uma maneira não requer uma pausa, as outras exigem. É por isso que não vejo por que outra opção possa ser recomendada.
Dunk
4

Estou surpreso que isso ainda não tenha sido criado. Eu prefiro a segunda abordagem porque permite que você selecione o bloco mais facilmente.

Quando os chavetas começam e terminam na mesma coluna e em sua própria linha, é possível selecionar na margem ou com o cursor na coluna 0. Isso geralmente equivale a uma área mais generosa com a seleção do mouse ou menos pressionamentos de tecla com a seleção do teclado.

Originalmente, eu trabalhei com aparelhos na mesma linha do condicional, mas quando troquei, descobri que ele acelerava a taxa na qual trabalhava. Não é noite e dia, é claro, mas é algo que o atrasará um pouco, trabalhando com aparelhos ao lado de seus condicionais.

Tim O'Neil
fonte
Os veteranos como eu usam três teclas para selecionar o bloco, não importa onde estejam os malditos aparelhos.
ergosys
2

Eu pessoalmente gosto do segundo caminho.

No entanto, na minha opinião, a maneira que vou demonstrar é melhor porque resulta em maior segurança no emprego! Um colega da minha universidade me pediu ajuda com a lição de casa e foi assim que o código dele se parecia. Todo o programa parecia um único bloco. O interessante é que 95% dos bugs no programa que ele criou vieram de chaves incompatíveis. Os outros 5% eram óbvios quando os aparelhos eram compatíveis.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);
AndrejaKo
fonte
8
Mau, mal, quero dizer terrível, terrível exemplo. O problema não é o aparelho! É o recuo louco!
R. Martinho Fernandes
@Martinho Fernandes Pensei que colocar aparelho e indentação andam juntos ...
AndrejaKo
2
não necessariamente ... faça o recuo adequado no item acima e depois alterne aleatoriamente os estilos de chaves, você verá que é compreensível.
jkerian
De fato, pensar nisso motivou minha própria resposta a essa pergunta.
jkerian
"95% dos bugs no programa que ele fez vieram de chaves incompatíveis" - apenas em idiomas interpretados, não compilados.
Mawg
2

Minha preferência pessoal é pelo primeiro método, provavelmente porque foi assim que aprendi PHP.

Para ifinstruções de linha única , usarei

if (you.hasAnswer()) you.postAnswer();

Se não for, you.postAnswer();mas algo muito mais longo, como you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);provavelmente voltarei ao primeiro tipo:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

Nunca usarei uma quebra de linha e nunca usarei esse método se houver também uma elsedeclaração.

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

é uma possibilidade teórica, mas nunca uma que eu usaria. Isso teria que ser transformado em

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}
TRiG
fonte
2

Eles não deveriam; primeiro método para mim.

Quando olho para a segunda, por causa das linhas não utilizadas (aquelas que só têm chaves, exceto a última chave de fechamento), parece que isso quebra a continuidade do código. Não consigo lê-lo tão rápido porque preciso dedicar atenção especial às linhas vazias, que geralmente significam uma separação no objetivo do código ou algo assim, mas em nenhum caso "essa linha pertence a uma chave" (que apenas repete o significado recuo).

De qualquer forma, assim como quando você escreve um texto ... a adição de um recuo no início de um parágrafo é supérflua se houver uma linha em branco à sua frente (duplo sinal de alteração de parágrafo), não há necessidade de desperdiçar linhas para chaves quando estamos recuo corretamente.

Além disso, como já foi dito, ele permite ajustar mais código na tela, o que, de outra forma, é um pouco contraproducente.

Joanis
fonte
2

Depende da plataforma / idioma / convenções

Em Java:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

Em c #

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

Em C:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Eu odeio quando os caras do Java usam seu estilo no código C # e vice-versa.

OscarRyz
fonte
3
O estilo C sempre me irritava. Ser consistente!
Christian Mann
1

Tudo o que posso dizer é que, se você é fã do método nº 3, será perseguido por qualquer formatador de código IDE do mundo.

Phil Cohen
fonte
1

Eu uso o primeiro método simplesmente porque é mais compacto e permite mais código na tela. Eu próprio nunca tive problemas em emparelhar chaves (eu sempre as escrevo, juntamente com a ifdeclaração antes de adicionar a condição, e a maioria dos ambientes permite que você pule para a chave correspondente).

Se você fez precisa emparelhar-se chaves visualmente, então eu preferiria o segundo método. No entanto, isso permite menos código ao mesmo tempo, o que exige que você role mais. E isso, para mim, pelo menos, tem um impacto maior na leitura do código do que ter chaves perfeitamente alinhadas. Eu odeio rolagem. Por outro lado, se você precisar rolar uma única ifdeclaração, é provável que ela seja muito grande e precise ser refatorada.

Mas; o mais importante de tudo é consistência. Use um ou outro - nunca os dois!

gablin
fonte
0

Quando aprendi a programação aos 12 anos, coloquei o aparelho na próxima linha, porque os tutoriais de codificação da Microsoft são assim. Eu também recuei com TABs de 4 espaços naquela época.

Depois de alguns anos, aprendi Java e JavaScript e vi mais códigos de chaves na mesma linha, então mudei. Eu também comecei a recuar com 2 espaços.

Ming-Tang
fonte
5
+1, -1. Por que você NÃO recuou com guias, pois qualquer editor pode ajustar o comprimento da guia ao seu tamanho arbitrário? Caso contrário, você leva muitos de nós que gostam de recuos verdadeiros às 8 horas para amaldiçoar seu código.
Jé Queue
0

Há uma quarta opção que mantém os aparelhos alinhados, mas não desperdiça espaço:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

O único problema é que a maioria dos formadores automáticos de IDE se engasga com isso.

AShelly
fonte
9
... assim como a maioria dos programadores que se engasgariam com isso.
Jé Queue
4
Isso parece horrível. Pense no esforço extra que você precisará realizar se quiser inserir uma linha na parte superior ou remover a linha superior. Você não pode simplesmente excluir a linha e seguir em frente; lembre-se de reinserir a chave.
Bryan Oakley
lol isso é incrível! :) melhor que o primeiro estilo!
Nawfal
Aparentemente, até tem um nome. O Horstman Syyle é mencionado na wikipedia . Eu trabalhei com uma base de código como esta, não é realmente ruim de usar.
AShelly
-1

Tudo depende de você, desde que não esteja trabalhando em um projeto em que algumas restrições de codificação ou alguns padrões foram definidos pelo gerente de projeto que todos os programadores que estão trabalhando nesse projeto devem seguir durante a codificação.

Eu, pessoalmente, preferiria o primeiro método.

Também não entendi o que você quer mostrar pelo terceiro método?

Não é esse o caminho errado? Por exemplo, considere uma situação como ..

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

Agora, e se alguém quiser adicionar mais algumas instruções no bloco if ?

Nesse caso, se você usar o terceiro método, o compilador lançará o erro de sintaxe.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();
Chankey Pathak
fonte
2
Pior seria se alguém aparecesse e fizesse: if (you.hasAnswer ()) you.postAnswer (); caso contrário você. alguma coisa (); you.doSomethingElse (); - é uma receita para erros sutis que o olho pode facilmente deslizar e o compilador também não ajudará
#
@FinnNk: Exatamente!
Chankey Pathak
2
Se alguém quiser adicionar outra declaração, poderá colocar o aparelho em si. Qualquer programador que se preze realmente deve ser capaz de descobrir isso.
Robert Harvey
Eu queria dizer que seu terceiro método está errado.
Chankey Pathak
3
@ Robert Harvey, já vi muitos codificadores experientes sentirem falta de adicionar chaves ao modificar o código existente. Penso que o problema é que o recuo é uma pista muito mais forte do que os aparelhos (especialmente porque existem vários estilos de aparelho), por isso é muito fácil ignorar o aparelho ausente se o aparelho parecer com o que você espera.
ASHelly 28/09/10