UMLGEC ++: Una Herramienta CASE para la Generación de Código a partir de Diagramas de Clase UML Irving Alberto Cruz Matías 1 y Carlos Alberto Fernández y Fernández 2 1 Universidad Tecnológica de la Mixteca – carretera a Acatlima Km. 2.5, Huajuapan de León, Oaxaca, 69000. México irving@nuyoo.utm.mx 2 Instituto de Electrónica y Computación, Universidad Tecnológica de la Mixteca – carretera a Acatlima Km. 2.5, Huajuapan de León, Oaxaca, 69000. México caff@mixteco.utm.mx Resumen. Hoy en día existen muchas herramientas CASE (Computer Aided Software Engineering) con soporte a UML (Unified Modeling Language), sin embargo para muchas personas el adquirir una de estas herramientas tiene como inconvenientes: un precio elevado y una dificultad de aprendizaje si se es principiante, esto debido a la gran cantidad de opciones y configuraciones que presentan, sobre todo si se quiere obtener el máximo beneficio a las funciones importantes, como la generación de código fuente. En este documento, se plantea el desarrollo de una herramienta que soporte la notación UML para diagramas de clase y generación de código en C++, con un interfaz lo más completa y sencilla posible que ayude a quien apenas comienza con el aprendizaje de la Análisis y Diseño Orientado a Objetos (AyDOO). Palabras clave: CASE, UML, RUP, Ingeniería de Software. 1 Introducción Las herramientas CASE nacen para auxiliar a los desarrolladores de sistemas, lo que permite el apoyo computarizado en todo o en parte del ciclo de vida del desarrollo de un sistema de software, tal es el caso de las herramientas CASE con soporte a UML. 1.1 Alcance de la Herramienta El proyecto de desarrollo de esta herramienta CASE (UMLGEC ++) no pretende dar solución a los problemas que la gente demanda de las actuales herramientas CASE de UML, únicamente se ajusta a la creación de una herramienta que soporte la notación UML para diagramas de clase y generación de código en C++, con una interfaz lo mas completa y sencilla posible. Específicamente, la herramienta está orientada a ser un material de apoyo para la materia de Programación Orientada a Objetos II, impartida en la Universidad Tecnológica de la Mixteca, asignatura en la que los alumnos aprenden el uso del UML y desarrollan un proyecto final con base en éste. 1.2 El UML y el RUP En la búsqueda de software de calidad, la Ingeniería de Software ha creado técnicas de AyDOO que buscan facilitar el proceso de desarrollo de software, tal es el caso del UML, cuya finalidad es la de crear un lenguaje gráfico estándar independiente de cualquier metodología de desarrollo [1]. El UML es utilizado para el desarrollo de componentes de software en diversos campos y fue aceptado como un estándar por el OMG (Object Management Group - Grupo de Administración de Objetos) en Noviembre de 1997 [2]. Los principales creadores del UML (Grady Booch, Ivar Jacobson y James Rumbaugh) desarrollaron también un proceso de desarrollo para trabajar de la mano con el UML: el RUP (Rational Unified Process - Proceso Unificado de Rational), definido por Ivar Jacobson como: "el conjunto de actividades necesarias para transformar los requisitos de un usuario en un sistema de software" [3]. Como se menciona en la sección 3, tanto UML como el RUP fueron utilizados para diseñar la herramienta CASE que aquí se presenta. 2 Componente de la herramienta CASE A continuación se describen brevemente los principales componentes de una herramienta CASE [4], [5] y cómo han sido implementados. Este análisis fue necesario para identificar las características clave de la herramienta a desarrollar. 2.1 Depósito de datos Es la base de datos de información central de la herramienta CASE, en este depósito se almacena toda la información creada y generada a través de las etapas que cubre la herramienta de determinado proceso de desarrollo. Este componente es implementado cuando se necesitan cubrir requerimientos para trabajo en grupo. Dado que UMLGEC ++ se ha considerado como una aplicación que trabajará en una sola terminal, no fue necesario implementar un depósito de datos. Toda la información editada en tiempo de ejecución es almacenada temporalmente en objetos dinámicos que contienen información que les corresponde, hasta que el usuario guarda esta información en un archivo. Para el almacenamiento en archivo se creó un código que pudiera almacenar y leer estructuras con información de cada componente involucrado en un diagrama de clases, como son: las clases, las relaciones y notas. Esta información incluye datos sobre la posición y tamaño visual, información propia de cada componente como el nombre, atributos, etc., así como relaciones entre componentes. 2.2 Módulo para Creación de Diagramas y Modelado Consiste en dar soporte para la creación de los diagramas más utilizados para el análisis y diseño del software como los diagramas de flujo de datos, el modelo entidadrelación, y los diagramas de clase. Las principales características con las que debe cumplir este módulo y que han sido implementadas son el número máximo de objetos que se permiten en un diagrama y la posibilidad de deshacer los cambios hechos a los diagramas. Para UMLGEC ++, el número máximo de objetos está limitado por la cantidad de memoria que el sistema operativo destine a la ejecución de la herramienta, ya que cada vez que se intente crear un nuevo componente en tiempo de ejecución, primero se revisa si existe memoria suficiente para llevar a cabo dicha tarea. La posibilidad de deshacer los últimos cambios hechos en el diagrama está implementada mediante una pila, donde cada elemento en la pila contiene información del cambio realizado a la estructura del diagrama conforme es modificada, los cambios que se pueden deshacer son: mover una clase o una nota, y borrar cualquier componente del diagrama. 2.3 Generador de código Es uno de los componentes indispensables de las herramientas CASE. Las características más importantes de este componente son: el o los lenguaje(s) de programación para los que se genera código y el alcance de la generación del cuerpo del programa. UMLGEC ++ tiene un generador de código que crea código en lenguaje C++ a partir del diagrama de clases, con lo que se puede obtener la estructura estática de un sistema; es decir, se generan las estructuras de las clases que participan en el sistema modelado y las relaciones entre ellas, adoptando buenas prácticas de programación como la declaración de funciones inline y uso de la STL (Standard Template Library Biblioteca de Plantillas Estándar) de C++. 2.4 Analizador de sintaxis El analizador de sintaxis verifica la validez y el correcto uso de la información introducida a la herramienta, de acuerdo a la notación soportada. Este componente es muy importante para ayudar al desarrollador a no cometer errores de sintaxis al momento de crear los diagramas y generar un código más completo y preciso. La revisión de sintaxis en UMLGEC ++ va implícita en el momento de edición de un diagrama, ya que cada componente ha sido implementado de manera que cada una de sus partes esté validada para evitar errores de sintaxis. Con esto cada vez que el usuario esté modelando un diagrama y cree o modifique algún componente, la herramienta le indica si está violando la sintaxis de UML. 3 Metodología usada La herramienta fue desarrollada tomando como lenguaje de modelado al UML, como proceso de desarrollo al Proceso Unificado, como lenguaje de programación C++, y como ambiente de desarrollo a Borland C++ Builder 5. Para obtener los requisitos de la herramienta se hicieron pruebas de comportamiento a las herramientas CASE: Rose de Rational Corporation, Rhapsody de Ilogix, Visual UML de Visual Object Modelers y Objecteering de Softeam. La Fig. 1 muestra el diagrama de casos de uso al que se llegó una vez finalizada la captura de requerimientos. Fig. 1. Diagrama de Casos de Uso de UMLGEC++ 4 Resultados Una vez terminada la herramienta, se necesita el diseño de un sistema de prueba. Se diseñaron y realizaron varias pruebas, aunque solo se mostrará una de ellas. El sistema de prueba se obtuvo de un problema publicado por primera vez por Grady Booch [Trutra 98], se consideró interesante especialmente para mostrar cómo un problema no tan complicado, ni tan simple, podría tener un diseño sencillo y cómo sólo un poco de código necesita ser escrito manualmente. El problema (Home Heating System) consiste en lo siguiente: Supongamos que tenemos algunos cuartos (en una casa, un edificio, etc), en alguna parte en nuestro diseño, y tenemos que diseñar un sistema de calefacción, de tal manera que en cualquier momento que un cuarto desee un poco de calor, el sistema proveerá tal calor, y en cuanto el cuarto no lo necesite mas, el sistema dejará de mandar calor a tal cuarto. Naturalmente, el sistema de calefacción contendrá un horno, el cuál será la fuente de calor, y un regulador de flujo de calor, el cual controlará el flujo de calor, este enviará el calor a un cuarto a través del sistema de calefacción, o detendrá el calor al cuarto, según sea el caso. El calor será enviado a cualquier cuarto usando agua caliente: el cuarto que reciba el calor, abrirá la válvula de agua caliente. La Fig. 2 muestra el diseño del programa modelado en UMLGEC ++ y la ejecución del programa una vez generado el código fuente y completado con código C++ “a mano”. La compilación fue realizada en C++ Builder 5.0. Fig. 2. Diagrama de clases modelado en la herramienta UMLGEC ++ y ejecución del sistema “Home Heating System”. De la generación de código se puede decir: • A partir del diagrama se genera la estructura de las clases. • Se crean automáticamente: el constructor, el constructor de copia, el operador de asignación, las operaciones de igualdad y el destructor. • Todos los atributos y asociaciones son establecidos como privados independientemente de la visibilidad establecida por el usuario, pero el acceso a ellos está permitido mediante operaciones get y set generadas automáticamente para cada atributo o asociación, las cuáles adquieren la visibilidad correspondiente al atributo o asociación al que hacen referencia. • Se definen los cuerpos de las operaciones get y set, como funciones inline. • Para el caso de las asociaciones, cuando se trata de un rol con multiplicidad mayor a 1, el acceso a los objetos que participan en el se establece mediante el uso la STL de C++. 5. Conclusiones y trabajos a futuro El contenido presentado en este documento dio una perspectiva del seguimiento de la Ingeniería de Software mediante el UML y el Proceso Unificado para crear una herramienta CASE para diagramas de clase de UML; con la cuál, a través la correcta compilación y ejecución de las pruebas que se han hecho es posible concluir lo siguiente: Durante el desarrollo de este proyecto, nos damos cuenta de lo importante que es seguir un proceso formal y un lenguaje igualmente bien definido, que al final es de gran utilidad, ya que se crea una documentación fortalecida con una notación estándar cómo lo es el UML - que puede ser retomada después, y ampliar la construcción siguiendo cualquier metodología de desarrollo. Por eso, dentro de los desarrollos a futuro de esta herramienta se pueden considerar: • Aumentar la capacidad de soportar otros diagramas de UML, como los diagramas de secuencia, colaboración, de casos de uso, etc., y con ello soportar una mayor parte del ciclo de desarrollo del software y por tanto poder generar un código más completo. • Generación de código en otros lenguajes. Se pude crear diferentes plantillas de generación de código para otros lenguajes como Java, C#, etc. • Compatibilidad con otras herramientas CASE. La estructura de almacenamiento en archivo tiene como base el formato de los archivos .mdl de Rational Rose, aunque no es compatible con éste; pero la estructura para guardar un archivo puede ser modificada agregando o quitando información con el fin de ser compatible con algunas otras herramientas CASE existentes. Referencias [1] M. Fowler, UML Gota a Gota. Addison Wesley Longman de México, México, 1999. [2] G. Booch, "UML in Action", Communications of the ACM, 26 October 1999, Vol.42 No.10. pp. 26-28. [3] I. Jacobson, G. Booch, and J. Rumbaugh, El Proceso Unificado de Desarrollo de Software. Pearson Educación, Madrid, 2000. [4] Instituto Nacional de Estadística e Informática del Perú, Herramientas CASE, Sub-Jefatura de Informática -Dirección Técnica de Desarrollo Informático, Peru, 1999. http://www.uap.edu.pe/samples/demo/Libro-5103.pdf [5] C. Lokan, and G. Millar, "Methods for IS Development", Course Notes of Information Systems, School of Computer Science - University of New South Wales, 1999. http://www.cs.adfa.edu.au/teaching/studinfo/is1/Lectures/topic19.html [6] P. Salinas y N. Hitschfeld, Tutorial de UML, Departamento de Ciencias de la Computación Universidad de Chile. http://www.dcc.uchile.cl/~psalinas/uml/