As chaves devem aparecer em sua própria linha? [fechado]
On Fevereiro 14, 2021 by adminComentários
- Acho " == true " distrai mais do que a escolha da colocação da chave.
- @Dan: Acho que sempre explicar a expressão condicional ajuda muito na clareza.
- A única razão para isso assunto seria se o seu IDE / editor não ' não suporta o reconhecimento de chaves correspondentes.
- @ leeand00: alguns de nós ainda imprimem código complexo / desconhecido a fim de estudá-lo / anotá-lo. Uma boa e bonita impressora atenua a maioria dos problemas.
- infelizmente a questão está encerrada. Após algum tempo de uso da sintaxe baseada em indentação, mudei para (talvez estranho) outra estrutura de colchetes. Como sua primeira chave de fechamento na última linha do bloco. (após a linha de código)
Resposta
Quando eu era estudante, costumava colocar colchetes nos mesmos linha, para que haja menos linhas e o código seja impresso em menos páginas. Olhar para um único caractere de colchete impresso como a única coisa em uma linha é irritante. (ambiente, desperdício de papel)
Mas ao codificar aplicativos grandes, permitir algumas linhas com apenas colchetes são acessíveis, considerando a sensação de “agrupamento” que isso proporciona.
Qualquer estilo que você escolher , seja consistente para que seu cérebro não se torne uma sobrecarga para 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 “mudar de contexto” em alto nível.
Comentários
- Por outro lado, a chave na nova linha é um PADRÃO ANSI, K & R não é. Mas a beleza dos padrões é que existem tantos diferentes (consulte também uncyclopedia.wikia.com/wiki/AAAAAAAAA ! na desciclopédia).
- " há menos linhas " Eu tenho Terabytes de espaço e muitos pixels. Por que devo me preocupar em usar mais linhas?
- @ 12431234123412341234123: I 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 é um desperdício de papel ou um km ² de forrest é desperdiçado em grande escala. No entanto, se você não ' t imprima (eu certamente não ' t), ANSI é muito melhor do que K & R. Além disso, qualquer pessoa que pretenda imprimir provavelmente deve usar um formatador de código automatizado – então, isso deve ser uma questão de ferramentas, não de estilo de codificação.
- Concordo que você deve permanecer consistente, I ' uso colchetes em novas linhas há anos, mas tenho que misturar de outra forma em meu código, como ao chamar funções, funções anônimas, literais de objeto, etc. Qualquer linguagem baseada em expressão / código anônimo torna os colchetes na mesma linha muito mais fáceis
Resposta
Você nunca deve usar o terceiro método.
Pular os colchetes pode economizar alguns pressionamentos de tecla na primeira vez, mas o próximo codificador que vier junto com, acrescenta algo à sua cláusula else sem perceber que o bloco está faltando os colchetes. Isso causará muita dor.
Escreva seu código para outras pessoas.
Comentários
- Eu gostaria de saber de onde veio esse pouquinho de sabedoria. Porque escrever seu código para pessoas que ' não se incomodaram em lê-lo é tão inútil quanto você pode imaginar …
- O segundo programador pode adicionar o seu próprio chaves quando ele adiciona algo. Ele ' não é estúpido e, em uma convenção de codificação que incentiva a omissão de colchetes para coisas simples como essa, ele ' saberá como olhar.
- Chaves opcionais não são opcionais. Existem poucas decisões de design piores que foram feitas em C e transportadas para seus descendentes. O fato de continuar vivo em uma linguagem tão recente quanto o C # me deixa furioso.
- Não ' o quão inteligente você é ou quão arraigado é o padrão de codificação em torno de curvas omitidas de linha única: se você ' Se estiver procurando resolver um problema ou bug, você provavelmente não perceberá que os cachos foram omitidos. E para um total de 2 segundos de trabalho, é realmente tão ruim ser explícito?
- Há ' uma vantagem do estilo # 3 que você ' estão todos ausentes: você obtém mais código na tela de uma vez.
Resposta
Por muito tempo argumentei que eles tinham o mesmo valor, ou então muito perto de igualar que o possível ganho por 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 código.
Já vi programadores resistirem a mudanças como essa antes. Deixe isso para trás! Eu mudei muitas vezes em minha carreira. Eu até uso estilos diferentes em meu C # do que em meu PowerShell.
Alguns anos atrás, eu estava trabalhando em uma equipe (cerca de 20 desenvolvedores) que decidiu solicitar entrada e, em seguida, tomar uma decisão e aplicá-la em toda a base de código. Teríamos 1 semana para decidir.
Muitos gemidos & olho -rolar. Muito “gosto do meu jeito, porque é” melhor “, mas sem substância.
Enquanto estudávamos os pontos mais delicados da questão, alguém perguntou como lidar com esse problema no aparelho – mesmo estilo de linha:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Observe que não é imediatamente óbvio onde termina a lista de parâmetros e começa o corpo. Compare com:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Fizemos algumas leituras sobre como as pessoas em todo o mundo lidaram com este problema e descobrimos o padrão de adicionar uma linha em branco após a abertura chave:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Se você vai fazer uma pausa visual, também pode fazer isso com uma chave. Então, suas quebras visuais também se tornam consistentes .
Editar : Duas alternativas para a solução de “linha em branco extra” ao usar K & R:
1 / Indente os argumentos da função de maneira diferente do corpo da função
2 / Coloque o primeiro argumento na mesma linha do nome da função e alinhe outros argumentos em novas linhas a esse 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
Ainda defendo que a consistência é mais importante do que outras considerações, mas se não tivermos um precedente estabelecido , então a chave na próxima linha é o caminho a percorrer.
Comentários
- Para sua informação, posso parecer uma pessoa razoável, mas ' sou na verdade um maluco. Para blocos simples de linha única, não usarei colchetes nem novas linhas, tornando ' if (foo) bar () ' um só linha. Eu me esforço para tornar meu código simples o suficiente para que ' não seja um problema.
- Vim aqui para postar exatamente isso. Toneladas de pessoas que mantêm a chave de abertura na mesma linha seguem com uma linha em branco (especialmente no início das aulas e métodos) porque, do contrário, ' s difícil separar o cabeçalho da classe / método do corpo. Bem, se você ' vai usar uma linha extra de qualquer maneira, pode também colocar a cinta lá e obter o benefício adicional de o recuo ser mais fácil de ver.
- Eu ' não vi a linha em branco – ' estou mais familiarizado com o recuo duplo dos parâmetros para MyFunction () quando eles se perdem em outra linha.
- Quebrar os parâmetros em várias linhas como essa é enlouquecedor.
- O " parâmetro de função " argumento é uma pista falsa. Obviamente, os argumentos devem ter dupla intenção. Nenhum problema em distingui-lo do código a seguir.
Resposta
As regras principais são:
- Siga o padrão de codificação existente do projeto.
- Se não houver um padrão de codificação e você estiver editando um código-base existente de propriedade de outra pessoa – seja consistente com o estilo do código existente, não importa o quanto você goste / não goste dele.
- Se você está trabalhando em um projeto de campo – discuta com outros membros da equipe e chegue a um consenso sobre um padrão de codificação formal ou informal.
- Se você estiver trabalhando em um projeto de campo como o único desenvolvedor – decida-se e seja implacavelmente consistente .
Mesmo que você não tenha restrições externas, é (IMO) melhor procurar um padrão de codificação ou diretriz de estilo existente (amplamente usado) e tentar segui-lo. Se você lançar seu próprio estilo, há “uma boa chance de se arrepender em alguns anos.
Finalmente, um estilo que é implementado / implementável usando verificadores de estilo e formatadores de código existentes é melhor do que um que precisa ser “aplicado” manualmente.
Comentários
- Esta resposta merece mais votos.
- consistência é a chave
Resposta
A vantagem do primeiro método é que ele é mais verticalmente compacto , para que você possa colocar mais código em sua tela, e é por isso que eu prefiro. O único argumento que ouvi a favor do segundo método é que ele torna mais fácil emparelhar colchetes de abertura e fechamento, mas a maioria dos IDE tem um atalho de teclado para isso, e é realmente uma afirmação falsa – em vez de emparelhar um colchete de abertura com um colchete de fechamento, você pode emparelhar um colchete de fechamento com a expressão “início do bloco” (if, else, for, while) no mesmo nível de indentação, por isso é tão fácil de determinar onde é o início do bloco.
Não vejo razão para desperdiçar uma linha inteira apenas com um colchete quando a construção anterior de / while / if já indica visualmente o início de um bloco.
Dito isso, acredito que o colchete de fechamento deva estar em sua própria linha porque precisamos de algo para indicar o final de um bloco e sua estrutura de indentação de forma visível.
Comentários
- Não … Eu ' estou dizendo por que reduzir a quantidade de código que pode cabem na sua tela fazendo algo que não ' adiciona à ' clareza do código?
- Quando eu estava começando a programar, gostei de cada chave em sua própria linha, agora prefiro o primeiro método
- Há um enorme corpo de pesquisas, desde o início da Era Steam (Weinberg, " Psicologia da Programação de Computadores "), que mostra que a compreensão do programador cai DRAMATICAMENTE quando a quantidade de código que deve ser visualizada é maior do que pode ser vista em uma vez (ou seja, uma tela cheia, uma página de impressora). Este fenômeno argumenta FORTEMENTE para ver o espaço vertical como um recurso valioso, que não deve ser desperdiçado gratuitamente e, portanto, o primeiro método é o preferido.
- LOL @ " desperdiçando um TODA a linha ". OH MEU DEUS! Isso não!! = P
- @Julio Na faculdade, eu preferia fortemente o método 1 e não ' aguentava ler o método 2. Depois de ir trabalhar em uma empresa que usa C # , onde o padrão é o método 2, eu ' acabei gostando disso também. Agora posso ler ou usar qualquer um; nenhum deles me incomoda. Pessoas que têm uma reação fortemente avessa a um ou outro geralmente estão reagindo de forma exagerada a algo com o qual não estão familiarizados.
Resposta
Eu prefiro
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
a
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 forma, ele se mistura com a linha acima dele (you.hasAnswer()
) fazendo com que meus olhos tenham que se concentrar mais para lê-lo.
Comentários
- Isso é verdade até que seu programa exceda a altura da tela. 😉
- @ weberc2 Eu acho que quando seu programa excede a altura da tela, duas linhas a menos não ' mudam muito.
- Eu nunca consegui entender por que preferia esse método, mas ele ' s exatamente para isso.
- @Mageek Isso está atrasado, mas ' s não 2 linhas, é ' s 2 linhas para cada escopo. Esse ' é O (N), não O (1). Eu não ' realmente não me sinto tão fortemente sobre isso; é ' mais importante que você escolha um estilo que torne longas listas de parâmetros legíveis.
10 anos atrás, eu teria concordado sobre o espaço da tela. Hoje, uso uma tela de 1920 * 1200. Ele se encaixa em MUITOS códigos, mais do que meu cérebro pode processar de uma vez. O primeiro método me permite recuar e ver os diferentes escopos abrindo / fechando sem ter que lê-lo.
Resposta
Eu prefiro o primeiro método. Os colchetes não valem totalmente uma linha separada.
Acontece que os colchetes não são importantes. Eles “são apenas lixo sintático , o que é absolutamente desnecessário para entender para que serve o código, seu propósito e o forma como ele é implementado. Eles são apenas um tributo às linguagens C-like do estilo antigo, onde o agrupamento visual de operadores era impossível devido ao pouco espaço disponível na tela.
Existem linguagens (Python, Haskell, Ruby) que funcionam sem chaves. Isso apenas confirma que os colchetes são lixo e não devem merecer uma linha para eles sempre que possível:
if (you.hasAnswer()){ you.postAnswer(); }else{ you.doSomething(); }
Comentários
- Eu não ' não sei sobre Haskell ou Ruby, mas Python é sensível a espaços em branco, e é por isso que ' não exige colchetes ou outros delimitadores para denotar blocos. As chaves não são apenas ruído sintático; eles servem a um propósito real.
- @Robert, Em C você deve fazer espaços em branco e colchetes. Em Python, você deve fazer apenas espaços em branco. Qual é melhor?
- @Pavel, em C ' você não ' não precisa fazer espaços em branco.
- Os programas @KenBloom C sem espaços em branco são impossíveis de ler. Portanto, você deve fazê-los de qualquer maneira.
- Independentemente de os colchetes serem uma boa ideia ou não, a mera existência de linguagens que não ' não os usam não ' t parece um argumento a favor ou contra eles. Apenas sugere que é possível ter uma linguagem sem eles, não que seja um bom ou pobre design de linguagem.
Resposta
Use Python e evite o argumento completamente.
Comentários
- +1
SyntaxError: not a chance
- Isso simplesmente não é uma opção para a vasta maioria dos projetos. Além disso, recuo para agrupamento tem sua ' cota de problemas.
- @Bryan, eu percebo que isso não é ' t muito prático. Eu apenas pensei que era um ponto de vista que precisava ser divulgado, mais forte do que apenas um comentário. E eu ' nunca tive os problemas causados pelo recuo que você sugere, provavelmente porque eu não ' misturo tabulações e espaços.
- Use Go e evite o argumento completamente (além de digitação estática, velocidade e um compilador!) 🙂
- Em seguida, pressione a barra de espaço várias vezes e observe o compilador / interpretador rir para você. Isso não ' acontecerá na maioria das línguas reforçadas.
Resposta
A posição das chaves deve ser
metadados
configurável no IDE pelo programador. Dessa forma, essas chatas chatas em todo o código, independentemente do autor, têm a mesma aparência.
Comentários
- Concordo totalmente. É a ' apresentação e não os dados.
- O problema é que, se você deixar que todos definam seus próprios, as coisas ficam complicadas muito rapidamente quando os commits são feitos.
- @Andy: Isso ' é 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 traduzem qualquer que seja a configuração de chaves para uma situação comum, de modo que todos verifiquem o código da mesma maneira.
- @klaar Cada IDE moderno i ' ve usado mudará tabulações para espaços e moverá colchetes para sua própria linha ou no final da " abertura " linha; Eu ' Não tenho certeza por que você acha que a fonte não ' tocada nesses casos, e esse é o motivo do meu comentário. É normalmente alterado pelos IDEs dependendo das configurações do desenvolvedor, o que significa que durante um commit, eu ' verei muitas mudanças que são apenas ruído conforme as chaves foram movidas para sua própria linha, ocultando assim a mudança REAL que alguém fez.
- @Andy: Isn ' Há a possibilidade de usar ganchos que convertem essas discrepâncias em relação a espaços em branco e colchetes em um padrão uniforme uppon commit, para contornar o problema de ruído que você descreveu? De qualquer maneira, um sistema de controle de versão adequado deve transcender coisas insignificantes como espaço em branco ou outras coisas sem sentido.
Resposta
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 ; {
parece mais errado para mim do que uma linha terminando com ;
então é mais provável que eu perceba.
Comentários
- Você tem um bom argumento, mas pessoalmente, isso sempre aconteceu comigo uma vez em meus 5 anos de programação. Não consegui ' 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 ele é condensado para usar essa linha a menos, acho mais difícil de ler.
- O "; {" parece um tipo de rosto mal-humorado piscando ou talvez uma pessoa com bigode.
- +1 Ótimo exemplo de resposta: erro muito sutil, facilmente esquecido. Também é instigante o layout mostrando isso.
- É claro que qualquer IDE decente sinalizará a instrução de controle vazia e qualquer compilador decente emitirá um aviso.
- @Dunk A única falha em seu (com o qual concordo veementemente) é que tantas pessoas estão usando linguagens interpretadas atualmente (JavaScript, PHP, et al) que muitos " programadores " não ' não reconheceria um compilador de um duplo latte.
Resposta
Depende.
Se estou codificando em Javascript ou jQuery, uso a primeira forma:
jQuery(function($) { if ($ instanceOf jQuery) { alert("$ is the jQuery object!"); } });
Mas se estou codificando em C #, uso a segunda forma, porque essa é a maneira canônica de fazer 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 #.
Comentários
- Pode ser escrito em várias linguagens como essa, porque uma instrução em bloco é uma declaração. Adicionando! 🙂
- De acordo com as " Diretrizes de design da estrutura " o " forma canônica " é colocar a chave de abertura na mesma linha (ou seja, a primeira forma). Basta dizer ' …
- @Uwe: Talvez. Mas a Microsoft adotou a abordagem " colchetes " para todos os exemplos C # do MSDN e ' está incorporado ao Visual Studio, então …
- @Uwe: That ' s Cwalina ' s livro e ' é terrivelmente nomeado, 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 Framework Design dizem algo sobre a prática de C # codificação ?
- Você deveria, de fato, colocar chaves na mesma linha em Javascript. Você pode causar erros se as chaves estiverem em sua própria linha. Por exemplo, consulte encosia.com/…
Resposta
Prefiro uma ligeira variante de 1)
if (you.hasAnswer()) { you.postAnswer(); } // note the break here else { you.doSomething(); }
Por quê?
-
Acho que sempre colocar colchetes em sua própria linha diminui a legibilidade. Só consigo colocar uma certa quantidade de código-fonte na minha tela. O estilo de colchete 2) torna os algoritmos de levantamento com muitos loops aninhados e condicionais dolorosamente longos.
-
No entanto, quero que
else
comece em uma nova linha porqueif
eelse
pertencem um ao outro, visualmente. Se houver um colchete na frente deelse
, é muito mais difícil identificar o que pertence a quê. -
3 ) desqualifica-se. Todos nós sabemos o que coisas ruins podem acontecer se você omitir os colchetes e esquecer.
Comentários
- Eu vi este perto de onde trabalho. É ' interessante.
- Também gosto mais desse estilo, pois me permite colocar um comentário acima de
else
linha quando necessário e / ou coloque uma linha em branco entre o bloco if e o bloco else para fazer as coisas parecerem menos congestionadas. O estilo de colchete # 2 não faz nada além de distanciar as ações das condições. Dito isso, meu favorito é definitivamente python ' sem estilo de colchetes 🙂 - Se maximizar o número de linhas de código na tela é importante, então simplesmente elimine com novas linhas completamente. Você ' poderá obter muitas linhas em uma tela. Prefiro que nada me faça parar e pensar enquanto leio, ou seja. minha definição de mais legível. Com os aparelhos, minha mente os ignora. Sem as chaves, minha mente tem que fazer uma pausa e alinhar os blocos de controle. Não é uma pausa longa, mas uma pausa mesmo assim.
- Sim, se e mais pertencerem um ao outro, MAS {and} e as} estão em uma linha separada, {deve estar em uma linha separada linha também. " Só consigo ajustar uma certa quantidade de código-fonte na minha tela " E isso ' É exatamente por isso que dizer 3) seria " desqualificar-se " 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á tenha feito isso. Se eu tiver que ajustar o código às pessoas, quem não pode ' ler corretamente, onde isso termina? Parando de usar certos recursos de linguagem porque alguns dos leitores de códigos podem não entendê-los?
Resposta
Eu li em algum lugar que os autores de alguns livros queriam seu código formatado assim:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Mas as restrições de espaço de seu editor significavam que eles tinham que usar isto:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Agora, não sei se isso é verdade (já que não consigo mais descobrir), mas o último estilo é muito comum nos livros.
Em um nível pessoal, prefiro os colchetes em um linha separada como:
a) eles indicam um novo escopo
b) é mais fácil detectar quando há uma incompatibilidade (embora isso seja menos problemático em um IDE que destaca os erros para você).
Comentários
- … A segunda opção também facilita ambos os seus pontos (com o recuo sozinho servindo ao propósito da chave / combinação de recuo). 🙂
Resposta
Ah, o One True Brace Style .
Ele tem tudo necessário para um Santo W sim – até mesmo um profeta (Richard “do meu jeito ou da estrada” Stallman).
O cara estava tão errado sobre tantas coisas, mas o GNU é certeiro quando se trata de aparelho ortodôntico.
[Atualização] Eu vi a luz e agora adoro Allman
Comentários
- Eu não ' não vejo o objetivo do estilo GNU, a não ser que ele modela o código lisp. Parece muito trabalho para poucos benefícios.
- Não conheço ninguém que use o estilo GNU. 1TBS até o fim.
- Você não pode ' fazer algo pior do que dois níveis de indentação por bloco, exceto no estilo lisp, é claro, isso nem é preciso dizer.
- +1 para o link em estilos de chaves. Isso mostra que qualquer que seja o seu estilo, muitas pessoas excelentes discordam de você.
- @RobertHarvey Não há trabalho extra, se houver, você não ' usar o ferramenta certa para escrever código ou não configurá-lo direito. O benefício é um código muito mais legível, você vê cada erro no colchete muito rápido e pode ler facilmente apenas o código enquanto ignora os subblocos.
Resposta
Segundo exemplo, sou muito grande em legibilidade. Não suporto olhar se bloqueia de outra forma = (
Comentários
- Pesquisas indicam que ' é mais fácil de ler código compacto quando uma base de código excede a altura da tela.
- @ weberc2 , você poderia fornecer DOIs para esses trabalhos de pesquisa?
Resposta
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
Nesse caso, você diagnosticou o problema primeiro?
Não me importo muito com preferências pessoais (há muitos outros estilos, incluindo whitesmith e al.) e eu não me importo muito … contanto que não prejudique minha capacidade de ler o código e depurar isso.
A s para o argumento “desperdício de espaço”, eu não acredito: eu tendo a adicionar linhas em branco entre grupos lógicos de qualquer maneira para tornar o programa mais claro …
Comentários
- Ambos são fáceis de depurar, principalmente porque são ' um pequeno bloco de código. A indentação é consistente, facilitando a visualização dos blocos de código reais.
- @Htbaa: de fato 🙂 Então, por que se preocupar?
- @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 estão relacionadas, mas claramente não são ' t. As linhas em branco são para separar bits de código não relacionados; código que ' está perto de outras linhas de código significa que eles estão de fato relacionados. Isso tudo é ' imo ' é claro, mas eu me perguntei qual era o seu ponto. EDITAR: também qualquer IDE adequado notará qualquer chave faltando e lhe dará um punhado de erros ao interpretar seu código.
- Eu gostaria de apontar que essas duas seções de código são completamente diferentes. Você teria erros do compilador em diferentes pontos do código. O primeiro teria um erro do compilador em " else " e o último encaracolado. O segundo teria apenas um erro do compilador na última curva.
Resposta
Não que alguém notará, mas é por isso que as chaves pertencem à mesma linha que a condicional (exceto para condicionais muito longos, mas isso é uma vantagem case):
Em C, esta é uma construção válida:
while(true); { char c; getchar(); //Wait for input }
Rápido! O que este código faz? Se você respondeu ” loop infinito pedindo entrada “, você está errado! Ele nem chega à entrada. Ele é detectado em while(true)
. Observe o ponto-e-vírgula no final.Esse padrão é na verdade mais comum do que deveria ser; C requer que você declare suas variáveis no início de um bloco, e é por isso que um novo foi iniciado.
Uma linha de código é uma ideia. Chaves são uma parte do pensamento que contém a condicional ou loop. Portanto, eles pertencem à mesma linha.
Comentários
- Este é de longe o melhor argumento para o estilo K & R que eu vi, o resto é ridículo com hoje ' s Sistemas IDE com suporte para dobramento de código. Isso se aplica apenas a linguagens de estilo C que suportam
;
extremidades de bloco. É também por isso que eu desprezo esse sistema de finalização de bloco que IMHO está desatualizado e a linguagem Go prova isso. Já vi esse problema muitas vezes, embora não neste cenário. Geralmente acontece quando eles pretendem adicionar algo à declaração e esquecer.
Resposta
Eu gosto do primeiro método. Parece IMO mais limpo e é mais compacto, o que eu gosto.
EDITAR: Ah, um terceiro. Eu gosto desse mais quando possível, pois é ainda menor / mais limpo.
Resposta
Você pode escrever:
you.hasAnswer() ? you.postAnswer() : you.doSomething();
Para Responda à pergunta; Eu costumava preferir chaves em sua própria linha, mas, para evitar ter que pensar em bugs de inserção automática de ponto e vírgula em navegadores, comecei a usar o estilo egípcio para javascript. E ao codificar java no eclipse, não tive interesse em lutar (ou configurar) o estilo de chave padrão, então optei pelo egípcio nesse caso também. Agora estou bem com ambos.
Comentários
- para serem usados assim,
postAnswer()
edoSomething()
deve retornar o valor para o operador ternário, o que geralmente não é o caso: eles podem muito bem retornar nulo (sem valor). e também (pelo menos em c #) o resultado de?:
deve ser atribuído a alguma variável
Resposta
Quase todas as respostas aqui estão algumas variações sobre “Faça o que fizer, fique com um ou dois”.
Então pensei sobre isso por um momento e tive que admitir que não vejo isso como importante . Alguém pode me dizer honestamente que o seguinte é difícil de seguir?
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 sobre ninguém … mas não tenho absolutamente nenhum problema mental alternando entre os estilos. Levei alguns minutos para descobrir o que o código fazia, mas isso é o resultado de eu apenas digitar aleatoriamente a sintaxe C-like. 🙂
Na minha opinião não tão humilde, abrir colchetes é quase completamente irrelevante para a legibilidade do código. Existem alguns casos extremos listados acima em que um estilo ou outro faz diferença, mas na maioria das vezes, o uso criterioso de linhas em branco limpa isso.
FWIW, nossos estilos de codificação no trabalho usam um pouco forma 1 mais estruturada e 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 fortemente a forma 2 encontrariam esta versão da forma 1 melhor, apenas porque a linha em branco oferece uma separação visual mais forte.
Comentários
- Como mostra seu exemplo, o recuo é muito importante do que colchetes para leitura de fato, algumas linguagens tornam o recuo a única maneira de aninhar declarações!
- Ok, honestamente, acho seu exemplo inconsistente difícil de ler. Não MUITO difícil, mas mais difícil do que se eram consistentes.
- Eu concordo com o 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 " toy " exemplos que as pessoas dão, é claro que há pouca diferença. Em minha experiência, quando eu herdei um código desagradável de outra pessoa e ela usou o método 1, com frequência torna-se necessário ir em frente e transformá-lo no método 2 apenas para poder seguir a lógica. Pelo fato de que freqüentemente se torna necessário; ele responde automaticamente à pergunta sobre qual método é melhor e mais fácil de entender.
- @Dunk: Não consigo imaginar código que seria visivelmente melhorado trocando esses detalhes irrelevantes.
- @jkerian -Aparentemente, você ' t herdou muito código de outras pessoas que há muito deixaram o projeto ou a empresa. Não consigo ' imaginar que ninguém com alguns anos de experiência não tenha encontrado essa situação. Mas, novamente, a situação de trabalho de todos ' é diferente. Além disso, se você tiver que fazer " formal " revisões de código, a formatação fará uma grande diferença. Ser capaz de ler o código naturalmente é muito importante.Claro que posso fazer uma pausa e pensar para combinar as chaves, mas isso retarda o processo. Uma maneira não requer pausa, as outras sim. É ' por isso que eu não ' não vejo por que qualquer outra escolha poderia ser recomendada.
Resposta
Estou surpreso que ainda não tenha sido mencionado. Eu prefiro a segunda abordagem porque permite que você selecione o bloco mais facilmente.
Quando as chaves começam e terminam na mesma coluna e em sua própria linha, você pode selecionar na margem ou com o cursor na coluna 0. Isso geralmente resulta em uma área mais generosa com a seleção do mouse ou menos pressionamentos de tecla com seleção de teclado.
Originalmente, trabalhei com colchetes na mesma linha do condicional, mas quando mudei, descobri que isso acelerou a taxa de trabalho. Não é dia nem noite, é claro, mas é algo que o deixará um pouco mais lento trabalhando com colchetes ao lado de suas condicionais.
Comentários
- Antigos cronômetros como eu usam três pressionamentos de tecla para selecionar o bloco, não importando onde as chaves estejam.
Resposta
Eu pessoalmente gosto da segunda maneira.
No entanto, a maneira que vou demonstrar é, na minha opinião, a melhor, porque resulta em maior segurança no emprego! Um colega estudante de minha universidade me pediu ajuda com seu dever de casa e é assim que seu código se parecia. O programa inteiro parecia um único bloco. O interessante é que 95% dos bugs no programa que ele fez vieram de chaves incompatíveis. Os outros 5% eram óbvios quando as chaves eram combinadas.
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);
Comentários
- Ruim, ruim , Quero dizer exemplo terrível, terrível. O problema não são os aparelhos! É ' é o recuo maluco!
- @Martinho Fernandes Eu pensei que colocar colchetes e recuo andam juntos …
- não necessariamente. .. fazer o recuo adequado no acima e, em seguida, alternar aleatoriamente os estilos de chaves, você ' descobrirá que ' é compreensível.
- Na verdade, pensar sobre isso motivou minha própria resposta a esta pergunta.
- " 95% dos bugs no programa que ele criou vieram de colchetes incompatíveis " – somente em linguagens interpretadas, não compiladas.
Resposta
Minha preferência pessoal é pelo primeiro método, provavelmente porque foi assim que aprendi PHP.
Para declarações if
de uma linha, Vou usar
if (you.hasAnswer()) you.postAnswer();
Se não for you.postAnswer();
, mas algo um muito mais tempo, como you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
Provavelmente voltarei ao fi primeiro digite:
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 um else
declaração.
if (you.hasAnswer()) you.postAnswer(); else you.doSomething()
é uma possibilidade teórica, mas não uma que eu jamais usaria. Isso teria que ser transformado em
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Resposta
Eles não deveriam; primeiro método para mim.
Quando eu olho para o segundo, por causa das linhas não utilizadas (aquelas que têm apenas colchetes, exceto a última chave de fechamento), parece que ele quebra a continuidade de o código. Não consigo ler tão rápido porque preciso dar atenção especial às linhas vazias que geralmente significam uma separação no propósito do código ou algo assim, mas em nenhum caso “esta linha pertence a uma chave” (que apenas repete o significado de recuo).
De qualquer forma, assim como quando você escreve um texto … adicionar um recuo no início de um parágrafo é supérfluo se houver uma linha em branco antes dele (sinal duplo de mudança de parágrafo), não há necessidade de desperdiçar linhas por colchetes quando estamos recuando corretamente.
Além disso, como já foi dito, ele permite ajustar mais código na tela, o que de outra forma é um pouco contraproducente.
Resposta
Depende da plataforma / linguagem / 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(); } }
Odeio quando os caras do Java usam seu estilo em código C # e vice-versa.
Comentários
- O estilo C al maneiras me irritaram. Seja consistente!
Resposta
Tudo que posso dizer é que se você é fã do método # 3 , você será perseguido por todos os formatadores de código IDE do mundo.
Resposta
Eu uso o primeiro método simplesmente porque é mais compacto e permite mais código na tela. Eu mesmo nunca tive problemas com o par de colchetes (sempre os escrevo, junto com a instrução if
antes de adicionar a condição , e a maioria dos ambientes permite que você pule para a chave correspondente).
Se você realmente precisou emparelhar os colchetes visualmente, eu preferiria o segundo método. No entanto, isso permite menos código de uma vez, o que exige que você role mais. E isso, pelo menos para mim, tem um impacto maior na leitura do código do que ter colchetes bem alinhados. Eu odeio rolar. Então, novamente, se você precisar rolar por uma única instrução if
, provavelmente é muito grande e precisa de refatoração.
Mas; o mais importante de tudo é a consistência. Use um ou outro – nunca os dois!
Resposta
Quando eu estava aprendendo programação pela primeira vez aos 12 anos, coloquei os colchetes a próxima linha porque os tutoriais de codificação da Microsoft são assim. Também recuei com TABS de 4 espaços naquela época.
Depois de alguns anos, aprendi Java e JavaScript e vi mais código de chaves na mesma linha, então mudei. Também comecei a recuar com ESPAÇOS de 2 espaços.
Comentários
- +1, -1. Por que você NÃO recuaria com tabulações, já que qualquer editor pode ajustar o comprimento da tabulação para seu tamanho arbitrário? Caso contrário, você lidera muitos de nós que gostam de recuos verdadeiros em 8 para amaldiçoar seu código.
Resposta
Existe uma 4ª opção que mantém as chaves alinhadas, mas não desperdiça espaço:
if (you.hasAnswer()) { you.postAnswer(); i.readAnswer(); } else { you.doSomething(); }
O único problema é que a maioria dos autoformatadores IDE engasga com isso.
Comentários
- … assim como a maioria dos programadores que engasgariam com isso.
- Isso parece horrível. Pense no esforço extra que você precisa fazer se quiser inserir uma linha no topo ou remover a linha superior. Você não pode ' apenas excluir a linha e seguir em frente, você deve se lembrar para inserir novamente a chave.
- lol isso é incrível! 🙂 melhor do que o primeiro estilo!
- Aparentemente, tem até um nome. O Horstman Syyle é mencionado na wikipedia . Eu ' trabalhei com uma base de código como isso, ' não é ruim para usar.
Resposta
Tudo depende de você, contanto que você não esteja trabalhando em um projeto onde alguns restrições de codificação ou alguns padrões foram definidos pelo gerente de projeto que todos os programadores que estão trabalhando naquele projeto devem seguir durante a codificação.
Eu pessoalmente preferiria o primeiro método.
Além disso, não entendi o que você quer mostrar pelo terceiro método?
Não é um jeito errado? Por exemplo, considere uma situação como ..
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
E se alguém quiser adicionar mais algumas declarações no if bloquear?
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();
Comentários
- Ainda pior seria se alguém viesse e fizesse: if (you.hasAnswer ()) you.postAnswer (); else you.doSomething (); you.doSomethingElse (); – é ' uma receita para bugs sutis que o olho pode facilmente escorregar e o compilador ' não ajuda também
- @FinnNk: Exatamente!
- Se alguém quiser adicionar outra afirmação, pode colocar os próprios colchetes. Qualquer programador que se preze realmente deve ser capaz de descobrir isso.
- Eu queria dizer que seu terceiro método está errado.
- @Robert Harvey, I ' vimos codificadores muito experientes deixarem de adicionar colchetes ao modificar o código existente. Acho que o problema é que o recuo é uma pista muito mais forte para o significado do que os colchetes (especialmente porque existem vários estilos de colchetes), então ' é muito fácil ignorar o colchete ausente se o o recuo parece com o que você espera.
Deixe uma resposta