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