Personalmente no escribo un montón de comentarios, pero los tipos más comunes de los comentarios que hago escritura son:
- (croquis) pruebas de que mi código es correcto
- explicaciones de por qué no acaba de hacer lo obvio (e.g: se requirió optimización, la API que estoy llamando es sorprendentemente engañosa, la "cosa obvia" condujo a una falla sutil)
- una descripción de la entrada de borde-caja que requiere un manejo especial, lo que explica por qué el código de manejo especial aparece
- una referencia al requisito o especificación que exige el comportamiento implementado por una línea de código particular
- descripción de nivel superior de una serie de pasos realizados: ("primero obtener la entrada", "ahora quitar la envoltura" , "finalmente analizarlo"), que no son necesarios si los nombres de las funciones solicitadas para cada paso están bien elegidos y no tienen ambigüedad en el contexto, pero no voy a escribir un contenedor de do-nothing para una función genérica solo para darle un nombre más específico para un solo uso
- documentación que se extraerá automáticamente. Esta es una gran proporción de comentarios por volumen, pero no estoy seguro de que "realmente cuente".
- cosas que podrían ser ser parte de la interfaz documentada, pero no es porque necesiten cambiar en el futuro, o porque son elementos internos que los externos no necesitan. Por lo tanto, es útil para el implementador tener en cuenta, pero no para el usuario. Las invariantes de clases privadas se incluyen en esto: ¿realmente desea leer toda la clase cada vez que quiera confiar en "este miembro no es nulo", o "el tamaño no es mayor que la capacidad" o "acceso a este miembro"? debe estar sincronizado "? Es mejor verificar la descripción del miembro antes de asignarlo, para ver si está autorizado. Si alguien no tiene la disciplina para evitar romper un invariante claramente comentado, bueno, no es de extrañar que todos sus comentarios sean incorrectos ...
Algunas de estas cosas se manejan mediante pruebas exhaustivas, en el sentido de que si las pruebas pasan y el código es correcto (hah), si tienes el código de prueba abierto también puedes ver los casos de entrada especiales, y si algún tonto oculta los comentarios, comete el mismo error que yo originalmente y vuelve a generar mi código para hacer lo obvio, entonces las pruebas fallarán. Eso no significa que los comentarios no lo manejen mejor, en el contexto de la lectura a través del código. En ninguno de estos casos, leer el comentario es un sustituto para leer el código, están diseñados para resaltar lo que es importante pero no obvio.
Por supuesto, en el caso de los documentos automáticos, es perfectamente razonable, y probablemente más útil, ver la documentación por separado.
Al depurar, en lugar de realizar cambios, es manera más valioso para que el código se explique. Los comentarios son menos útiles, especialmente las invariantes privadas, porque si estás depurando, hay una posibilidad razonable de que quien escribió el código + comentarios cometió un error, por lo que los comentarios pueden ser incorrectos. En el lado positivo, si ve un comentario que no refleja lo que hace el código, hay una posibilidad razonable de que haya encontrado un error. Si solo ves lo que hace el código, puede pasar un tiempo antes de que te des cuenta de que lo que hace el código no es lo que se supone que debe hacer.
A veces un buen nombre ayuda mucho a reemplazar los comentarios. Sin embargo, los nombres pueden ser tan engañosos como los comentarios si son incorrectos. Y, seamos sinceros, con frecuencia los nombres son al menos ligeramente engañosos o ambiguos. Dudo que el autor de esa publicación en el blog llegue al extremo de reemplazar todos los nombres con "var1, var2, func1, func2, class1, class2 ...", solo para asegurarse de que no estén distraídos por el autor original. intenciones incorrectas para el código. Y no creo que sea más cierto decir que "los comentarios siempre son incorrectos" que decir que "los nombres de variables siempre son incorrectos". Están escritos por la misma persona al mismo tiempo con el mismo propósito.
+1 Gracias por los comentarios y la referencia a un código base masivo y público como punto de referencia. Además, dado que hace referencia a PostgreSQL, que parece usar GIT, ¿recibe comentarios de vinculación de soporte para el código y permite un control que requiere que los comentarios se firmen como vigentes si se actualiza el código relacionado? ¡Gracias! – blunders
Acaban de mudarse a GIT hace un mes o dos desde CVS. Cuando una persona comete cambios de código, es responsable de que los comentarios sobre la función estén actualizados con el código real. Los informes de errores se pueden archivar contra código, comentarios y documentos. –
Gracias por la aclaración, lo que esperaba, pero solo quería asegurarme. Seleccionándote como la respuesta. – blunders