"// ..." comenta no final do bloco de código depois de} - bom ou ruim? [fechadas]

18

Eu sempre vi esses comentários serem usados:

function foo() {
   ...
} // foo

while (...) {
   ...
} // while

if (...) {
   ...
} // if

e às vezes até

if (condition) {
   ...
} // if (condition)

Eu nunca entendi essa prática e, portanto, nunca a apliquei. Se o seu código é tão longo que você precisa saber qual é esse final }, talvez seja melhor dividi-lo em funções separadas. Além disso, a maioria das ferramentas de desenvolvedores podem saltar para o colchete correspondente. E, finalmente, a última é, para mim, uma clara violação ao princípio DRY; se você alterar a condição, deverá lembrar-se de alterar também o comentário (ou poderá ficar confuso para o mantenedor ou até para você).

Então, por que as pessoas usam isso? Devemos usá-lo ou é uma má prática?

gablin
fonte
No PHP, uso a sintaxe alternativa para estruturas de controleif(condition): ... else: ... endif;
systemovich
@Geoffrey van Wyk - sério? Eu nunca vi alguém usá-los fora dos arquivos de modelo. Eles são extremamente incomuns, mas acho que cada um é seu.
Craige
4
@ Craig: Qualquer construção de linguagem suportada nativamente pelo PHP não é "Extremamente Incompatível" - o interpretador PHP define o que é "padrão".
Billy ONeal
Ada tem marcadores específicos para o final da maioria das construções: if ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;. Acho que ajuda na legibilidade (e é verificado pelo compilador, que não são comentários).
amigos estão dizendo sobre keith thompson

Respostas:

32

Eu diria que se o código é tão longo que você não consegue seguir facilmente o seu aparelho, ele precisa ser refatorado para a maioria dos idiomas.

No entanto, em linguagens de modelo (como PHP), isso pode ser válido, porque você pode ter um grande bloco de HTML que separa o início e o fim da condição ou da estrutura do loop.

Matt Ellen
fonte
5
Ponto completamente válido para PHP, se você estiver usando PHP misturado com HTML. 1 ponto para a Grifinória.
3
Mesmo com o PHP como uma linguagem de modelagem misturada com HTML, você ainda pode recuar. Você também não deve usar chaves quando usando PHP como uma linguagem de templates, mas sim o while(): endwhile;e foreach(): endforeach;construções etc.
Htbaa
9
Realmente não vejo por que você não deveria refatorar o PHP. Provavelmente em outro idioma.
Tom Hawtin - tackline
@Htbaa: Não acredito que uso o PHP esse tempo todo e não sabia disso. Obrigado! Em relação à indentação, prefiro manter o HTML condicional indentado da mesma forma que o restante da página, em vez de estar alinhado com o PHP que a está criando.
Matt Ellen
3
@ Tom: Eu ri, mas sinto-me culpado. : P
17

É um cheiro de código e geralmente uma ressaca do estilo de código antiquado. Antes que a refatoração de IDEs decentes fosse mais difícil e não tão comum como é agora, os métodos eram mais longos e esses comentários existiam para ajudar a navegá-los melhor.

Alva
fonte
15

Essa é uma prática horrível tornada obsoleta por muitos fatores.

  • Os IDEs mais modernos destacam a chave correspondente quando o cursor está em um dos símbolos.
  • Se você estiver codificando de maneira limpa, raramente encontrará um local em que seu método tem mais de 10 linhas.

Percebo que muitos programadores Java têm essa mentalidade, e isso faz com que o código Java pareça realmente sujo e afasta o foco do código e os comentários.

É altamente recomendável não usar isso.


fonte
4
Eu tenho um colega de trabalho (desenvolvedor java) que faz isso. Exceto em vez de // for e // se ele usa // rof e // fi. Isso me deixa louco e ele faz isso em todos os lugares.
Jay
Sim, eu tinha um que insistia nisso. AAAAAGHHHHH.
Rig
2
Isso realmente não tem nada a ver com programadores Java ou Java, e não é algo comum ou padrão de fato fazer quando se programa em Java.
Jesper
1
+1.000 para "é uma prática horrível".
scunliffe
6

O código é lido 10 vezes mais do que está escrito.

Se facilitar a leitura, faça.

Eu também sugeriria a qualquer pessoa que fizesse isso que deveria procurar outras maneiras de facilitar a leitura das coisas. As técnicas de refatoração, suportes em linhas diferentes etc. que outras pessoas mencionaram são boas. Dividir as coisas em diferentes funções, métodos ou classes, para que o código faça comentários pessoais também é bom. Também existem maneiras de eliminar a maioria dos "ifs" e colocar os loops "for" em lugares óbvios, eliminando assim a necessidade de qualquer coisa.

Mas, às vezes as pessoas estão aprendendo. Se isso é algo que eles estão fazendo que realmente torna o código mais legível, incentive-o e também incentive algumas outras práticas. As pessoas que estão aprendendo merecem e se beneficiarão de incentivo, independentemente de como começarem. Dizer "Isso é ruim" não é tão útil quanto dizer "Essa outra coisa é melhor".

