Como lidar com a tautologia nos comentários? [fechadas]

54

Às vezes me encontro em situações em que a parte do código que estou escrevendo é (ou parece ser ) tão evidente que seu nome seria basicamente repetido como um comentário:

class Example
{
    /// <summary>
    /// The location of the update.
    /// </summary>
    public Uri UpdateLocation { get; set; };
}

(Exemplo de C #, mas consulte a pergunta como independente de idioma).

Um comentário como esse é inútil; O que estou fazendo errado? É a escolha do nome que está errado? Como eu poderia comentar partes como essa melhor? Devo apenas pular o comentário para coisas assim?

Tamás Szelei
fonte
8
Nota: Eu consideraria "O local da atualização" muito vago, a menos que seja claro o que é "uma atualização". O sistema suporta outros tipos de URIs que não URLs?
34
return result # returns result
Lukas Stejskal
27
A maneira de lidar com a tautologia nos comentários é a maneira de lidar com a tautologia nos comentários. (Este é um comentário.)
Rex Kerr
29
Este não é realmente um comentário, é na verdade documentação escrita na forma de um comentário. Regras diferentes aplicam-se à documentação da API do que aos comentários de código embutidos.
Cody Grey
10
Este é simplesmente um exemplo de documentação ruim da API, não comentários de código. Minha formatação XML do C # para uma propriedade como essa seria algo como "Obtém ou define um Uri que pode ser usado para acessar o servidor de atualização desse objeto".
21712 Kevin Kevin

Respostas:

13

Na maioria dos projetos em que trabalho, não há muito tempo para escrever comentários detalhados sobre cada aluno.

Isso não significa que não há tempo para comentários; pelo contrário, há tempo de sobra para comentários tautológicos que vomitam uma versão reformulada do que está sendo comentado. Eles funcionam muito bem como ponto de partida .

Especialmente considerando o uso de comentários do Visual Studio que acompanha o IntelliSense , é uma boa ideia começar com um pouco de informações sobre o campo:

class Example
{
    /// <summary>
    /// The location of the update.
    /// </summary>
    public Uri UpdateLocation { get; set; };
}

E, à medida que você continua codificando, quando não consegue se lembrar se UpdateLocationfoi o local para o qual a atualização ocorreu ou o local para o qual a atualização está sendo enviada, você deverá revisar o código. É nesse ponto que você deve adicionar essas informações adicionais:

class Example
{
    /// <summary>
    /// The Uri location where the update took place.
    /// </summary>
    public Uri UpdateLocation { get; set; };
}

Se outro programador perguntar sobre detalhes em um campo, atualize os comentários com essas informações:

Que tipo de atualização deve Example.UpdateLocationser usada para armazenar?

class Example
{
    /// <summary>
    /// The Uri location where the Foo update took place.
    /// </summary>
    public Uri UpdateLocation { get; set; };
}

Assim como um programa tem bugs, bons comentários têm bugs que precisam ser resolvidos iterativamente. O objetivo dos comentários é ajudar a entender o código quando você o revisita seis meses depois e não consegue se lembrar de nada sobre como o programa funciona.

E, assim como a programação, seus comentários precisam começar em algum lugar. Os comentários tautológicos são os Hello World!comentários, à medida que você pratica a redação e atualização de documentação, sua documentação inicial se torna cada vez mais resistente.

zzzzBov
fonte
+1 por ser a única pessoa a realmente fazer um comentário alternativo; ao invés de apenas respostas tautológicas.
Ian Boyd
Esta é realmente a melhor resposta até agora.
Roland Tepp
11
No meu projeto atual, fui atingido mais do que posso contar pela falta de comentários em uma grande base de código herdada. Algo Você, como autor, acha que é um nome de método descaradamente autoexplicativo para algo que você considera uma funcionalidade bastante óbvia, pode não ser tão auto-documentável em três meses para outro desenvolvedor. A documentação sobre métodos, propriedades e campos deve tentar contextualizar a imagem em geral, e essa resposta explica o melhor processo para atingir esse objetivo, que vi até agora.
Roland Tepp
11
@RolandTepp, compreendo perfeitamente de onde você vem. E eu concordo completamente. O problema que vejo é que muitos programadores veem comentários e documentação como algo que acontece depois que o código está completo e pronto para ser enviado, e não como algo que acontece com o código como parte do processo de desenvolvimento, exigindo rastreamento de bugs e horas de suporte junto com o restante do código.
ZzzzBov
54

Os comentários nunca devem duplicar seu código. Os comentários não devem responder à pergunta " como? ", Mas apenas " por quê? " E "o quê? ". Por que esse algoritmo é escolhido, quais são as suposições implícitas aqui (a menos que seu idioma seja poderoso o suficiente para expressá-lo com sistema de tipos, contratos e similares), qual é o motivo para fazer isso, etc.

Eu recomendo dar uma olhada na prática de programação alfabética para obter uma inspiração.

SK-logic
fonte
+1 - esta é a resposta! Nós não precisamos de comentários como "variáveis Declarar", "Counter Incremento" (em um loop) etc.
ozz
Então, no exemplo do OP, o que seria um bom comentário?
Stijn
4
@ Stijn, eu não sei - é (obviamente) ausente do código. Algo que apenas o autor do código sabe sobre sua finalidade e limitações.
SK-logic
Talvez algum comentário como // Atualize o raiseShielders de acordo com o levelOfAttack (passado como um URL) #
woliveirajr
15
A questão mais importante um comentário deve responder é " WTF? "
naught101
53

Os comentários devem descrever o código, não duplicá-lo. Este comentário do cabeçalho apenas duplica. Deixe isso de fora.

mjfgates
fonte
17
+1: Acho que entendi o que você quer dizer, mas não concordo com o que você disse :-) Tanto quanto possível, o código deve descrever o código, enquanto os comentários devem descrever o seu raciocínio.
Kramii Restabelecer Monica 29/03
3
@ Kramii, infelizmente, o código é incapaz de descrever o código, mesmo se você estiver codificando no Agda. Nenhuma língua é tão poderosa e expressiva quanto a linguagem natural. E muitas vezes você precisará de plotagens, gráficos, tabelas, fórmulas complexas para descrever o código - quase impossível sem uma programação adequada.
SK-logic
6
@ SK-logic: eu discordo. Um método longo é menos autoexplicativo do que um método curto que chama uma série de sub-rotinas bem nomeadas.
Kramii Restabelece Monica
3
@ Kramii, desculpe, não consigo ver o que você discorda e como o seu comentário está relacionado ao que eu disse. O que quero dizer é que muitas informações devem ser fornecidas juntamente com o seu código, que está totalmente ausente do próprio código. Toda a história por trás das decisões que você tomou, todas as referências relevantes aos documentos, etc. - não há elementos de linguagem para expressar essas coisas. E métodos / funções / sub-rotinas longos ou curtos / qualquer coisa que seja totalmente irrelevante aqui.
SK-logic
2
@ SK-logic, o que Kramii diz significa: "O código deve ser fácil de ler e entender" e todos os gráficos etc mencionados estão no que ele diz como: "os comentários devem descrever seu raciocínio"
Shahbaz
36

