Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Uno de los grandes problemas a los que se enfrenta un programador cuando lee un código
ajeno es que la dificultad de comprensión es directamente proporcional al tamaño de éste.
Entender cómo está organizado el código es tedioso aunque esté bien comentado, ya que
tendremos que navegar a la deriva entre miles y miles de líneas de código. Incluso cuando
el proyecto no es un programa sino una biblioteca que queremos usar, tenemos que pasar
largas y tediosas horas leyendo código e intentando entender el porqué de cada archivo de
cabecera, de cada archivo fuente, de cada función... cuando en realidad no queremos saber
cómo está implementado sino como usar la biblioteca. Sin duda una buena documentación
es necesaria, incluso imprescindible, pero crear un documento puede resultar aburrido y
quitarnos mucho tiempo. ¿Cuál es la solución? Sin duda, Doxygen.
/**
* @brief Multiplica 2 matrices 3x3 y devuelve el resultado
* @param A La primera matriz a multiplicar de tamaño 3x3
* @param B La segunda matriz a multiplicar de tamaño 3x3
* @return Una nueva matriz C = AxB.
*/
float ** multiplicaMatrices (float **A, float **B);
Sin tener ni idea de doxygen, ya podeos intuir lo que quieren decir los comentarios. Gracias
a estos comentarios (y la documentación generada posteriormente a partir de estos)
podemos saber que esta función multiplica matrices 3x3 sin tener que conocer la
implementación.
Lo primero que vemos es que el bloque de comentario es casi normal salvo porque el
comienzo tiene dos asteriscos en lugar de 1:
Realmente son 2 estilos: JavaDoc y Qt. Los otros dos no son estilos propiamente dichos: el
cuarto es el primero utilizando más asteriscos por cuestiones estéticas y el tercero es
simplemente un conjunto de líneas seguidas que se toman como bloque (una línea de
comentario doxygen es cualquiera que comience por /// o por //!).
Directivas básicas:
Al igual que pasaba con los bloques de comentarios, para las directivas hay 2 estilos: \ y @:
/**
* @brief Esta es una forma de indicar la directiva
* \note Y esta es la otra
*/
Cual usar dependerá únicamente de vuestros gustos. Las directivas más comunes son:
Hay que decir que la primera linea siempre se tomará como un brief si usamos el estilo
JavaDoc. Cualquier linea que no comience con una directiva se supone que forma parte de
la descripción extendida (siempre y cuando haya una línea en medio):
/**
* @brief Descripción resumida
* Aqui sigue siendo un resumen
*
* Esto ya es la descripción detallada
*/
No tenemos que definir los comentarios justo antes de la declaración, podemos ponerlos
justo después mediante comentarios en línea que comienzan por '<'. Si el comentario es una
única línea indica una descripción resumida:
Incluso podemos documentar algo en otra parte del código indicando a qué hace referencia
con las directivas:
Ejemplo:
/**
* @class miClase
* @brief Representa una clase vacía
*/
/**
* @struct miEstructura
* @brief Representa una estructura vacia
*/
// Antes o después de los comentarios o incluso en otro fichero...
class miClase{
...
};
struct miStruct{
...
};
Extras:
Doxygen permite insertar código de otras herramientas, como por ejemplo "dot", que
permite crear diagramas especificando su aspecto mediante texto. No vamos a entrar en
detalle en este tema, aunque si a alguien le interesase podría hacer otro tutorial dedicado a
dot. Por ahora mirad el archivo mainPage.h del comprimido "tutorialDoxygen.zip" para ver
el aspecto que tienen las directivas dot y el HTML para ver el resultado.
Generando la documentación:
Una vez comentado nuestro código procedemos a ejecutar Doxygen para que genere
automáticamente nuestra documentación. A este programa lo único que tenemos que
indicarle es un archivo de configuración, el cual podemos generar mediante el comando
$ doxygen -g
Podemos tardar un buen rato en configurar la documentación a nuestro gusto. Una vez que
ya lo tenemos simplemente ejecutamos
$ doxygen
Ejemplo:
En el archivo de ejemplo podéis ver un ejemplo extremadamente tonto de uso de doxygen.
Simplemente son unas cuantas funciones y clases vacías con comentarios doxygen junto
con su correspondiente documentación HTML ya generada. Mirad los archivos .h y .c para
ver los comentarios y el archivo html/index.html para ver el resultado.
También he subido un ejemplo real, una biblioteca hecha por mi mismo con decenas de
clases, cientos de funciones, enumerados, estructuras, etc. Es una biblioteca de gráficos 2D
con aceleración hardware, mediante OpenGL y SDL (de ahí el nombre YASOL: Yen
Another SDL-OpenGL Library). Solo he subido la documentación ya que el código en si
para el caso no interesa. Podéis ver el resultado en los cientos de páginas HTML que genera
Doxygen por las cuales podéis navegar e incluso usar un buscador integrado.
Conclusiones:
Saber programar no es el final del camino. Una vez que sabemos programar hay que
empezar a hacer programas de calidad, siguiendo buenos hábitos de programación,
comentando el código, y teniendo una buena organización, dividiendo el programa en
varios ficheros, funciones, clases, estructuras, etc. Los comentarios no deben hacerse a
posteriori, una vez ya hecho el programa, sino a la vez que se va escribiendo. Igualmente
podemos ir documentando el porqué de cada clase/estructura/función relevante de forma
que otra persona pueda saber qué representa. Incluso si no tienes previsto que nadie lea tu
código, no está de más documentar el código para que en un futuro puedas leerla si no
recuerdas como hiciste las cosas.
Por último decir que comentar el código con sintaxis doxygen no solo sirve para generar la
documentación. Algunos IDEs como Netbeans analizan los comentarios Doxygen para
mostrar al usuario una ayuda contextual con la definición que hayamos escrito de cada
función, clase, etc. Aun si no pensamos generar la documentación ni usamos un IDE
compatible con Doxygen, no nos cuesta nada escribir los comentarios con esta sintaxis por
lo que pueda pasar en un futuro. Asi que, ya que tenemos que escribir los comentarios, ¿por
qué no comentar con la sintaxis de Doxygen?.