La de veces que nos hemos preguntado durante nuestros estudios, cómo hacer en la vida real eso tan bonito que el profesor ha dibujado en la pizarra. Desde códigos perfectamente comentados hasta diagramas y esquemas en general. A mí lo que más me molestaba era ver después esos diagramas o dibujos tan bonitos hechos a ordenador en el enunciado del examen final. ¡ Es que jamás nadie me dijo que software hace eso! , cosa que debería ser la lección 1 del tema.
Pero a veces el software libre tiene la respuesta : Hoy comentaré Umbrello, una herramienta para generar diagramas UML.
 |
Umbrello UML Modeller.
|
Página web: http://uml.sourceforge.net/index.php
Requisitos: GNU/Linux y KDE 3 o superior.
Características:
- Creación de diagramas de clase UML.
- Creación de diagramas de secuencia UML.
- Creación de diagramas de casos de uso UML.
- Creación de diagramas de colaboración UML.
- Creación de diagramas de estado. UML
- Importación de código en C++.
- Generación de código : C,C++, Java …
Ahora explicaré con más detalle cómo importa código C++ Umbrello, ya que de todas sus funcionalidades esta es la que más me ha llamado la atención.
Supongamos estas dos clases :
cUser que representa a un usuario de un sistema.
cLog que representa un registro de todas las actividades de un usuario del sistema.
NOTA:En estas dos clases se han usado las librerías wxWidgets, de las que hablaré en otra cocasión
__cLog.hpp__
class cLog
{
public:
cLog();
~cLog();
cLog(wxString fileName,
int maxSize);
wxString get_logFilename();
void set_logFilename(const wxString& newFileName);
bool addEvent(const wxString& objectName,const wxString& eventDesc);
bool clearLog();
private:
wxTextFile m_logFile;
/**< Fichero de texto donde redactar el log. */
int m_maxLogSize;
/**< Tamaño en Kbytes que puede ocupar como máximo el log. */
};
Dado este fichero de cabecera, Umbrello al importarlo genera el siguiente diagrama :
Esto, facilita mucho la cosa, ya que si por lo que sea en nuestra fase de implementación del proyecto, hemos hecho cambios al diseño, cosa que por mucho que le pese a ciertos puristas, pasa, nos ahorramos tener que escribir esos cambios en Umbrello.
Ahora veamos la generación del diagrama para la otra clase :
__cUser.hpp__
class cUser
{
public:
cUser();
~cUser();
cUser(wxString name,wxString pwd, wxString email,wxString logFile );
wxString get_nombre();
wxString get_pwd();
wxString get_email();
wxString get_logFile();
void set_nombre(const wxString& newName);
void set_pwd(const wxString& newPwd);
void set_email(const wxString& newMail);
void set_logFile(const wxString& filename);
bool addComentLog(const wxString& descripcion);
protected:
wxString m_nombre; /**< Nombre de Usuario. */
wxString m_password; /**< Password del Usuario. */
wxString m_email; /**< Dirección de correo electrónico del Usuario. */
wxString m_logFilename; /**< Nombre y path del fichero de Log de este usuario. */
cLog*m_logFile; /**< Fichero de texto del Log. */
bool logFileInicializado; /**< Marca si el fichero de log ha sido ya cargado. */
};
Dado este fichero de cabecera, Umbrello al importarlo genera el siguiente diagrama :
Ahora veamos, como al añadir a nuestro diagrama estas dos clases, Umbrello genera las relaciones entre ellas de forma automática.
Ya sé que el hecho de que Umbrello haya escogido una agregación en vez de una asociación puede disgustar a ciertas personas, pero bueno, no es del todo una mala opción. Lo que hay que destacar es el tiempo que nos ahorramos al definir funciones y atributos de las clases, que por cierto, si las tenemos documentadas en el fichero de implementación, Umbrello también coge esos comentarios y los añade a las propiedades de la clase.
En definitiva, Umbrello es una muy buena herrameinta de diseño UML, seguramente hay otras mucho más completas, pero es que lo que realmente me fascina es su simplicidad y su sencillez.