Deixe-os de fora!

Normalmente, é uma boa prática remover comentários onde as informações expressas neles já estão presentes em outros lugares. Se você pode expressar o objetivo de um método de forma clara e inequívoca, dando-lhe um bom nome, não há necessidade de comentar .

Coloque-os dentro!

Seu exemplo ilustra duas exceções a esta regra:

Primeiro, "UpdateLocation" pode (dependendo do contexto) ser ambíguo. Nesse caso, você precisa dar um nome melhor ou fornecer um comentário para remover a ambiguidade. Melhorar o nome geralmente é a melhor opção, mas isso nem sempre é possível (quando você está implementando uma API publicada, por exemplo).

Segundo, o "///" em C # indica um comentário que se destina a ser usado para gerar automaticamente a documentação. O IDE usa esses comentários para obter dicas de ferramentas, e existem ferramentas (Sandcastle) que podem gerar arquivos de ajuda e assim por diante a partir desses comentários. Como tal, existem argumentos para inserir esses comentários, mesmo que os métodos que eles documentam já tenham nomes descritivos. Mesmo assim, no entanto, muitos desenvolvedores experientes desaprovam a duplicação de informações. O fator decisivo deve ser as necessidades daqueles a quem a documentação se destina.

Kramii Restabelecer Monica
fonte
Esta é a melhor resposta. Você deve descobrir exatamente para que a propriedade será usada quando estiver consumindo a classe Example e passar o mouse sobre a propriedade.
218 Andy Andy
Nessas situações, eu me esforço (e geralmente falho), para adicionar pelo menos uma <remarks/>ou <see/>mais dessas informações para fornecer algum conteúdo adicional. O <summary/>ainda está duplicado, mas o comentário geral não é completamente inútil.
earlNameless
20

