Estilos de documentação de comentários / no código

9

Esta pode ser uma pergunta estúpida, mas está na minha cabeça há um tempo e não consigo encontrar uma resposta decente em nenhum outro lugar.

Eu tenho um professor que diz que devemos listar explicitamente cada parâmetro com uma descrição, mesmo se houver apenas um. Isso leva a muita repetição:

double MyFunction(const int MyParam);
// Function: MyFunction
// Summary: Does stuff with MyParam.
// Input: int MyParam - The number to do stuff with.
// Output: MyParam with stuff done to it.

Ao escrever a documentação em código, você é detalhado?

Maxpm
fonte
seu exemplo é simplista. Na prática, você especificaria muito mais restrições do que apenas o tipo do parâmetro, se for um int, deve ser um número inteiro com os valores X e Y. Se o valor de retorno for um duplo, você poderá especificar o quão preciso é e como podem ser os valores (pode existir uma função que retorne exatamente 1,01, 2,31 e 5,01!). Seja mais específico e você não vai ver tanta repetição ...
Rudolf Olah

Respostas:

17

Para iniciantes, concordo que a linha "Function:" no seu exemplo é completamente redundante. Também foi minha experiência que as pessoas ensinaram na escola a adicionar esse tipo de comentário e continuar adicionando esse tipo de comentário em seu código de produção.

Bons comentários não repetem o que está no código. Eles respondem à pergunta "Por quê?" em vez de "o quê?" ou como?" Eles cobrem as expectativas sobre as entradas, bem como como o código se comportará sob certas condições. Eles abordam por que o algoritmo X foi escolhido em vez do algoritmo Y. Em resumo, exatamente as coisas que não seriam óbvias para outra pessoa 1 ao ler o código.


1: Alguém mais familiarizado com o idioma em que o código está escrito. Não escreva comentários para ensinar, comente para complementar as informações.

Larry Coleman
fonte
11
+1, embora lembre-se de que o que é óbvio para você pode não ser óbvio para outro programador.
Josh K
@ Josh: bom ponto, então eu editei a resposta.
Larry Coleman
@ Larry: Bons comentários também devem incluir o que: o que entra, o que sai e, especialmente, que tipo entra e sai.
Joris Meys
@Joris: O que entra e sai é coberto por "expectativas sobre insumos" e "como o código se comportará". Quanto ao tipo de entrada e saída, eu mantenho o que disse anteriormente: "Bons comentários não repetem o que está no código".
Larry Coleman
2
@ Larry: Eu prefiro ler no comentário do que ter que passar pelas declarações e pelo código toda vez que eu quiser reutilizar uma função. Uma questão de estilo, eu acho, sou um cara preguiçoso.
Joris Meys
6

Várias linguagens possuem recursos de geração de documentos API como Ruby, Java, C # e C ++ (por meio de uma ferramenta de linha de comando). Quando você pensa dessa maneira, torna a escrita dos documentos da API muito mais importante. Afinal, ele responde à pergunta "como eu faço ...?" Portanto, não farei nada repetitivo como Function: MyFunctionquando o nome da função é claro para todo mundo ver. As ferramentas de geração de documentos da API são inteligentes o suficiente para fazer isso por mim. No entanto, os seguintes detalhes são úteis, particularmente em métodos / funções públicos:

  • Resumo (o que faz e, quando relevante, um resumo de como usá-lo)
  • Lista de parâmetros e o que é esperado
  • Qual será o valor de retorno (saída)
  • Quaisquer exceções que possam ser lançadas explicitamente e por que

Elas podem se tornar ferramentas de referência úteis quando você está tentando depurar código. Muitos IDEs também usarão os documentos da API nas dicas de ferramentas à medida que você passa o mouse sobre o nome da função.

Se é um idioma sem esses recursos, os comentários ajudam, mas não tanto.

Berin Loritsch
fonte
É aceitável se a descrição da saída estiver incluída no resumo? Por exemplo, Returns the square root of Xtambém descreve qual é o valor de retorno.
Maxpm
Sim; o que os alunos devem aprender é usar esses recursos de documentação.
Jeremy
Eu gosto de manter os documentos da API mais abstratos, se possível. Por exemplo, Returns the color for this rayou Returns the requested Message, or null if it can't be found. Mas sim, o resumo é a base dos documentos da API.
Berin Loritsch 6/12/10
3

Se for um método público de API, sim, você deve fornecer documentação detalhada, especialmente sobre parâmetros e comportamento esperado. Muitas pessoas acham que isso pode ser relaxado para métodos / funções particulares, YMMV.

No geral, prefiro escrever código limpo (pequenos métodos / funções que fazem uma coisa e uma coisa bem) com nomes de variáveis ​​sensíveis. Isso faz com que grande parte do seu código se autodocumente. No entanto, certamente sempre documento casos extremos, usos de simultaneidade e algoritmos complexos.

