As citações de Robert C. Martin são retiradas do contexto. Aqui está a citação com um pouco mais de contexto:
Nada pode ser tão útil quanto um comentário bem colocado. Nada pode confundir um módulo mais do que comentários dogmáticos frívolos. Nada pode ser tão prejudicial como um comentário antigo que propaga mentiras e desinformação.
Comentários não são como a Lista de Schindler. Eles não são "puro bem". De fato, os comentários são, na melhor das hipóteses, um mal necessário. Se nossas linguagens de programação fossem expressivas o suficiente, ou se tivéssemos o talento de manejar sutilmente essas linguagens para expressar nossa intenção, não precisaríamos muito de comentários - talvez nem um pouco.
O uso adequado dos comentários é para compensar nossa falha em nos expressar em código. Observe que eu usei a palavra falha. Eu quis dizer isso. Os comentários são sempre falhas. Devemos tê-los, porque nem sempre podemos descobrir como nos expressar sem eles, mas o uso deles não é motivo de comemoração.
Portanto, quando você se encontrar em uma posição em que precisa escrever um comentário, pense bem e veja se não há uma maneira de virar a mesa e se expressar em código. Toda vez que você se expressa em código, deve dar um tapinha nas costas. Toda vez que você escreve um comentário, deve fazer uma careta e sentir o fracasso de sua capacidade de expressão.
(Copiado daqui , mas a citação original é de Código Limpo: Um Manual do Artesanato em Software Ágil )
Como essa citação é reduzida em "Comentários sempre são falhas" é um bom exemplo de como algumas pessoas tiram uma citação sensata do contexto e a transformam em dogma estúpido.
A documentação da API (como javadoc) deve documentar a API para que o usuário possa usá-la sem precisar ler o código-fonte . Portanto, neste caso, a documentação deve explicar o que o método faz. Agora você pode argumentar que "Recupera um produto por seu ID" é redundante porque já está indicado pelo nome do método, mas as informações que null
podem ser retornadas são definitivamente importantes para o documento, pois isso não é de forma alguma óbvio.
Se você deseja evitar a necessidade do comentário, é necessário remover o problema subjacente (que é o uso null
como um valor de retorno válido), tornando a API mais explícita. Por exemplo, você pode retornar algum tipo de Option<Product>
tipo, para que a própria assinatura de tipo comunique claramente o que será retornado caso o produto não seja encontrado.
Mas, em qualquer caso, não é realista documentar completamente uma API apenas por meio de nomes de métodos e assinaturas de tipo. Use doc-comments para qualquer informação adicional não óbvia que o usuário deva conhecer. Imagine a documentação da API DateTime.AddMonths()
na BCL:
O método AddMonths calcula o mês e o ano resultantes, levando em consideração os anos bissextos e o número de dias em um mês e, em seguida, ajusta a parte do dia do objeto DateTime resultante. Se o dia resultante não for um dia válido no mês resultante, o último dia válido do mês resultante será usado. Por exemplo, 31 de março + 1 mês = 30 de abril. A parte da hora do dia do objeto DateTime resultante permanece a mesma que esta instância.
Não há como você expressar isso usando apenas o nome e a assinatura do método! É claro que a documentação da sua aula pode não exigir esse nível de detalhe, é apenas um exemplo.
Comentários embutidos também não são ruins.
Bad comentários são ruins. Por exemplo, comentários que explicam apenas o que pode ser visto trivialmente no código, sendo o exemplo clássico:
// increment x by one
x++;
Comentários que explicam algo que poderia ser esclarecido renomeando uma variável ou método ou reestruturando o código, é um cheiro de código:
// data1 is the collection of tasks which failed during execution
var data1 = getData1();
Esse é o tipo de comentário contra o qual Martin se opõe. O comentário é um sintoma de uma falha ao escrever um código claro - nesse caso, para usar nomes auto-explicativos para variáveis e métodos. O comentário em si não é, obviamente, o problema, o problema é que precisamos do comentário para entender o código.
Mas os comentários devem ser usados para explicar tudo o que não é óbvio no código, por exemplo, por que o código foi escrito de uma certa maneira não óbvia:
// need to reset foo before calling bar due to a bug in the foo component.
foo.reset()
foo.bar();
Comentários que explicam o que um código excessivamente complicado faz também são cheiros, mas a correção não é proibir comentários, a correção é a correção do código! Na palavra real, código complicado acontece (espero apenas temporariamente até um refator), mas nenhum desenvolvedor comum escreve código limpo perfeito na primeira vez. Quando o código complicado acontece, é muito melhor escrever um comentário explicando o que ele faz do que não escrever um comentário. Esse comentário também facilitará a refatoração mais tarde.
Às vezes, o código é inevitavelmente complexo. Pode ser um algoritmo complicado ou pode comprometer a clareza do código por razões de desempenho. Novamente, comentários são necessários.