Discordo totalmente das respostas "não escreva comentários". Por quê? Deixe-me salientar, mudando um pouco o seu exemplo.

public Uri UpdateLocation ();

Então, o que essa função faz:

  • Ele retorna o "local de atualização"? ou
  • Ele "atualiza" o local e retorna o novo local?

Você pode ver que, sem um comentário, há ambiguidade. Um iniciante pode facilmente cometer o erro.

No seu exemplo, é uma propriedade, portanto os métodos "get / set" revelam que a segunda opção está incorreta e realmente significa "atualizar local" e não "atualizar o local". Mas é muito fácil cometer esse erro, especialmente em casos de palavras ambíguas, como "atualização". Jogue em segurança. Não confunda alguém novo com isso apenas para economizar alguns segundos do seu tempo.

DPD
fonte
4
Eu não acho que alguém esteja advogando, não escreva nenhum comentário. A maioria / todos estão dizendo "escreva comentários apropriados", nos quais o exemplo do UpdateLocation se encaixaria.
ozz
16
Uri UpdateLocation()seria rejeitado pela revisão do código e alterado para um Uri GetUpdateLocation()ou para void UpdateLocation().
avakar
4
@avakar: Concorde com o sentimento, mas como essa é uma propriedade C # (get e set são automaticamente sintetizadas e têm o mesmo nome) renomear GetUpdateLocationresultaria em código como GetUpdateLocation = somelocation. LocationOfUpdateseria um nome melhor, o que remove a ambiguidade. O problema básico é que o OP usou um prefixo de verbo em vez de um substantivo. Presume-se que verbos iniciais indiquem a ação de um método.
Ant
2
@DPD, "Quanto tempo e esforço são necessários para conectar uma linha" quanto esforço é necessário para mantê-lo? Quanto de tela desperdiça? Quanto tempo gasta quando finalmente fica fora de sincronia com o código e começa a confundir os desenvolvedores?
avakar 30/03/12
11
O método retorna um valor e possui um nome de frase verbal. Este é o problema. Deve ter um nome de frase substantiva. por exemplo, 'Uri LocationOfUpdate ()'. Não é GetUpdateLocation, você diz "qual é o seu GetLocation?"?
Ctrl-alt-delor 30/03/12
14

/// <summary>blocos são usados ​​para gerar documentação para IntelliSense e documentação da API .

Portanto, se essa é uma API voltada para o público, você deve sempre incluir pelo menos um <summary>comentário, mesmo que o objetivo da função seja evidente para os leitores.

No entanto, essa é a exceção à regra; em geral, lembre-se de secar (não se repita) .

Peter Mortensen
fonte
5

Preencha comentários como esse apenas se você souber como se beneficiaria de coisas assim; caso contrário, apenas limpe-os.