Em resumo, pense em si mesmo como um pouco pior para o desgaste às 3 da manhã, daqui a três meses. Você agradecerá seus documentos públicos impressionantes, em vez de descobrir o que significa parâmetro (sinalizador booleano) ...

Martijn Verburg
fonte
Às vezes, as funções podem ter um comportamento de canto diferente do que o algoritmo implicaria. Por exemplo, arredondar a floatpara um número inteiro adicionando 0,5 e obtendo o piso do resultado fará com que o maior float abaixo de 0,5 seja arredondado erroneamente. Nesses casos, às vezes pode ser importante distinguir se uma função deve ser definida como arredondamento para o número inteiro mais próximo (ou o próximo número inteiro mais alto quando dois valores possíveis são equidistantes) ou como adicionar 0,5 (possivelmente com uma etapa de arredondamento intermediária) e tomando a palavra do resultado.
supercat 02/02
1

É semelhante à maneira como a maioria das estruturas -Doc analisa a documentação em código (JavaDoc, PHPDoc etc.).

No Java, gerado automaticamente pelo IDE:

/**
 * [Description]
 * @param str [Description]
 * @param isCondition [Description]
 * @return [Description]
 */
public int testFunction(String str, boolean isCondition) {
    ...
}

Este é o mesmo formato usado para gerar a documentação para os recursos de idioma interno - Exemplo: http://download.oracle.com/javase/6/docs/api/java/lang/String.html

Esse formato é bastante útil porque mostra claramente a qualquer usuário de terceiros como fazer interface com seu código. Se suas funções são métodos particulares usados ​​apenas internamente, pode ser um pouco inútil - mas eu acho que seu professor está tentando fazer com que você pratique uma boa prática até que todos tenham experiência em fazer essa distinção.

O único bit que frequentemente acho redundante é a descrição do retorno - geralmente é quase idêntica à descrição do meu método.

Nicole
fonte
1

Há dois propósitos para Comentários:

  1. Eles servem para lembrá-lo rapidamente do que seu código faz quando você volta meses / anos depois. Dessa forma, você não precisa reler e analisar seu código para atualizar sua memória.
  2. Eles transmitem para outras pessoas que podem estar lendo ou trabalhando com seu código o que seu código está fazendo.

É claro que existem muitas maneiras diferentes de abordar isso, mas quanto mais completo e consistente você for, melhor. Os comentários eficazes levam tempo para aprender, assim como a programação eficaz. Lembre-se de que é difícil ver o ponto dos comentários na escola, pois nada em que você está trabalhando é grande o suficiente para realmente justificá-lo, mas eles estão apenas tentando apresentá-lo a você. E, geralmente, a maneira como você ensina a fazê-lo é o estilo de seu professor, e não de qualquer forma qualquer padrão. Desenvolva o que funciona para você. E lembre-se ... existe um comentário estúpido! :) Exemplo:

a += 1; //adds 1 to the value in a

Realmente? Obrigado! ri muito

Kenneth
fonte
0

Eu gosto da documentação do site PHP, então uso algo semelhante nos meus comentários embutidos e na sintaxe do PHPDoc. Veja o exemplo abaixo.

/*
* Finds all the locations where you have access to for this client and returns them in an array .
* @author Radu
* @version 1.0
* @param int $id ( The id of the client for which you're requesting access. )
* @param object $db ( A resource of type Mysql, representing a connection to mysql database, if not supplied the function will connect itself. )
* @return array ( Returns array with id's of locations that you are allowed to see, an empty array if you do not have acces to any locations or returns FALSE and triggers a Warning if any error occuread )
* @use array allowed_locations ( $id [, $db] )
*/
function allowed_locations($id, $db=NULL){ ... }

E, como o @Larry Coleman disse, os comentários incorporados devem dizer por que você fez algum código.

$funcResult = SomeFunction();
if(is_array($funcResult))
{    //Beacause SomeFunction() could return NULL, and count(NULL) = 1
    $c = count($funcResult);
} else {
    $c = 0;
}
if($c == 1)
{
 ... 
}else
{
 ...
}
Radu Maris
fonte
0

Se estiver a serviço da geração do Doc, comentários detalhados (embora irritantes) provavelmente são uma coisa boa. Embora você precise definir como meta da equipe manter-se atualizado sobre os comentários e mantê-los atualizados.

Se for apenas o estilo de comentários, eu teria problemas com isso. Comentários excessivos podem prejudicar o código tanto quanto ajudar. Não consigo contar o número de vezes que encontrei comentários no código que estavam desatualizados e, como resultado, enganosos. Eu geralmente ignoro os comentários agora e me concentro na leitura do código e nos testes do código para entender o que ele faz e qual é a intenção.

Prefiro ter um código claro e não comentado, conciso . Faça-me alguns testes com asserções ou métodos descritivos e estou feliz e informado.

dietbuddha
fonte