¿Los mejores consejos para documentar el código usando doxygen? [closed]

10 minutos de lectura

Avatar de usuario de Andrew Johnson
Andrés Johnson

Mi equipo está comenzando a documentar nuestro código C usando doxygen, prestando especial atención a nuestros encabezados de API públicos. Parece haber mucha flexibilidad y diferentes comandos especiales en doxygen, lo cual es genial, pero no está claro qué es bueno y qué es malo sin prueba y error.

¿Cuáles son sus formas favoritas de marcar su código, cuáles son lo que DEBE HACER y lo que NO DEBE HACER?
Proporcione sus mejores sugerencias, una por respuesta para facilitar la votación.

Busco definir todo nuestro enfoque de la documentación de la API, incluida la provisión de una plantilla para que el resto del equipo comience. Hasta ahora tengo algo como esto:

/**
 * @file   example_action.h
 * @Author Me (me@example.com)
 * @date   September, 2008
 * @brief  Brief description of file.
 *
 * Detailed description of file.
 */

/**
 * @name    Example API Actions
 * @brief   Example actions available.
 * @ingroup example
 *
 * This API provides certain actions as an example.
 *
 * @param [in] repeat  Number of times to do nothing.
 *
 * @retval TRUE   Successfully did nothing.
 * @retval FALSE  Oops, did something.
 *
 * Example Usage:
 * @code
 *    example_nada(3); // Do nothing 3 times.
 * @endcode
 */
boolean example(int repeat);

  • Personalmente creo que la [in] y [out] partes del param no debería ser necesario. Su API debe especificar si algo es una variable de entrada o salida: const int * const a es un in y int * const a es y out

    –Matt Clarkson

    24 de agosto de 2012 a las 8:03

  • La autoría del archivo no pertenece a un archivo fuente, a menos que el nombre del autor sea parte de la declaración de derechos de autor. Averiguar quién escribió cuál es la razón de ser de la funcionalidad de culpa de control de fuente

    – Kuba no se ha olvidado de Mónica

    4 de agosto de 2014 a las 14:48


  • @Mark, no había pensado en eso (+1). Por supuesto, no es tan intuitivo al instante, pero no puede desincronizarse, así que es un buen punto. tengo de vez en cuando #defined INPUT, MODIFY y OUTPUT como macros vacías, y las usó tanto en declaraciones como en llamadas actucall. La opinión está dividida sobre si eso es algo bueno.

    – Mawg dice que reincorpore a Monica

    22 de noviembre de 2016 a las 12:32

Avatar de usuario de Étienne
Étienne

No necesita y no debe escribir el nombre del archivo en el @file directiva, doxygen lee el nombre del archivo automáticamente. El problema de escribir el nombre del archivo es que cuando cambie el nombre del archivo tendrá que cambiar el @file directiva también.

Proporcionar @author y @date la información también es inútil la mayor parte del tiempo, ya que el sistema de control de fuente lo hace mucho mejor que alguien que edita los archivos manualmente.

Tampoco tienes que escribir @brief si usa la siguiente sintaxis de Doxygen y habilita JAVADOC_AUTOBRIEF en la configuración de doxygen:

/*! Short Description on the first line

    Detailed description...
    ...
*/
void foo(void) {}

Él @name La directiva para funciones también es 100% redundante la mayor parte del tiempo y completamente inútil. Solo trae errores cuando alguien modifica el nombre de la función y no el doxygen @name.

  • los documentos de doxygen dicen “Repitamos eso, porque a menudo se pasa por alto: para documentar objetos globales (funciones, typedefs, enum, macros, etc.), debe documentar el archivo en el que están definidos. En otras palabras, debe haber al menos ser un /*!\archivo / o un /* @file */ línea en este archivo.” parece sugerir que \file puede ser necesario. Sin embargo, esto puede simplemente malinterpretarse. Vale la pena aclararlo.

    – ivo Welch

    22 de junio de 2014 a las 1:48

  • \file es necesario pero no el nombre del archivo, eso es todo lo que digo;)

    – Étienne

    22 de junio de 2014 a las 6:49

  • Étienne, por favor, agrega en tu respuesta un ejemplo del comienzo de un archivo usando \file sin el nombre del archivo. Creo que necesitas configurar JAVADOC_AUTOBRIEF = YES para evitar el uso @brief. ¿Puedes confirmar? ¿Qué aconsejas para proporcionar un escrito para un archivo? Salud

    – oHo

    1 de julio de 2016 a las 9:07


  • @ivoWelch Su documentación también dice “Para funciones miembro o funciones que forman parte de un espacio de nombres, debe documentar la clase o el espacio de nombres”. entonces \file puede no parecer necesario, si todas sus funciones gratuitas están en espacios de nombres? Aunque no revisé eso…

    – Ela782

    1 de septiembre de 2016 a las 0:21

  • No necesita \file si todas sus funciones están en una clase o un espacio de nombres. Tenga en cuenta que estaba respondiendo a una pregunta en particular, que usa \file en un templace (y eso tiene sentido en mi opinión).

    – Étienne

    4 sep 2016 a las 14:39