Para mim, o caso de benefício claro foi quando houve uma verificação automatizada para a falta de comentários e eu estava usando essa verificação para detectar código onde informações importantes precisavam ser preenchidas; por isso, estava preenchendo alguns espaços reservados - apenas para garantir que o relatório da ferramenta não contenha "alarmes falsos".

Eu acho que sempre existe uma maneira de evitar duplicação flagrante . Ao longo dos anos, comecei a usar alguns "preenchimentos de modelo" para casos como o seu - principalmente como nome auto-descritivo e veja acima .

Para este exemplo em particular, eu usaria algo de "tipo auto-descritivo" (assumindo que não seja o caso em que a eliminação faria o trabalho), assim:

class Example
{
    /// <summary>
    /// Self descriptive method name.
    /// </summary>
    public Uri UpdateLocation { get; set; };
}

Um exemplo em que eu poderia usar os preenchimentos de tipo acima seria comentários Javadoc que exigem campos dedicados para retornar valor, parâmetros e exceções. Freqüentemente, acho que faz mais sentido descrever a maioria ou mesmo todos eles em uma única frase resumida, método que retorna <descreva o que é retornado> para parâmetros fornecidos <descreva parâmetros> . Em casos como esse, preencheu os campos formalmente obrigatórios com a simples vista acima , apontando o leitor para a descrição resumida.

mosquito
fonte
3

Aqui está uma pergunta que eu gostaria de me perguntar quando pensava em adicionar um comentário a uma seção do código: O que posso transmitir que ajudaria a próxima pessoa a entender melhor a intenção geral do código, para que eles possam atualizar, corrigir ou estendê-lo mais rápido e mais confiável?

