Abr 20

Cómo documentar el código

Tag: C++, Informática, Informática teórica, JAVA, Metodología y calidad, ProgramaciónEmilio González Montaña @ 7:44
1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (No hay votaciones todavía)

Introducción

A continuación explicaré una metodología para documentar código fuente, que aunque en principio supondré que es para C++, esto es lógicamente extensible a cualquier otro lenguaje (JAVA, C, PHP, …), ya sea orientado a objetos o no.

Los objetivos finales de la documentación dentro del código fuente serán:

  • Que el código quede documentado de modo que los que lean, mantengan, reparen, etc el código lo entiendan.
  • Poder extraer de manera automatizada la documentación, en un formato leible, como HTML, PDF, CHM, etc.
  • Que documentar sea una tarea fácil, y que no suponga un sobreesfuerzo, más allá de lo extrictamente necesario.

Ejemplo de código fuente sin documentar:

  1. int CalcularReintentos (const char *opcion,
  2.                         bool similitud = true);

El problema de este método (o función) es que el programador que lo quiera invocar, va a tener que irse a la implementación del mismo (en el correspondiente CPP), y leer todo el código del mismo, hasta entender su contenido, lo cual le llevará (dependiendo de la implementación) un buen rato, siendo este tiempo superior al que habría tardado en leer la documentación (si esta existiera) del método en cuestión.

Este es el mismo ejemplo, pero documentado:

  1. /** Este método calcula el número de reintentos de una
  2.     determinada opción.
  3.     @param opcion Cadena de texto con la opción a parsear
  4.            para extraer el número de reintentos. La sintaxis es
  5.            la siguiente: "reintentos:XXX", donde XXX será una
  6.            cadena de texto que se interpretará como un
  7.            número (valor retornado).
  8.     @param similitud Flag que si vale true (valor por defecto)
  9.            hará que el método no distinga las letras mayúsculas
  10.            a la hora de intentar parsear la sintaxis, de modo
  11.            que "reintentos:XXX" sea igual de válido que
  12.            "ReinteNTos:XXX".
  13.     @return Devuelve el número de reintentos o -1 en caso
  14.             de error. */
  15. int CalcularReintentos (const char *opcion,
  16.                         bool similitud = true);

Bastante mejor, ¿no?. Bueno vayamos a la chicha

Sintáxis básica para documentación

La sintáxis es realmente sencilla (de echo con el ejemplo anterior, ya habréis aprendido casi la mitad de las reglas ;) ):

  1. Todo comentario debe empezar por /**, y terminar en */.
  2. Los comentarios (con /** ... */) deben situarse en la línea inmediatamente superior a lo que queremos documentar (a veces la gente pone comentarios a la derecha de un atributo, lo cual documentaría el siguiente atributo, y no el de la línea actual).
  3. Lo primero dentro de un comentario debe ser la descripción textual de lo que estamos documentando, luego (dependiendo de lo que estemos documentando (un atributo, un método, una clase, …)) pueden venir los siguientes campos:
    • @param xxx yyy Esto documenta un parámetro (xxx) con una descripción (yyy).
    • @return yyy Documenta el valor retornado (yyy) por el método (o función).

Con estas sencillas reglas ya podemos documentar casi cualquier cosa, por ejemplo una clase Fecha:

  1. /** Esta clase da soporte al uso de fechas. */
  2. class Fecha
  3. {
  4.  
  5. // Atributos privados.
  6. private:
  7.  
  8.     /** Número de milisegundos desde el año cero. */
  9.     i64 fecha;
  10.  
  11. // Métodos públicos.
  12. public:
  13.  
  14.     /** Constructor. */
  15.     Fecha ();
  16.     /** Constructor de copia.
  17.         @param objeto Objeto a copiar. */
  18.     Fecha (const Fecha &objeto);
  19.     /** Destructor. */
  20.     virtual ~Fecha ();
  21.  
  22.     /** Establece la fecha a partir de sus subelementos.
  23.         @param anyos Años a copiar.
  24.         @param meses Meses a copiar (0 por defecto).
  25.         @param dias Dias a copiar (0 por defecto).
  26.         @param horas Horas a copiar (0 por defecto).
  27.         @param minutos Minutos a copiar (0 por defecto).
  28.         @param segundos Segundos a copiar (0 por defecto).
  29.         @param milisegundos Milisegundos a copiar (0 por defecto).
  30.         @return Devuelve una referencia a este objeto. */
  31.     Fecha &Set (i32 anyos,
  32.                 i32 meses = 0,
  33.                 i32 dias = 0,
  34.                 i32 horas = 0,
  35.                 i32 minutos = 0,
  36.                 i32 segundos = 0,
  37.                 i32 milisegundos = 0);
  38.  
  39.     /** Devuelve una cadena de texto con la descripción
  40.         de la fecha.
  41.         @return Devuelve una cadena de texto con la
  42.                 descripción de la fecha. */
  43.     const i8 *GetDescripcion () const;
  44.  
  45. };

