Parte 1. Introducción...
Parte 8. NombramientoParte 9. Comentarios...

Este artículo es una traducción de parte de la guía de estilo de Google en C ++ al ruso.
Artículo original (fork en github),
traducción actualizada .
Comentarios
Se requieren comentarios para el código (si planea leerlo). Las siguientes reglas describen lo que debe comentar y cómo. Pero recuerde: aunque los comentarios son muy importantes, el código perfecto es autodocumentarse. El uso de nombres "parlantes" para tipos y variables es mucho mejor que los nombres oscuros, que luego deben escribirse en los comentarios.
Comente el código en función de sus siguientes lectores: programadores que necesitan comprender su código. ¡Tenga en cuenta que puede ser el próximo lector!
Estilo de comentario
Use
// o
/ * * / hasta que se viole la uniformidad.
Puede usar
// o
/ ** / , sin embargo
// es mucho preferible. Sin embargo, siempre alinee su estilo de comentario con el código existente.
Comentarios en el encabezado del archivo
Inserte un encabezado de licencia en la parte superior de cada archivo.
Los comentarios en el archivo deben describir su contenido. Si el archivo declara, describe o prueba una abstracción (para la cual ya hay un comentario), no es necesaria una descripción adicional en el encabezado del archivo. De lo contrario, inserte una descripción del contenido en la parte superior del archivo.
Información legal y lista de autores
Cada archivo debe contener información de licencia. El formato de la descripción depende de la licencia utilizada en el proyecto. Cada licencia (Apache 2.0, BSD, LGPL, GPL, etc.) puede tener sus propios requisitos de diseño.
Si realiza cambios significativos en el archivo, considere eliminar la lista anterior de autores. Los archivos actualizados ya no pueden contener una mención de derechos de autor y una lista de autores.
Contenido del archivo
Si
.h declara varias abstracciones, el comentario en el encabezado del archivo generalmente debe describir el contenido del archivo y cómo las abstracciones están relacionadas entre sí. Una, dos oraciones en un comentario suelen ser suficientes. Se firma información más detallada en otro lugar (no en el encabezado del archivo).
No duplique comentarios en archivos
.h y
.cc : los comentarios se vuelven diferentes con el tiempo.
Comentarios de clase
Cada declaración de clase (excepto las muy obvias) debe ir acompañada de un comentario, para qué sirve la clase y cómo usarla.
El comentario sobre la clase debería ser suficiente para comprender: cómo y cuándo usar la clase, requisitos adicionales para el uso correcto de la clase. Describa, si es necesario, restricciones (supuestos) sobre la sincronización en la clase. Si se puede utilizar una instancia de la clase desde diferentes subprocesos, asegúrese de anotar las reglas de subprocesos múltiples.
También puede proporcionar ejemplos de código corto en el comentario de la clase para mostrar qué tan fácil es usar la clase.
Normalmente, una clase se declara / define en diferentes archivos (
.h y
.cc ). Los comentarios que describen el uso de la clase deben estar al lado de la definición de la interfaz. Los comentarios sobre las complejidades de la implementación deben estar cerca del código de los métodos mismos.
Comentarios de funciones
Los comentarios sobre una declaración de función deben describir el uso de la función (excepto en los casos más obvios). Los comentarios sobre la definición de la función describen la implementación.
Declaración de funciones
La declaración de cada función debe tener un comentario (justo antes de la declaración), qué hace la función y cómo usarla. Un comentario puede omitirse solo si la función es simple y su uso es obvio (por ejemplo, la función de restar valores variables). Intente iniciar comentarios en el modo indicativo ("Abrir archivo"). No se recomienda utilizar el estado de ánimo imperativo ("Abrir archivo"). Un comentario describe la esencia de una función, no cómo lo hace.
En el comentario sobre la declaración de función, tenga en cuenta lo siguiente:
- Lo que se alimenta a la entrada de la función, que se devuelve como resultado.
- Para una función miembro de una clase: ¿la instancia mantiene argumentos de referencia,
¿Necesito liberar memoria? - ¿La función asigna la memoria que el código de llamada debe eliminar?
- ¿Puede haber argumentos nullptr?
- La complejidad de la función (algorítmica).
- ¿Se permiten llamadas de diferentes hilos al mismo tiempo? ¿Qué pasa con la sincronización?
Un ejemplo:
Sin embargo, no mastique cosas obvias.
Al documentar funciones sobrecargadas, realice los principales cambios obstinados en comparación con la función original. Y si no hay cambios (lo que sucede a menudo), entonces no se necesitan comentarios adicionales.
Al comentar sobre constructores y destructores, tenga en cuenta que el lector de código conoce su propósito. Por lo tanto, el comentario del tipo "destruye este objeto" es estúpido. Puede describir lo que hace el constructor con argumentos (por ejemplo, cambiar la propiedad de los punteros) o qué tipo de operaciones de limpieza realiza el destructor. Si todo está claro, no comente nada. En general, los destructores generalmente no tienen comentarios (cuando se declaran).
Definición de función
Si hay algún truco en la implementación de la función, puede agregar un comentario explicativo a la definición. En él puede describir trucos con el código, dar una visión general de todas las etapas de los cálculos, explicar la elección de esta o aquella implementación (especialmente si hay mejores alternativas). Puede describir los principios de sincronización de código (aquí bloqueamos, pero aquí envolvemos el pescado).
Tenga en cuenta que no
debe repetir el comentario sobre la declaración de la función (desde un archivo
.h o similar). Es posible describir brevemente lo que hace la función, pero lo principal debería ser
cómo lo hace.
Comentarios sobre variables
En el buen sentido, el nombre de la variable debe decir de inmediato qué es y por qué, sin embargo, en algunos casos, se requieren comentarios adicionales.
Miembro de datos de clase
El propósito de cada miembro de la clase debe ser obvio. Si hay sutilezas no obvias (significados especiales, vínculos con otros miembros, restricciones en la vida útil), todo esto debe ser comentado. Sin embargo, si el tipo y el nombre son suficientes, no necesita agregar comentarios.
Por otro lado, las descripciones de valores especiales (y no obvios) (nullptr o -1) serán útiles. Por ejemplo:
private:
Variables globales
Todas las variables globales deben comentarse sobre su propósito y (si no es obvio) por qué deberían ser globales. Por ejemplo:
Comentarios sobre la implementación
Comente sobre la implementación de una función o algoritmo en el caso de piezas de código no obvias, interesantes e importantes.
Comentarios descriptivos
Los bloques de código que son complejos o no estándar deben ir precedidos de un comentario. Por ejemplo:
Comentarios de linea
Es recomendable complementar las líneas de código con un significado no obvio con un comentario (generalmente ubicado al final de la línea). Este comentario debe estar separado del código por 2 espacios. Por ejemplo:
Tenga en cuenta que hay 2 comentarios en el bloque de código: uno describe lo que hace el código, el otro recuerda que el error ya está en el registro si hay un retorno de la función.
Comentarios sobre argumentos de funciones
Cuando asignar un argumento a una función no es obvio, considere las siguientes opciones:
- Si el argumento es un valor fijo (constante literal) y ese valor
usado en diferentes bloques de código (y se entiende que este valor es lo mismo)
debes crear una constante y usarla explícitamente. - Tal vez deberías reemplazar el argumento de tipo bool con
enumeración enumeración. Esto hará que el argumento sea autodeterminado. - Para las funciones que usan varias opciones de configuración en los argumentos, puede
cree una clase (o estructura) separada que combine todas las opciones. Y pasar a funcionar
Una instancia de esta clase.
Este enfoque tiene varias ventajas: las opciones se indican mediante nombres, lo que explica
Su propósito. El número de argumentos en la función se reduce: el código es más fácil de escribir y leer.
Y si necesita agregar más opciones, no tendrá que cambiar la función llamada en sí.
- En lugar de expresiones complejas en argumentos, use una variable intermedia a la que asigne una expresión.
- Como último recurso, escriba comentarios en el lugar de la llamada para aclarar el propósito de los argumentos.
Considere los siguientes ejemplos:
Intentemos peinar el código:
ProductOptions options; options.set_precision_decimals(7); options.set_use_cache(ProductOptions::kDontUseCache); const DecimalNumber product = CalculateProduct(values, options, nullptr);
Que no hacer
No explique lo obvio. En particular, no hay necesidad de explicar cosas que son obvias para una persona que conoce C ++. En cambio, puede describir
por qué este código lo hace (o incluso hacer que el código se autodescriba).
Compara:
Con esto:
El código de autodescripción no necesita comentarios en absoluto.
El comentario sobre el código anterior puede ser generalmente obvio (y no necesario):
if (!IsAlreadyProcessed(element)) { Process(element); }
Puntuación, ortografía y gramática
Presta atención a la puntuación, la ortografía y la gramática: es mucho más fácil leer los comentarios escritos correctamente.
Los comentarios deben escribirse como una historia: con la disposición correcta de mayúsculas y signos de puntuación. En la mayoría de los casos, las oraciones completas son más fáciles de entender que los fragmentos de frases. Los comentarios breves, como línea por línea, pueden ser menos formales, pero deben seguir un estilo común.
Aunque el énfasis excesivo del revisor de código en el uso de comas en lugar de punto y coma puede ser un poco molesto, es importante mantener un alto nivel de legibilidad y comprensión. La puntuación adecuada, la ortografía y la gramática contribuyen en gran medida a esto.
Comentarios TODO
Utilice
TODO comentarios para un código temporal o una solución suficientemente buena (intermedia, no perfecta).
El comentario debe incluir la cadena
TODO (todas las letras mayúsculas), seguido del nombre, la dirección de correo electrónico, la identificación del defecto u otra información para identificar al desarrollador y la naturaleza del problema para el que está escrito
TODO . El propósito de esta descripción es poder encontrar más detalles más adelante.
TODO con la descripción no significa que el programador especificado solucionará el problema. Por lo tanto, cuando crea
TODO , el nombre habitual es su nombre.
Si su
TODO se ve como "Hagámoslo de manera diferente en el futuro", indique una fecha específica ("Correcto en noviembre de 2005") o un evento ("Elimine ese código cuando todos los clientes procesen solicitudes XML").
Nota:
- Los enlaces pueden conducir a secciones del manual que aún no se han traducido.
- una discusión de temas generales se realiza mejor en la
Parte 1. Introducción