Às vezes, a resposta correta para essa pergunta é que não há muito o que você pode adicionar nesse ponto do código, porque você já selecionou nomes e convenções que tornam a intenção o mais óbvia possível. Isso significa que você escreveu um código sólido de auto-documentação e que a inserção de um comentário provavelmente prejudicaria mais do que ajudaria. (Observe que comentários redundantes podem realmente prejudicar a confiabilidade do código ao longo do tempo, diminuindo a sincronização com o código real ao longo do tempo e dificultando a decifração da intenção real.

No entanto, em quase qualquer programa e em qualquer linguagem de programação, você encontrará pontos em que certos conceitos e decisões críticas tomadas pelo programador original - por você - não serão mais aparentes no código. Isso é inevitável porque um bom programador sempre programa para o futuro - ou seja, não apenas para fazer o programa funcionar uma vez, mas para fazer todas as suas muitas correções e versões futuras e extensões e modificações e portas e quem sabe o que fazer também funcionam corretamente. Esse último conjunto de metas é muito mais difícil e requer muito mais pensamento para se sair bem. Também é muito difícil expressar bem na maioria das linguagens de computador, que são mais focadas na funcionalidade - ou seja, em dizer o que isso faz. A versão do programa precisa ser executada no momento para torná-lo satisfatório.

Aqui está um exemplo simples do que quero dizer. Na maioria dos idiomas, uma pesquisa rápida em linha de uma pequena estrutura de dados terá complexidade suficiente para que alguém que a veja pela primeira vez provavelmente não reconheça imediatamente o que é. Essa é uma oportunidade para um bom comentário, porque você pode adicionar algo sobre a intenção do seu código que um leitor posterior provavelmente apreciará imediatamente como útil para decifrar os detalhes.

Por outro lado, em idiomas como o Prolog, baseado na lógica, expressar a pesquisa de uma pequena lista pode ser tão incrivelmente trivial e sucinta que qualquer comentário que você possa adicionar seria apenas ruído. Portanto, bons comentários são necessariamente dependentes do contexto. Isso inclui fatores como os pontos fortes do idioma que você está usando e o contexto geral do programa.

A linha inferior é esta: pense no futuro. Pergunte a si mesmo o que é importante e óbvio para você sobre como o programa deve ser entendido e modificado no futuro. [1]

Para aquelas partes do seu código que são realmente autodocumentadas, os comentários apenas adicionam ruído e aumentam o problema de coerência para versões futuras. Portanto, não os adicione lá.

Mas para as partes do seu código em que você tomou uma decisão crítica de várias opções, ou onde o código em si é complexo o suficiente para que sua finalidade seja obscura, adicione seu conhecimento especial na forma de um comentário. Um bom comentário nesse caso é aquele que permite que algum programador futuro saiba o que deve ser mantido o mesmo - esse é o conceito de uma afirmação invariável, aliás - e o que é bom mudar.


[1] Isso vai além da questão dos comentários, mas vale a pena mencionar: Se você acha que tem uma idéia muito clara de como seu código pode mudar no futuro, provavelmente deve pensar além de apenas fazer um comentário e incorporar esses parâmetros dentro do próprio código, pois quase sempre será uma maneira mais confiável de garantir a confiabilidade de versões futuras do seu código do que tentar usar comentários para orientar uma futura pessoa desconhecida na direção certa. Ao mesmo tempo, você também deseja evitar a generalização excessiva, já que os humanos são notoriamente ruins em prever o futuro, e isso inclui o futuro das mudanças no programa. Portanto, tente definir e capturar dimensões razoáveis ​​e comprovadas do futuro em todos os níveis do design do programa, mas não

Terry Bollinger
fonte
3

No meu próprio código, deixarei com frequência tautologias de comentários, incluindo as particularmente notórias, como:

<?php
// return the result
return $result;
?>

... que obviamente contribuem pouco em termos de tornar o código mais compreensível de uma perspectiva explicativa.

Na minha opinião, porém, esses comentários ainda têm valor, se ajudarem a manter a consistência visual dos padrões de cores em seu marcador de sintaxe .

Penso no código como tendo uma estrutura muito semelhante ao idioma inglês, na medida em que existem "sentenças" e "parágrafos" (mesmo que um "parágrafo" possa consistir inteiramente em uma única "sentença"). Normalmente, incluo um resumo de quebra de linha e uma linha acima de cada "parágrafo". Por exemplo:

<?php
//get the id of the thing
$id = $_POST['id'];

//query the things out of the the database
$things = array();
$result = mysql_query("SELECT * FROM Things WHERE `id` = $id");
while ($row = mysql_fetch_assoc($result)) {
    //create a proper Thing object or whatever
    $things[] = new Thing($row);
}

//return the things
return $things;
?>

(Ignore o código incompleto, as injeções de SQL, etc. Você entendeu.)

Para mim, o comentário final realmente agrega valor ao código, simplesmente porque ajuda a delinear visualmente um "parágrafo" de outro, mantendo um esquema de cores consistente.

chrisallenlane
fonte
Estou tendo dificuldades para fazer com que o destaque da sintaxe funcione na minha resposta aqui. Se algum editor puder vir atrás de mim e fazê-lo funcionar, eu realmente apreciaria, dado que as cores são significativas para o meu argumento.
Chris Allen Lane,
Adicionei Sintaxe, destacando dicas de idioma para você.
Paŭlo Ebermann
2

Os comentários devem ser usados ​​para executar um dos seguintes procedimentos.

  1. Informações para geradores de documentos. Isso não pode ser subestimado, isso é extremamente importante.
  2. Avisos sobre por que um pedaço de código é o que é e quais outras considerações. Eu lidei com o código escrito em 2 linguagens de programação. Uma parte importante disso era ter uma estrutura comum entre os dois idiomas. Um comentário nos dois locais informando ao usuário que, se alterar esse número, ele também precisará alterar outro, é extremamente útil.
  3. Escreva notas para explicar por que um código particularmente estranho é o que é. Se você tiver que pensar em como fazer com que um pedaço de código funcione de uma maneira específica, e a solução não seja evidente desde o início, provavelmente vale uma explicação sobre o que você estava tentando fazer.
  4. Rotular entradas / saídas, se não estiverem claras. É sempre bom saber quais são as suas entradas e em que formato elas estão.

Os comentários não devem ser usados ​​para fazer o seguinte:

  1. Explique coisas extremamente óbvias. Eu código serra legado uma vez assim: page=0; // Sets the page to 0. Eu acho que qualquer indivíduo competente poderia descobrir isso.
PearsonArtPhoto
fonte
2

Eu removeria a tautologia, mas manteria o comentário, comentaria propriedades e nomes de variáveis, fornecendo um valor de amostra, para que o uso seja claramente entendido:

property UpdateLocation:TUpdateLocation;  // url="http://x/y/3.2/upd.aspx",proto=http

Agora eu sei exatamente o que se passa lá e, pelo comentário, tenho uma ideia clara de como usá-lo.

Warren P
fonte
0

Eu diria que depende do objetivo dos comentários.

Se eles devem ser usados ​​para gerar documentação para uso da equipe que a constrói (ou se são apenas comentários embutidos para explicar as coisas), acho aceitável deixar isso de fora. Pode-se supor com segurança que é auto-explicativo; e quando não é, existem outros membros da equipe por perto que podem explicar. Obviamente, se isso não for evidente para muitas pessoas, você deve adicioná-lo.

Se os comentários gerarem documentação para uma equipe geograficamente distante, eu colocaria toda a documentação lá.

Andy Hunt
fonte
0

Eu acho que esse tópico foi discutido bastante extensivamente sob nomes como "comentários: anti-padrões" ou "os comentários têm cheiro de código?" ( um exemplo ).

Costumo concordar com a ideia geral de que os comentários devem adicionar novas informações, e não duplicadas. Ao adicionar comentários triviais como esse, você está violando DRY e diminuindo a relação sinal / ruído do código. Costumo encontrar comentários de alto nível explicando as responsabilidades, a lógica por trás e o exemplo de uso da classe muito mais útil do que os comentários por propriedade (especialmente os supérfluos).

Pessoalmente, no seu exemplo, eu deixaria um comentário de fora (se realmente não houver nada útil a acrescentar sobre a propriedade).

Daniel B
fonte
0

Se você pode escrever um código que não exija comentários, você conseguiu programar o nirvana !.

Quanto menos comentários seu código exigir, melhor o código!

James Anderson
fonte
3
Isso não é possível (e nunca será). Há sempre um monte de coisas deixadas para trás o código - suposições implícitas, decisões arquitetônicas, longas cadeias de transformações matemáticas acabar em um algoritmo específico, etc.
SK-logic
11
Talvez "Olá, mundo!" é programador nirvana então ...
naught101
: -} - É algo que raramente é alcançado - o ponto é que, se você está tentando encontrar um comentário que agregue significado, fique satisfeito consigo mesmo, pois isso significa que seu código está correto!
James Anderson
0

Um comentário como esse é inútil; O que estou fazendo errado?

Só parece inútil se você já sabe o que UpdateLocationfaz. "Update" aqui é um verbo ou um substantivo adjunto? Ou seja, isso é algo que atualiza o local ou é o local da atualização? Pode-se inferir o último do fato de que UpdateLocationaparentemente é uma propriedade, mas o ponto mais importante é que às vezes não custa declarar explicitamente algo que parece óbvio.

Caleb
fonte
0

À parte a documentação compilada automaticamente, o código deve se documentar, de modo que os comentários devem documentar apenas onde o código não é suficiente para se documentar.

Ando
fonte
-1

"Localização" é meio óbvio, mas "Atualização" pode ser um pouco vago. Se você não pode escrever um nome melhor, pode oferecer mais detalhes no comentário? Atualização de quê? Por que nós precisamos disso? Quais são algumas suposições (é nulo permitido)?

Scott Whitlock
fonte