Avatar de usuario de Andy Dent
andy abolladura

Escribe un página de inicio descriptiva usando @mainpage (en un archivo de encabezado separado solo para este propósito). Considere, como se muestra en mi ejemplo, convertirlo en una guía para sus principales clases/funciones y módulos.

otra muestra

Mientras estaba volviendo a poner en línea el contenido de doxygen de oofile principal vinculado anteriormente, aquí hay un ejemplo de un trabajo de cliente actual que usa el formato Markdown. Al usar Markdown, puede consultar una página principal en Markdown (en la configuración de Doxygen), lo cual es excelente para el típico readme.md archivo incluido en proyectos de código abierto.

Lingopal
========
Developer Documentation started when Andy Dent took over support in May 2014. 

There are a number of pages in Markdown format which explain key aspects:

- @ref doc/LingopalBuilding.md
- @ref doc/LingopalSigning.md
- @ref doc/LingopalDatabases.md
- @ref doc/LingopalExternals.md

See the <a href="https://stackoverflow.com/questions/51667/pages.html">Related Pages list for more.</a>

-------------

_Note_

These pages, whilst readable by themselves, are designed to be run through the [Doxygen](http://www.doxygen.com) code documentation engine which builds an entire local cross-referenced set of docs. It uses a minor [extension of Markdown formatting.](http://www.stack.nl/~dimitri/doxygen/manual/markdown.html)

The settings to generate the documentation are `Lingopal.doxy` and `LingopalDocOnly.doxy`. The latter is used for quick re-generation of just these additional pages.

  • El enlace está muerto, no puedo ver lo que quieres decir. Sugiero expandir la respuesta para que sea independiente o arreglar el enlace muerto.

    –Rick Deckard

    12/06/2014 a las 19:50

  • lo siento, intentaré recuperarlo lo antes posible, estaba sujeto a un DDOS en mi blog y también tuve que eliminar mi sitio Doxygen como consecuencia, ya que tenía demasiados archivos en un directorio

    –Andy Dent

    14 de junio de 2014 a las 0:55

Avatar de usuario de Andy Dent
andy abolladura

Utilizar Grupos para organizar su código en módulos.

Recuerde que puede poner casi todo en varios grupos para que puedan usarse para proporcionar etiquetas semánticas como las etiquetas en Stack Overflow. Por ejemplo, puede etiquetar cosas como específicas de una plataforma determinada.

También puede usar grupos para hacer coincidir un jerarquía de carpetas dentro de un IDEcomo se muestra en mi muestra RB2Doxy producción.

Los grupos funcionan bien cuando están anidados; tengo un gran ejemplo para el fuente OOFILE.

  • Sí, usar grupos anidados era de lo que estaba hablando con una de mis respuestas. He estado experimentando con el uso de un archivo separado para la gestión de la jerarquía, que parece funcionar bien.

    – Andrés Johnson

    17 de marzo de 2009 a las 15:01

  • Ojalá pudiera dar esta y las otras respuestas que involucran a grupos con más de un voto. Doxygen no puede decirle nada que no esté ya en su código. Sin embargo, puede presentar la información en un orden diferente o filtrarla. Los grupos son una de las cosas más útiles que puede agregar en los comentarios porque permite que doxygen le brinde lo que no puede obtener al abrir los archivos fuente en un editor: una vista significativamente reorganizada de su código.

    – Bowie Owens

    22 de septiembre de 2011 a las 1:55

  • Enlaces rotos…

    – Aarón Campbell

    09/04/2015 a las 23:11

  • Encontré la salida de RB2Doxy en un archivo .zip: oofile.com.au/files/REALbasic/RB2DoxySample.zip

    – Aceite caliente

    21/01/2016 a las 20:00

  • ¿Puedes arreglar los enlaces en tu respuesta?

    – xaxxon

    6 de junio de 2017 a las 2:49

Algunos comandos que uso en mi código:

  • \todo { paragraph describing what is to be done } Útil para realizar un seguimiento de todos, se creará una página en la documentación final que contiene su lista de tareas pendientes.
  • \c <word> Muestra el argumento utilizando una fuente de máquina de escribir. Use esto para referirse a una palabra de código. Lo usaría antes de “VERDADERO” y “FALSO” en su ejemplo.
  • \a , \warning , \see : ver http://www.stack.nl/~dimitri/doxygen/commands.html#cmdc para descripción

Una buena “práctica recomendada” (aunque no siempre alcanzable) es proporcionar ejemplos breves y prácticos para cada API e incluirlos en la ayuda usando \includelineno (o \include para no tener números de línea). Estas pueden ser pruebas unitarias, si están escritas para que los usuarios puedan entenderlas (es decir, no enganchadas a un arnés de prueba más grande). Como un buen efecto secundario, los cambios en la API romperán las muestras, por lo que deben mantenerse actualizadas.

Puede describir una API con palabras, pero no hay nada como ver el código real para entender cómo usarlo.

  • Sí, lo tenía en la plantilla de ejemplo. Es especialmente útil en el comentario que se refiere a un grupo de API para mostrar cómo funcionan juntas.

    – Andrés Johnson

    4 de junio de 2009 a las 21:28

Avatar de usuario de Andy Dent
andy abolladura

A medida que me encuentro editando código en pantallas de mayor resolución, he pasado de usar la barra invertida al prefijo @ en los comandos de Doxygen. no tan ruidoso barra invertida se ha encontrado ahora demasiado difícil de distinguir los comandos de Doxygen.

  • Sí, lo tenía en la plantilla de ejemplo. Es especialmente útil en el comentario que se refiere a un grupo de API para mostrar cómo funcionan juntas.

    – Andrés Johnson

    4 de junio de 2009 a las 21:28

Avatar de usuario de Andy Dent
andy abolladura

Si está seguro de que su equipo seguirá una plantilla tan pesada, está bien, utilícela como se muestra.

De lo contrario, se parece a JavaDoc. Una de las cosas buenas de Doxygen es lo bien que funciona. sin que tener que usar un marcado tan fuerte. No necesita usar @name y con la configuración JAVADOC_AUTOBRIEF puede omitir @brief; solo asegúrese de que la primera línea del comentario sea una breve descripción razonable.

Prefiero los nombres descriptivos en lugar de hacer cumplir la documentación y alentar a las personas a agregar comentarios solo cuando agregan un valor significativo. De esa manera, los comentarios valiosos no se ahogan por todos los ruido.

  • Inevitablemente, si intenta seguir una plantilla, obtendrá muchos comentarios como “Esta es una breve descripción de la clase” en código real de personas que se olvidan de volver atrás y agregar cosas en los comentarios. Mejor nada que este tipo de comentarios.

    – Greg Rogers

    14 de enero de 2009 a las 22:50

  • Lo triste de hacer que la documentación sea opcional es que, según mi experiencia, el código simplemente no se documenta. Si la plantilla termina siendo excesivamente más grande que la mayoría de los bloques de documentación, siempre puede cambiarla.

    – axs6791

    10 de febrero de 2009 a las 20:17

  • Si hace que la documentación sea opcional, tiene la oportunidad de auditar si se agregó, particularmente una verificación rápida con Doxygen cambiando la configuración para advertir sobre clases no documentadas. También sugeriría usar la salida XML de Doxygen para que pueda analizar los comentarios en busca de cadenas blandas comunes.

    –Andy Dent

    11 de febrero de 2009 a las 1:20

  • Intentamos no tener una API pública demasiado grande y tenemos revisiones de código sólidas para que las personas sigan las plantillas y los comentarios sean razonables. Las plantillas que estamos usando no son tan pesadas como la de arriba. Un bloque grande por cabecera API y uno ligero por función.

    – Andrés Johnson

    17 de marzo de 2009 a las 14:59

¿Ha sido útil esta solución?