Lunivore
fonte
6
Isso é ruim. Mesmo os livros didáticos para iniciantes não fazem essa atrocidade. "O código é lido 10 vezes mais do que está escrito" ... mais uma razão para não desperdiçar o tempo do leitor com esse código.
21420 Thomas Eding
@trinithis E se você tiver uma declaração de 20 casos? Às vezes, você precisa oferecer suporte a 20 opções diferentes, e é melhor reuni-las em um só lugar do que "refatoradas" em algum esquema de tomada de decisão em vários níveis.
quant_dev
Eu acredito que esta é uma prática dos programadores que subestimam os colegas :) de que outros não são mais espertos o suficiente para ler o código, a menos que. Geralmente sou contra essa prática, mas tudo bem se alguém faz isso porque há uma selva de} s que dificulta a leitura. eu não faço isso de qualquer maneira!
Winw
1
@trinithis Não se trata de algo ruim ou não, trata-se de maneiras eficazes de ajudar as pessoas a melhorarem para que elas cresçam com isso. Ser eficaz> estar certo. Também é uma coisa perfeitamente sensata a fazer se, digamos, você estiver refatorando o código legado, que é ainda mais complicado. Às vezes, coisas ruins podem dar melhores passos provisórios e levar a algo ainda melhor que isso.
Lunivore 5/04
1
@ trinithis Desculpe, não consigo entender o que você quer dizer quando está tudo em uma linha como essa. Eu acho que mencionei que também existem outras maneiras de refatorar código que os desenvolvedores que estão fazendo isso podem aprender.
Lunivore
4

Eu tenho uma grande base de código (C ++) cheia desse tipo de coisa:

int Class::AccessorMethod(void)
{
    return privateValue;
}//end AccessorMethod

Para algo tão pequeno, eu diria que isso vai além do "cheiro do código" para o "fedor do código". Especialmente em um IDE, onde posso combinar a chave de fechamento com um pressionamento de tecla para encontrar a chave de abertura. Dado um método mais longo, ainda aceitarei a correspondência entre os comentários do terminal. Tais comentários me distraem e eu costumo pensar neles como barulho.

PSU
fonte
Hum, acho que não recebo parte da formatação deste site; cada chave lá em cima deve estar em sua própria linha, assim como o corpo do método.
PSU
Em C ++, porém, muitas vezes eu abro um espaço para nome anônimo no topo para coisas ocultas de implementação. Então, em algum momento, eu fecho essa chave e é útil saber o que a chave estreita significa aqui.
CashCow 01/03
4

No C ++, existem duas retenções onde isso ainda é útil e o conselho de "dividir seu código" não é necessário:

  1. Para espaços para nome. Um espaço para nome pode abranger um arquivo inteiro, e esse último colchete às vezes pode afastar as pessoas; portanto, é útil adicionar um comentário para indicar que o colchete é útil. Para o estilo de codificação específico da minha empresa, isso é importante porque não recuamos espaços para nome, pois foi decidido que esse recuo apenas desperdiçaria espaço em um arquivo.

  2. Para pares #ifdef / #endif. Às vezes, há muito código para compilação condicional, ele pode se tornar desagradável com o aninhamento, e o editor que usamos frequentemente "de maneira útil" elimina a indentação, de modo que os comentários são úteis durante uma rápida visão geral.

Joris Timmermans
fonte
+1 para o comentário do espaço para nome e os motivos. Essa é a única vez que faço isso e pela mesma razão
#
+ instruções de troca longas.
quant_dev
1

Para mim, o código deve ser confuso para adicionar um comentário como o que você especificou.

Se apenas indicar // Instrução IF. Então você se pergunta por que está lá em primeiro lugar.

TeaDrinkingGeek
fonte
Concordo, parece que uma linha que tem sido comentado, ao invés de uma antiga escola//endif
StuperUser
1

A alternativa para ver o que sua chave está fechando é ter a abertura na mesma coluna que a chave fechada. Acho isso muito mais claro e legível.

O comentário é útil quando normalmente seria difícil rastrear porque a abertura aconteceu há muito tempo. Normalmente, isso deve acontecer apenas para um espaço para nome (particularmente o anônimo em C ++, usado para detalhes de implementação na unidade de compilação). Na maioria dos outros casos, deve ser óbvio o que você está fechando.

CashCow
fonte
1

Isso é em grande parte uma recuperação dos velhos tempos de trabalho em janelas de terminal de 80x24 caracteres, especialmente se você estivesse usando um editor de janelas como o EVE. Mesmo agora, faço a maior parte do meu trabalho em uma sessão de terminal usando o vim, e posso dividir a sessão em três ou quatro sub-janelas, para que eu possa realmente visualizar apenas algumas linhas por vez.

Dito isto, eu nunca realmente me entusiasmei com a convenção, mesmo que ela tivesse salvado meu bacon em mais de uma ocasião. Eu apenas vejo isso como barulho. Se seus loops ou condicionais estão ficando tão grandes, sim, convém refatorar.

John Bode
fonte
0

você basicamente fornece todos os motivos válidos para não usar isso. Todo programador decente deve aplicá-las. Então, por que as pessoas o usam? Porque eles estão fazendo errado e não sabem melhor.

stijn
fonte
erm, explique o voto negativo, por favor. Eu não apenas inventei essa resposta, ela vem de uma experiência da vida real: meu colega que está sentado a alguns metros de mim está programando há mais de dez ouvidos assim e não tinha idéia de por que isso está errado até que eu o expliquei. .
Stijn
Possivelmente foi usado em algum livro, então um monte de gente saiu da faculdade usando? Poderia ter um lugar em um texto introdutório. Também razoavelmente válida em um pré-processador, especialmente em # ifdef / endif incluem guardas
Martin Beckett