Tratamiento automático

Que la documentación sea hecha mediante comandos con una sintáxis dada, no es casualidad, dado que uno de los objetivos, es que no sólo humanos entiendan unívocamente que significa cada comentario, sino que herramientas de extracción automatizada de documentación también sean capaces.

Una herramienta que siempre me ha dado buen resultado es Doxygen, para usarla tenéis que descargarla de la web oficial (o si usais Linux bajarla del repositorio de turno, dado que esta herramienta viene en las distribuciones oficiales desde hace años) e instalarla.

Doxygen permite generar proyectos donde indicar las diferentes opciones para la documentación a generar (viene con un Wizard que facilita mucho esta tarea, y también de una excelente y completísima documentación), de modo que no lo trataré aqui.

La idea es indicar a la herramienta que ficheros (o directorios) queremos que analice en busca de documentación, y el generará unas páginas HTML (también exporta a PDF, MAN, LaTeX, CHM, …) con dicha documentación. Un ejemplo del resultado de esta documentación lo podéis encontrar en la documentación de Apache Portable Runtime o en la página de documentación de esta misma web.

Sintáxis adicional

Además de los comandos vistos (@param, @return), hay otros comandos que pueden resultar interesantes:

  • @note xxx Este comando sirver para poner notas (xxx) o comentarios.
  • @warning Indica alertas (xxx) o posibles problemas, especialmente útil cuando documentamos un método que dado un parámetro inválido, puede causar un error grave.
  • @author xxx Este comando indicará quien (xxx) es el autor.
  • @date xxx Señala fechas, donde xxx suele ser una fecha seguida de una descripción de que se ha hecho en dicha fecha, con esto podemos hacer listas de cambios, poniendo sucesivas llamadas a este comando.

Posts relacionados: Al final todos v... (0), C++ en Windows (0), Clases de progra... (0), Hormiguero (0), Patrón de diseÃ... (0)
Posts en mismas categorías: Al final todos v... (0), C++ en Windows (0), Clases de progra... (0), Hormiguero (0), Instalando Visua... (0), Juego de la Vida (0), Linux en Windows... (0), Patrón de diseÃ... (0), Trabajo como fre... (0)
EHT Related v0.2.5 by Emilio González Montaña

RSS feed | Trackback URI

2 comentarios »

Daniel Esteban Arrubla Escobar Identicon Icon
     Daniel Esteban Arrubla Escobar
2008-05-06 21:14:32 Colombia (190.69.1.4)

Hola, quisiera saber que herramientas para documentar cósido son usadas con mayor frecuencia y poseen una licencia gratuita…. ah y si pueden me envian la respuesta al cooreo electronico… muchas gracias por todo…. y espero una respuesta, por favor!!!

Esta muy interesante el “foro”

Emilio González Montaña Identicon Icon
     Emilio González Montaña
2008-05-06 21:23:24 Spain (85.49.235.4)

Hola Daniel,

No era mi idea hacer una comparativa de herramientas en este post, aunque la he hecho en el pasado por motivos profesionales, y el ganador fue doxygen. De todas formas eso fue hace tiempo, de modo que no tiene porque seguir siendo así ahora… De todos modos, para mi sigue siendo una GRAN HERRAMIENTA.

Toda la información la tienes en el post, y como ya he dicho en anteriores posts, nunca envío emails con respuestas, dado que el conocimiento no se extendería.

Si quieres enterarte instantáneamente de los comentarios, tienes dos opciones:
- Subscribirte al RSS de comentarios.
- Registrarte en la web, y te llegarán correos con los nuevos comentarios.

 
 
Nombre (requerido)
E-mail (requerido - nunca mostrado públicamente)
URI
Su comentario (menor tamaño | mayor tamaño)
NOTA:Todo comentario repetido, que no aporte nada, o que pregunte cosas ya contestadas puede ser borrado sin previo aviso!