<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>0012-7353</journal-id>
<journal-title><![CDATA[DYNA]]></journal-title>
<abbrev-journal-title><![CDATA[Dyna rev.fac.nac.minas]]></abbrev-journal-title>
<issn>0012-7353</issn>
<publisher>
<publisher-name><![CDATA[Universidad Nacional de Colombia]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S0012-73532007000300028</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[REGLAS PARA LA GENERACIÓN AUTOMÁTICA DE CÓDIGO DEFINIDAS SOBRE METAMODELOS SIMPLIFICADOS DE LOS DIAGRAMAS DE CLASES, SECUENCIAS Y MÁQUINA DE ESTADOS DE UML 2.0]]></article-title>
<article-title xml:lang="en"><![CDATA[RULES FOR AUTOMATED CODE GENERATION DEFINED OVER SIMPLIFIED METAMODELS OF CLASS, SEQUENCE AND STATE MACHINE DIAGRAMS OF UML 2.0]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[MUÑETÓN]]></surname>
<given-names><![CDATA[ANDRÉS]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[ZAPATA]]></surname>
<given-names><![CDATA[CARLOS M.]]></given-names>
</name>
<xref ref-type="aff" rid="A02"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[ARANGO]]></surname>
<given-names><![CDATA[FERNANDO]]></given-names>
</name>
<xref ref-type="aff" rid="A03"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Universidad Nacional de Colombia, sede Medellín Facultad de Minas Escuela de Sistemas]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<aff id="A02">
<institution><![CDATA[,Universidad Nacional de Colombia, sede Medellín Facultad de Minas Escuela de Sistemas]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<aff id="A03">
<institution><![CDATA[,Universidad Nacional de Colombia, sede Medellín Facultad de Minas Escuela de Sistemas]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>11</month>
<year>2007</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>11</month>
<year>2007</year>
</pub-date>
<volume>74</volume>
<numero>153</numero>
<fpage>267</fpage>
<lpage>283</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_arttext&amp;pid=S0012-73532007000300028&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_abstract&amp;pid=S0012-73532007000300028&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_pdf&amp;pid=S0012-73532007000300028&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[La generación automática de código a partir de modelos ha sido una de las promesas parcialmente cumplidas en el desarrollo de software. La experiencia de las herramientas CASE, aún distante del automatismo absoluto, se complementa con algunos trabajos teóricos que se alejan de los estándares de modelamiento. En este artículo se proponen reglas para la generación de código a partir de metamodelos de diagramas de clases, secuencias y máquina de estados de UML. Las reglas están definidas en lógica de primer orden, permitiendo una especificación donde se evitan las ambigüedades y la necesidad de aprender un lenguaje de programación específico. Mediante un caso de estudio se representa la aplicación de las reglas de transformación, generando el código fuente de una clase en el lenguaje orientado a objetos Java.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[Automatic code generation from models has been one of the partially accomplished promises in software development. CASE Tools experiences, even so far from complete automatism, are complemented by some theoretic works, which torn apart modeling standards. In this paper we propose code generation rules from metamodels of the UML class, sequence, and state machine diagrams. The rules are defined on first-order logic, in order to allow the construction of a specification where both ambiguity and the need of learning a programming language are avoided. We also represent the application of transformation rules by means of a case study, and we generate source code of a class in the Java object-oriented programming language.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[UML]]></kwd>
<kwd lng="es"><![CDATA[diagrama de clases]]></kwd>
<kwd lng="es"><![CDATA[diagrama de secuencias]]></kwd>
<kwd lng="es"><![CDATA[diagrama de estados]]></kwd>
<kwd lng="es"><![CDATA[reglas de transformación]]></kwd>
<kwd lng="es"><![CDATA[generación de código]]></kwd>
<kwd lng="es"><![CDATA[metamodelos]]></kwd>
<kwd lng="en"><![CDATA[UML]]></kwd>
<kwd lng="en"><![CDATA[class diagram]]></kwd>
<kwd lng="en"><![CDATA[sequence diagram]]></kwd>
<kwd lng="en"><![CDATA[state machine diagram]]></kwd>
<kwd lng="en"><![CDATA[transformation rules]]></kwd>
<kwd lng="en"><![CDATA[code generation]]></kwd>
<kwd lng="en"><![CDATA[metamodels]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align=center><font size="4" face="Verdana, Arial, Helvetica, sans-serif"><b>REGLAS  PARA LA GENERACIÓN AUTOMÁTICA  DE CÓDIGO DEFINIDAS SOBRE METAMODELOS SIMPLIFICADOS DE LOS DIAGRAMAS DE CLASES,  SECUENCIAS Y MÁQUINA DE ESTADOS DE UML 2.0</b></font></p>     <p align=center><b><font size="2" face="Verdana, Arial, Helvetica, sans-serif">RULES FOR AUTOMATED CODE GENERATION  DEFINED OVER SIMPLIFIED METAMODELS OF CLASS, SEQUENCE AND STATE MACHINE DIAGRAMS  OF UML 2.0</font></b></p>     <p align=center>&nbsp;</p>     <p align=center><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>ANDRÉS MUÑETÓN</b>    <br>  <i> Escuela de Sistemas, Facultad de Minas, Universidad Nacional de Colombia, sede Medellín. <a href="mailto:afmuneto@unal.edu.co">afmuneto@unal.edu.co</a></i></font></p>     <p align=center><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> CARLOS  M. ZAPATA</b>    <br>  <i> Escuela de Sistemas, Facultad de Minas, Universidad Nacional de Colombia, sede Medellín. <a href="mailto:cmzpata@unal.edu.co">cmzpata@unal.edu.co</a></i></font></p>     <p align=center><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> FERNANDO  ARANGO</b>    <br>  <i> Escuela de Sistemas, Facultad de Minas, Universidad Nacional de Colombia, sede Medellín. <a href="mailto:farango@unal.edu.co">farango@unal.edu.co</a></i></font></p>     <p align=center>&nbsp;</p>     ]]></body>
<body><![CDATA[<p align=center><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Recibido  para revisar  febrero 15 de  2007, aceptado abril 04 de 2007, versión final mayo 05 de 2007 </b></font></p>     <p align=center>&nbsp;</p> <hr>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><i>RESUMEN:</i></b> La  generación automática de código a partir  de modelos ha sido una de las promesas parcialmente cumplidas en el desarrollo  de software. La experiencia de las herramientas CASE, aún distante del automatismo  absoluto, se complementa con algunos trabajos teóricos que se alejan de los  estándares de modelamiento. En este artículo se proponen reglas para la generación  de código a partir de metamodelos de diagramas de clases, secuencias y máquina  de estados de UML. Las reglas están definidas en lógica de primer orden, permitiendo  una especificación donde se evitan las    ambigüedades y la necesidad de aprender  un lenguaje de programación específico.  Mediante un caso de estudio se representa  la aplicación de las reglas de transformación, generando el código fuente de  una clase en el lenguaje orientado a objetos Java.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><i>PALABRAS CLAVE: </i></b>UML,  diagrama de clases, diagrama de secuencias, diagrama de estados, reglas de  transformación, generación de  código, metamodelos. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><i>ABSTRACT:</i></b> Automatic  code generation from models has been one of the partially accomplished promises  in software development. CASE Tools experiences, even so far from complete  automatism, are complemented by some theoretic works, which torn apart modeling  standards. In this paper we propose code generation rules from metamodels  of the UML class, sequence, and state machine diagrams. The rules are defined  on first-order logic, in order to allow the construction of a specification  where both ambiguity and the need of learning a programming language are  avoided. We also represent the application of transformation rules by means  of a case study, and we generate source code of a class in the Java object-oriented  programming language.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><i>KEYWORDS:</i></b> UML, class diagram, sequence diagram,  state machine diagram, transformation rules, code generation, metamodels..</font></p>   <hr>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>1. INTRODUCCIÓN</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El ciclo de vida  del software contempla una serie de fases, denominadas: definición, análisis, diseño, implementación, despliegue,  pruebas y mantenimiento. En las cuatro primeras fases, se crean conjuntos de  diagramas con niveles de abstracción que decrecen a medida que avanza el proyecto  y que paulatinamente se van transformando en el código del software; este proceso  se suele denominar “refinamiento”. A pesar de las diferencias en los niveles  de abstracción, los diagramas de las diferentes fases deben representar el  mismo sistema, de manera que los conceptos del dominio del sistema que fueron  identificados en la fase de definición deben conservarse aún en la implementación  (véase la <a href="#fig01">Figura 1</a>). En síntesis, debe existir consistencia entre los diagramas  de las diferentes fases del proyecto.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig01"></a><img src="/img/revistas/dyna/v74n153/a28fig01.gif">    ]]></body>
<body><![CDATA[<br>   Figura       1.</b>&nbsp; Consistencia en el Refinamiento de Modelos a trav&eacute;s       de las fases de desarrollo de software    <br>  <b>Figure 1.&nbsp;</b> Consistency-in-Refinement of model throughout the software  development classes</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En teoría, si las fases de un proyecto son consistentes,   cualquier modificación que se realice en un modelo podría verse reflejada en   los demás; de esta forma, sería posible modificar el código fuente al hacer   cambios en los diagramas de diseño.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La directiva MDA  (Model-Driven Architecture—Arquitectura  Orientada por Modelos) del Object Management Group (OMG) propone dos tipos  de modelos, uno para la fase de análisis y otro para la fase de diseño, este último  derivado del primero (Mellor et al., 2004).  En MDA se utiliza el lenguaje  unificado de modelado UML para especificar los modelos. El modelo de la fase  de análisis es el PIM (Platform Independent Model), que es un modelo independiente  de la plataforma, lo cual significa que los diagramas que lo componen son vistas  del sistema construidas específicamente en términos del dominio.  El PIM es  la base para la construcción del modelo de la fase de diseño, que se conoce  como PSM (Platform Specific Model), el cual está compuesto por diagramas construidos  siguiendo los lineamientos no sólo de estructura y comportamiento del sistema,  sino también de una plataforma específica.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La <a href="#fig01">Figura       1</a> muestra  en la fase de análisis un PIM  y en la fase de diseño un PSM con diagramas de la plataforma Java y una plataforma  de bases de datos.  Nótese que en el PSM los conceptos del dominio del sistema  (Cliente con su identificación y nombre) son acompañados de términos propios  de cada plataforma utilizada, como los tipos de datos String y CHAR. Esto permite  que el PSM pueda servir como marco de referencia al código fuente. Por ejemplo,  la fase de implementación de la <a href="#fig01">Figura 1</a> muestra el código que podría obtenerse  del PSM.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A pesar de la  relación estrecha que existe entre  el PSM y la plataforma, existen diversas causas de inconsistencias que dificultan  la generación de código a partir del PSM. Algunas tienen que ver con modelos  mal planteados, desarrolladores incapaces de interpretar los modelos, o que  no se acogen a estos para generar el código.  Otras razones son la ambigüedad  sintáctica y semántica de UML (Grossman et al., 2005) y la falta de reglas  de transformación en las cuales existan asociaciones entre los elementos de  UML y los elementos o estructuras del lenguaje de programación.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las herramientas  CASE (Computer-Aided Software Engineering) han evolucionado y se han convertido  paulatinamente en herramientas que generan código de manera parcial, pero aún muy distante de un código completo  que pueda ser ejecutado en una plataforma específica. Otros trabajos han definido  de manera teórica cómo podría ser el código resultante de un conjunto de modelos,  pero no han llegado a su implementación.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En este artículo se propone un conjunto de reglas  de transformación para la obtención automática de código utilizando como punto  de partida modelos PSM; se utilizan metamodelos de los diagramas de clases,  secuencias y máquina de estados de la versión 2.0 de  UML, como marco de referencia  conceptual para la descripción de los diagramas y expresión de las reglas de  transformación. Las reglas se describen en Lógica de Predicados de Primer Orden  (Morgan, 1998) y se ejemplifica su uso en un caso de estudio.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Este artículo está organizado así: en la Sección  2 se presenta el estado del arte en generación de código fuente y las limitaciones  que se presentan. A partir de la Sección 3 se ofrece una propuesta de generación  de código a partir de metamodelos del lenguaje unificado de UML, sobre los  cuales se generan reglas de transformación a código, presentadas en la Sección  4.  Estas reglas son aplicadas a un caso de estudio en la Sección 5.  Finalmente,  en la Sección 6 se discuten las conclusiones y trabajo futuro.  </font></p>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>2. GENERACIÓN  AUTOMÁTICA DE CÓDIGO</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La generación automática de código ha sido parte  de la historia de la programación. El primer compilador significó el inicio  de la carrera en la búsqueda de herramientas para posibilitar la programación  de computadores, en un nivel de abstracción cada vez más asequible a la interpretación  humana. De esta forma, el ensamblador permitió la transición de los unos y  ceros del lenguaje de máquina, a la manipulación de registros mediante operaciones  identificadas con palabras de fácil recordación para el programador. A su vez,  no siendo suficientemente sencillo de utilizar, el ensamblador dio paso a los  lenguajes de alto nivel y por ende a herramientas que permitieron la transformación  automática de los programas escritos con estos lenguajes en un programa interpretable  por la máquina.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Adicional a los  lenguajes de alto nivel, actualmente los equipos de desarrollo cuentan con  lenguajes de modelado, los cuales posibilitan la construcción de modelos que, a diferencia del código, se convierten en herramientas  de comunicación de fácil interpretación.  Estos lenguajes de modelado son serios  candidatos a contribuir en la evolución de la generación de código.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">UML es el lenguaje  de modelado de mayor uso en la actualidad.  Con UML es posible modelar los aspectos estáticos y dinámicos  de un sistema, y en diferentes niveles de detalle, como puede suceder con MDA  y sus modelos PIM y PSM.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Ya que el PSM  tiene una fuerte relación con la  plataforma, puede ser un modelo de considerable utilidad en la generación automática  de código a partir de un lenguaje de una abstracción superior, como lo es UML,  a  los lenguajes de alto nivel de la actualidad.   </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Kepple <i>et al. </i>(2003)  definen los elementos necesarios en la transformación de un lenguaje a otro, que son un par de conjuntos  que representan al lenguaje fuente y al lenguaje objetivo de la transformación,  y que contienen los elementos de estos lenguajes. Además, deben existir relaciones  entre los elementos de ambos conjuntos, de forma tal que todo elemento del  conjunto fuente pueda encontrar su representación en al menos un elemento del  conjunto objetivo. En el caso particular de UML, parte de las relaciones necesarias  se han presentado en herramientas CASE comerciales y académicas, y trabajos  de orden académico.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En el primer grupo, el de las herramientas CASE,  se pueden mencionar Togeteher<sup>TM</sup> (Together, 2006), Rational Rose<sup>TM</sup> (Rose,  2006) y Fujaba (Fujaba, 2006; Geiger y Zündorf, 2006), esta  última desarrollada en la Universidad de Panderborn, Alemania. Como característica  común, estas herramientas permiten la generación de código a partir del diagrama  de clases con resultados muy similares, apreciables en la estructura del código,  la cual está formada por la declaración de las clases, atributos y operaciones.  La obtención de código a partir de diagramas de comportamiento no es posible  en Rational Rose<sup>TM</sup>; mientras tanto, en Together<sup>TM</sup> se  logra con diagramas de secuencias y en Fujaba con los Story Diagrams, que fueron  creados por el grupo Fujaba y son la combinación de diagramas de actividades  y diagramas de comunicación.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En Together<sup>TM</sup> y Fujaba<sup>TM</sup>,  el código generado a partir de un diagrama de comportamiento es relacionado  con elementos propios de la implementación de las operaciones de las clases,  esto es, el cuerpo de los métodos.  Esto se debe a que en el comportamiento  se modela la interacción entre los objetos del sistema, lo cual implica la  creación de objetos, la invocación de métodos de otros objetos o del objeto  mismo, y justamente este tipo de acciones son parte del cuerpo de los métodos.  El diagrama de secuencias es un diagrama de comportamiento de UML que por su  estructura y sus elementos, especialmente los fragmentos combinados que ofrecen  la representación de decisiones, ciclos, excepciones, entre otras, se utiliza  como una especie de “algoritmo gráfico” que permite la generación de estructuras <i>if-then-else</i>,  ciclos <i>for</i> o <i>while</i>, además de la creación de objetos y las llamadas  a métodos de otros objetos o del objeto mismo. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En el segundo grupo, en Long <i>et al.</i> (2005)  y Long y Zhiming (2005) se define rCOS (Relational Calculus for Object Systems),  una formalización de un lenguaje orientado a objetos que permite especificar  formalmente modelos UML. De manera similar en Laleau y Mammar (2005), se utiliza  el Método-B como elemento de representación formal de los modelos y como punto  intermedio a la generación de código. Al igual que las herramientas CASE, estos  tipos de trabajo ofrecen transformaciones a partir del diagrama de clases y  a partir de diagramas de comportamiento, específicamente del diagrama de secuencias.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si se pretende  generar código fuente a partir de  modelos PSM, entonces tanto el PSM como el código, siendo éste el modelo de  la fase de implementación, deben representar el sistema bajo estudio, en sus  aspectos estáticos y dinámicos. Esto implica que un modelo PSM no debe estar  compuesto  únicamente por diagramas de clases, sino también por diagramas de comportamiento,  como pueden ser los diagramas de secuencias y estados. Adicionalmente, las  reglas de transformación de modelo a código deben estar definidas en una especificación  que no de lugar a ambigüedades y deben poder ser programables para su uso.  Tanto Together<sup>TM</sup> como Fujaba<sup>TM</sup>, utilizan diagramas de  comportamiento y de estructura para la generación de código fuente; ambas herramientas  incluyen adiciones a los diagramas, no pertenecientes al estándar UML, que  tienen como finalidad facilitar la obtención de código de ciertas estructuras  de programación como los ciclos de repetición, las estructuras de decisión,  o como ocurre en Fujaba<sup>TM</sup>, sentencias como la declaración de variables  y operaciones aritméticas entre variables, entre otras. El uso de elementos  por fuera del estándar, ocasiona que el equipo de desarrollo dependa únicamente  de la herramienta que implemente estos elementos y que se deba adaptar a los  cambios sintácticos ocasionados en el lenguaje debido a estas adiciones (la  migración a otra herramienta podría implicar la repetición de todos los modelos),  lo cual puede complicar la comunicación con los miembros del equipo de desarrollo  o miembros externos de apoyo al proyecto.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las reglas de  transformación ofrecidas por los  trabajos enfocados en la formalización de UML se enfocan en sistemas de bases  de datos, por ejemplo Laleau y Mammar (2005), y se utilizan para obtener código  genérico, como la inserción de datos en una tabla; en otros casos, estas reglas  están definidas en términos del lenguaje utilizado para formalizar UML y no  sobre el lenguaje mismo, dificultando el entendimiento de las reglas por parte  de los desarrolladores. Adicionalmente, no se ofrecen aún herramientas que  permitan validar las reglas presentadas.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En este artículo se proponen reglas de transformación  para PSMs compuestos de diagramas de carácter estructural, como el diagrama  de clases, y de carácter dinámico como el diagrama de secuencias y el diagrama  de máquina de estados. Las reglas están definidas sobre el metamodelo de UML,  con lo cual se dispone de una estructura abstracta, independiente de cualquier  modelo de usuario, y que además ofrece vínculos entre los diferentes diagramas  utilizados en la generación de código.  Estas reglas se especifican en cálculo  de predicados de primer orden (Morgan, 1998), lo que las hace fáciles de entender  y suficientemente genéricas para ser programadas y útiles en la generación  de código en diferentes lenguajes de programación.  </font></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>3. METAMODELOS  UML COMPRIMIDOS</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La especificación de UML, compuesta por la superestructura  (OMGa, 2006) y la infraestructura (OMGb, 2006),  define la sintaxis abstracta  del lenguaje de modelado, presenta restricciones definidas en OCL que se aplican  a la sintaxis y describe en lenguaje natural la semántica de UML.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La sintaxis del  lenguaje, definida en UML, se conoce como metamodelo de UML y sus componentes  como metaclases. Estas metaclases están relacionadas unas con otras, indicando qué elementos puede tener cada  diagrama UML y cómo pueden relacionarse estos elementos. El metamodelo es complementado  con restricciones especificadas en OCL.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La sintaxis de  UML ofrece una extensa jerarquía  de herencia de metaclases, en la cual se agregan atributos, relaciones y restricciones  en cada nivel. Esto quiere decir que para conocer todos los posibles atributos  y relaciones que puede tener una metaclase, por ejemplo la metaclase que representa  las clases, es necesario revisar cada uno de los niveles de la jerarquía de  generalización (que puede ser múltiple), y las relaciones entre las metaclases  que aparecen en cada nivel. Por ejemplo, el atributo <i>name </i>de la metaclase <i>Class</i>,  es un atributo heredado de la metaclase <i>NamedElement</i>, la cual está  cuatro niveles arriba en la jerarquía.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Una solución a esta complejidad es comprimir los  metamodelos de los diagramas UML seleccionando un conjunto de metaclases representativas  (según criterios mencionados adelante en esta Sección) de cada diagrama y que  contengan los atributos y relaciones de las metaclases que especializaron,  esto es, de sus metaclases madres. A estos nuevos metamodelos, propuestos en  este artículo para facilitar la traducción de los modelos a código, se les  denominará en adelante &quot;Metamodelos Comprimidos&quot;.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A continuación se proponen los metamodelos comprimidos  de los diagramas de clases, secuencias y máquina de estados que servirán como  fuente de definición de las reglas de transformación al código.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>3.1 Metamodelo del Diagrama de Clases </b>    ]]></body>
<body><![CDATA[<br>  La <a href="#fig02">Figura 2</a> presenta el metamodelo comprimido  del diagrama de clases de UML. Los elementos más comunes de este diagrama son  las clases, con sus atributos y operaciones, y las relaciones entre clases,  que incluyen la generalización y la asociación, con las variaciones que ésta  puede tener como es la composición y la agregación. Por este motivo, se eligieron  como elementos representativos del diagrama de clases las metaclases presentadas  en la <a href="#fig02">Figura 2</a>. </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig02"></a><img src="/img/revistas/dyna/v74n153/a28fig02.gif">    <br>   Figura  2. </b> Metamodelo  comprimido del Diagrama de Clases    <br>  <b>Figure  2.</b>  Compressed  Metamodel of the Class Diagram</font></p>        <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Es importante  tener en cuenta los atributos (multiplicidad y rol) de las relaciones entre  las metaclases, y así se verá más adelante en  las reglas de transformación. Por el momento, es necesario considerar que: </font></p> <ul>      <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Toda  instancia de la metaclase <i>Class</i> tiene asociado un conjunto de atributos  y otro de operaciones, a los cuales se puede acceder utilizando  los atributos de <i>Class ownedAttributes </i>y <i>ownedOperations </i>respectivamente.  </font></li>      <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si  una clase es la especialización de otra, la relación entre ambas clases se  dará  mediante una instancia de la metaclase <i>Generalization</i>. Por la navegabilidad  de las relaciones, una clase general (véase rol <i>general</i> en la <a href="#fig02">Figura  2</a>) no puede tener acceso a las clases que la especializan pero, en cambio,  las clases especializadas pueden tener acceso a la clase general utilizando  los atributos <i>generalization</i> y <i>general</i> de la relación entre  instancias del metamodelo así: </font>      <blockquote>      <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>ClaseGeneral = self.generalization.general</i></font></p>      <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Donde <i>self</i> es  la clase especializada que desea saber cuál es su clase madre. </font></p>  </blockquote>  </li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si  hay más de una clase especializada, la metaclase <i>GeneralizationSet</i> pemite  identificar el conjunto de clases que hacen parte de una misma generalización.   </font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El metamodelo  de UML no establece una relación  de generalización directa entre las metaclases <i>Type </i>y <i>Class</i>,  pero se presenta acá como tal, dando a entender que el tipo de un atributo  o una operación puede ser una clase.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> La <a href="#fig03">Figura       3</a> presenta una instancia del metamodelo  del diagrama de clases. La instancia a1 de la metaclase <i>Association</i> representa  la relación entre las clases <i>Customer</i> y <i>Order</i>. Nótese que la  asociación no se relaciona directamente con las clases sino con propiedades  cuyos tipos son las clases de la relación.  Estas propiedades, <i>p5</i> y <i>p6</i>,  equivalen a los roles en el diagrama de clases.   </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig03"></a><img src="/img/revistas/dyna/v74n153/a28fig03.gif">    <br>   Figura       3.</b> Instancia del metamodelo del diagrama de clases    <br>  <b>Figure 3.</b>&nbsp; Metamodel Instante of the&nbsp; Class Diagram </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la <a href="#fig03">Figura       3</a> también  se puede ver que la clase <i>Order</i> tiene  una operación llamada <i>setNumber</i>, con un parámetro llamado <i>number</i> de  tipo <i>String</i>.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>3.2  Metamodelo  del Diagrama de Secuencias    <br> </b>El metamodelo de la <a href="#fig04">Figura  4</a>, muestra las metaclases del diagrama de secuencias necesarias para generar  modelos de interacción entre  objetos mediante el paso de mensajes para la invocación de operaciones y el  uso de fragmentos combinados.  Estos fragmentos, representados por la metaclase <i>CombinedFragment</i>,  permiten modelar interacciones especiales como ciclos, decisiones, excepciones, entre otras.</font></p>     ]]></body>
<body><![CDATA[<p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig04"></a><img src="/img/revistas/dyna/v74n153/a28fig04.gif">    <br>   Figura       4.</b> Metamodelo Comprimido del Diagrama de Secuencias    <br>  <b>Figure 4.</b>&nbsp; Compressed Metamodel &nbsp;of the Sequence Diagram </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las líneas de vida del diagrama de secuencias están   representadas por las instancias de la metaclase <i>Lifeline</i>, vinculadas   con los mensajes que componen la interacción mediante la metaclase <i>OcurrenceSpecification</i>.   Las instancias de esta metaclase son los puntos de enlace entre el mensaje   y la línea de vida, por lo que, como se ve en la <a href="#fig04">Figura 4</a>, todo mensaje tiene   relación con dos <i>OcurrenceSpecification</i>, una que indica el origen del   mensaje y otra el destino. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> La <a href="#fig05">Figura       5</a> muestra  una instancia del metamodelo del diagrama de secuencias. La interacción representada tiene dos líneas  de vida, <i>lf1</i> y <i>lf2</i>, las cuales están interactuando mediante  el mensaje <i>m1</i>,  que transporta la operación <i>op1</i>. El valor del parámetro de <i>op1</i> está dado  por el atributo <i>symbol</i> de la instancia de la metaclase <i>Expression</i>.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig05"></a><img src="/img/revistas/dyna/v74n153/a28fig05.gif">    <br>   Figura       5.</b> Instancia Metamodelo del Diagrama de Secuencias    <br>  <b>Figure&nbsp; 5.</b>&nbsp; Metamodel Instance of the&nbsp; Sequence Diagram</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Debido a que la  línea de  vida <i>lf1</i> está relacionada  con la <i>OcurrenceSpecification</i> marcada con el rol <i>sendEvent</i>, se  puede deducir que esta línea de vida es quien está enviando el mensaje <i>m1</i>.  Similarmente, se deduce que <i>lf2</i> es la línea de vida que recibe el mensaje  por tener relación con <i>oc2</i>, la instancia de <i>OcurrenceSpecification</i> marcada  con el rol <i>receiveEvent</i>. </font></p>       <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Es importante  anotar el vínculo formado entre los  metamodelos de secuencias y clases gracias a la presencia en ambos de las metaclases  Property y Operation. Al existir esta relación, es posible conocer las clases  propietarias de las operaciones transportadas en los mensajes y/o validar la  consistencia entre los modelos. Por ejemplo, en la <a href="#fig05">Figura 5</a> aparecen las instancias  c2 y c3 de <i>Class</i>, también presentes en la instancia del metamodelo del  diagrama de clases presentado en la <a href="#fig03">Figura 3</a>.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El metamodelo  de la <a href="#fig04">Figura 4</a>, además  de comprimido, se modificó adicionándole la relación entre las metaclases <i>InteractionOperand</i> y <i>Message</i>.  La  relación entre estas metaclases, la cual no existe en la especificación de  UML (OMG1, 2006) se propone como necesaria para la generación de código a partir  de modelos que incluyan fragmentos combinados. En un diagrama de secuencias,  un fragmento combinado actúa como agrupador de mensajes sobre los cuales tendrá efecto  de acuerdo a su tipo. Por ejemplo, si es un fragmento combinado de tipo <i>alt</i>,  entonces se tendrán dos conjuntos mutuamente excluyentes de mensajes; uno será  tenido en cuenta sí y sólo si se cumple la condición booleana asociada al fragmento  combinado, y el otro en el caso contrario (véase la <a href="#fig10">Figura  10</a>).  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El metamodelo del diagrama de secuencias relaciona  las metaclases <i>CombinedFragment</i> e <i>InteractionOperand</i>, lo cual  permite especificar cuántos conjuntos de mensajes conforman un fragmento combinado  (cuántas instancias de <i>InteractionOperand</i> están asociadas con el <i>CombinedFragment</i>)  y las condiciones que representan a cada conjunto (mediante la relación entre <i>InteractionOperand</i> e <i>InteractionConstraint</i>).  A  pesar de esto, el metamodelo no ofrece una relación que permita deducir cuáles  mensajes hacen parte de estos conjuntos. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El único vínculo  entre <i>InteractionOperand</i> y <i>Message</i> se  presenta mediante la metaclase <i>Gate</i>. Las instancias de <i>Gate</i> actúan  como reemplazo de <i>OcurrenceSpecification</i> si un mensaje tiene alguno  de sus extremos en un fragmento combinado; en otras palabras, dichas instancias  sirven de vínculo entre el fragmento combinado y su entorno.  Debido a esto,  no es posible considerar los mensajes contenidos en el fragmento combinado.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En conclusión, es necesario establecer una relación  entre la metaclase que representa cada conjunto de mensajes del fragmento combinado,  la cual es <i>InteractionOperand</i>, y los mensajes, representados por la  metaclase <i>Message</i>.   </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>3.3 Metamodelo  del Diagrama de Máquina de Estados</b>    <br>  La <a href="#fig06">Figura 6</a> muestra un diagrama de máquina de  estados general, con dos estados: Estado0 y Estado1 y los elementos que pueden tener estos estados y la transición que los vincula. </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig06"></a><img src="/img/revistas/dyna/v74n153/a28fig06.gif">    <br>   Figura       6.</b> Diagrama de m&aacute;quina de estados general    <br>  <b>Figure&nbsp; 6.</b>&nbsp; General State Machine Diagram</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La <a href="#fig07">Figura       7</a> muestra  el metamodelo comprimido del diagrama de máquina de estados. Este metamodelo dispone de las metaclases necesarias  para desarrollar modelos con los elementos de la <a href="#fig06">Figura 6</a>. Los estados están  representados por la metaclase <i>State</i>, excepto por el estado final que  es un pseudoestado de tipo <i>initial</i>, y el estado final que es instancia  de la metaclase <i>FinalState</i>, una especialización de <i>State</i>.  Los  bloques <i>entry</i>, <i>doActivity</i> y <i>exit</i> son instancias de la  metaclase <i>FunctionBehavior</i> y las transiciones son instancias de la metaclase <i>Transition</i> o <i>ProtocolTransition</i>.  Si la transición tiene una lista de operaciones, entonces es instancia de <i>ProtocolTransition</i>;  de lo contrario, es instancia de <i>Transition</i>. La metaclase <i>Trigger</i> representa  los eventos y <i>Constraint</i> el guarda de la transición. La metaclase <i>Region</i> es  un contenedor de estados y transiciones, y un conjunto de regiones componen  una máquina de estados representada por la metaclase <i>StateMachine</i>.  </font></p>       ]]></body>
<body><![CDATA[<p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig07"></a><img src="/img/revistas/dyna/v74n153/a28fig07.gif">    <br>   Figura  7.</b> Metamodelo  Comprimido del Diagrama de Máquina de Estados    <br>  <b>Figure 7.</b>  Compressed Metamodel of the State Machine Diagram </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nótese que, al igual que el metamodelo del diagrama  de secuencias, este metamodelo también está vinculado con el metamodelo del  diagrama de clases mediante la metaclase <i>Operation</i>, posibilitando nuevamente  el chequeo de consistencia con los demás diagramas.</font></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>4. REGLAS  DE TRANSFORMACIÓN  Y DE INTEGRACIÓN</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A partir de los  metamodelos presentados en la Sección  anterior, se proponen reglas que permiten relacionar cada instancia del metamodelo,  es decir, cada diagrama convencional, con el código fuente que puede obtenerse  a partir de éste. Las reglas son expresadas en lógica de primer orden con el  fin de ofrecer una solución general adaptable a diferentes lenguajes de programación  orientado a objetos como Java o C#.    </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Cada regla está compuesta por relaciones condicionales,  en las cuales el consecuente representa el código que se puede obtener del  elemento sobre el cual fue aplicada la regla. Este código se presenta para  cada diagrama en los elementos que lo componen utilizando la sintaxis definida  por el OMG para los diagramas UML.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.1 Reglas  de Transformación  a Partir del Diagrama de Clases </b>    <br>  El principal elemento del diagrama de clases es  la clase.  Por este motivo, las reglas de transformación se definen a partir  de este elemento. La <a href="#fig08">Figura 8</a> presenta una clase con la representación tradicional  de UML, pero el contenido de cada casilla (nombre de la clase, atributos, operaciones)  se especifica con la sintaxis definida por el OMG.  </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se presenta una única clase, sin asociaciones con  otras clases, considerando que las asociaciones son modificadoras de la definición  de las clases que vinculan. Así, la relación de herencia modifica la definición  de la clase y una relación de asociación con otra clase implica la aparición  de un nuevo atributo en alguna o todas las clases relacionadas. </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig08"></a><img src="/img/revistas/dyna/v74n153/a28fig08.gif">    <br>   Figura  8.</b>  Sintaxis  de una clase    <br>  <b>Figure 8.</b>  Syntax of a Class </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Cada casilla está compuesta por elementos sintácticos.  La  primera casilla, por ejemplo, indica que el nombre de una clase tiene un identificador  llamado <i>ClassName </i>que puede estar acompañado de la palabra <i>Abstract</i> si  la clase es abstracta, y/o del símbolo :: seguido del nombre de la clase general  de la clase actual, en caso de existir una relación de generalización.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las reglas que  permiten obtener, para un diagrama de clases dado, la estructura sintáctica  presentada en la <a href="#fig08">Figura 8</a> son las siguientes:</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R1_ABS - Regla esAbstracta:</i> Todas las instancias  de la metaclase <i>Class</i> cuyo atributo <i>isAbstract</i> sea verdadero,  serán clases abstractas.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;c&#8712;Class(c.isAbstract &#8658; ‘abstract’)</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R2_NOMC - Regla NombreClase:</i> El atributo <i>name</i> de  las instancias de la metaclase <i>Class</i>, será el nombre de la clase. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;c&#8712;Class &#8658; c.name</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R3_GEN - Regla claseGeneral</i>: Si la clase <i>c</i> es  el extremo <i>specific</i> de una relación de generalización <i>g</i>, entonces <i>c</i> tiene  una clase general y esta clase es el extremo <i>general</i> de la generalización <i>g</i>.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;c&#8712;Class((&#8707;g&#8712;Generalization  &#8729; g.specific = c) &#8658; g.general)</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R4_ATTRP - Regla atributos propios de la clase</i>:  Los atributos propios de una clase son aquellos que se obtienen por la relación  entre las superclases <i>Class</i> y <i>Property</i>. Una propiedad <i>p</i>,  instancia de la metaclase <i>Property</i>, es atributo de una clase <i>c</i> si  el atributo <i>class</i> de <i>p</i> es igual a  <i>c</i>. La multiplicidad,  visibilidad, tipo y nombre de <i>p</i> están dados por sus atributos <i>upper</i>, <i>visibility</i>, <i>type</i> y <i>name</i> respectivamente. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si la multiplicidad es mayor que 1, la clase <i>c</i> tendrá un  conjunto de atributos <i>p</i>. Si la multiplicidad es igual a 1, entonces  la clase <i>c</i> tendrá un sólo atributo <i>p</i>.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;c&#8712;Class&#8704;p&#8712;Property &#8729;  p.class = c &#8658;    <br>  (    <br> //si la multiplicidad es 1, el tipo permanece sin cambios    <br> p.upper=1 &#8658;(p.visibility p.type.name p.name ‘;’)    <br> &#8744;    <br> //si la multiplicidad es mayor que 1, el tipo es un conjunto de elementos de Type    ]]></body>
<body><![CDATA[<br> p.upper&gt;1 &#8658; (p. visibility (p.type.name)&#8473; p.name ‘;’    <br> )    <br> <i>R5_ATTRA - Regla atributos por asociación </i></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Considere el modelo  de la <a href="#fig09">Figura 9</a>.  La relación  entre las clases Pedido y Cliente indica que la clase Remisión tendrá  un atributo de tipo Cliente cuyo nombre es cliente, y de igual forma, la clase  Cliente tendrá un atributo de tipo Pedido cuyo nombre es pedido. Sin embargo,  nótese en la parte inferior de la <a href="#fig09">Figura 9</a>, que no hay relación entre la clase  de un extremo de la asociación y el atributo del otro extremo. La especificación  UML, por lo tanto, no considera ni gráficamente, ni mediante restricciones  sobre las clases, la relación acá señalada; por ello, se deben obtener los  atributos de una clase derivados de una relación, indirectamente navegando  sobre las relaciones entre las instancias que forman la relación.   </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig09"></a><img src="/img/revistas/dyna/v74n153/a28fig09.gif">    <br>   Figura  9.</b></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> Relación  entre un modelo de usuario y una instancia del metamodelo    <br>  <b>Figure 9.</b>  Relationship between a user model and a metamodel instance</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Utilizando la  relación entre las propiedades y  la asociación, es posible obtener para cada clase un atributo cuyo tipo es  la clase del extremo contrario. Por ejemplo, el atributo cliente de la clase  Pedido se obtendrá a partir de la asociación a y su relación con la propiedad <i>p2</i> llamada <i>ownedEnd</i>.  Teniendo <i>p2</i> es posible tener su nombre, tipo (relación <i>type</i>),  visibilidad, y demás elementos requeridos para obtener atributos de una clase.  Esto  se representa de forma general así: </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;c&#8712;Class(&#8707;a&#8712;Association  &#8729; (&#8707;p&#8712; a.ownedAttributes).type = c Ù    <br>  |a. ownedAttributes|=2)    ]]></body>
<body><![CDATA[<br>  &#8658;    <br>  (    <br>  //si la multiplicidad es 1, el tipo permanece sin cambios    <br>  p’.upper=1 &#8658;( p’.visibilidad p’.Type.name p’.name ‘;’)    <br>  &#8744;    <br>  //si la multiplicidad es mayor que 1, el tipo es un conjunto de elementos  de Type    <br>  p’.upper&gt;1 &#8658; (p’.visibilidad (p’.Type.name)&#8473; p’.name ‘;’    <br>  ) &#8729;(p’ =  ownedAttributes - {p})</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la regla anterior,  se selecciona una asociación  en la cual al menos uno de sus dos extremos tiene como tipo la clase actual.  Luego, para obtener la visibilidad, tipo, nombre y valor por defecto del atributo,  se obtiene el otro extremo de la asociación mediante la especificación p’ = <i>ownedAttributes</i> -  {p}, donde <i>ownedAttributes</i> es el conjunto de propiedades relacionadas  con la asociación.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En esta regla  no se consideran las clases de asociación,  motivo por el cual se evalúa inicialmente que la asociación tenga dos extremos.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R6_OP - Regla operaciones propias de la clase:</i> Las  operaciones de una clase se obtienen a partir de la relación entre las metaclases <i>Class</i> y <i>Operation</i>.  El  tipo de la operación se obtiene de la relación entre las metaclases <i>Operation</i> y <i>Type</i>;  y los parámetros se obtienen de la relación entre <i>Operation</i> y <i>Parameter</i>.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Una operación <i>o</i>, instancia de la metaclase <i>Operation</i>,  es operación de la clase <i>c</i> si el atributo <i>class</i> de <i>o</i> es  igual a <i>c</i>.  La visibilidad, tipo y nombre de la operación <i>o</i> está dado  por sus atributos <i>visibility</i>, <i>type</i> y <i>name</i>  respectivamente.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Un parámetro <i>ownedParameter</i>, instancia de  la metaclase <i>Parameter</i>, es parámetro de la operación <i>o</i> si el  atributo <i>operation</i> de <i>ownedParameter</i> es igual a <i>o. </i>El  tipo y nombre de <i>ownedParameter</i> están dados por sus atributos <i>type</i> y <i>name</i> respectivamente. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para todas las operaciones <i>o</i> de <i>c,</i> se  selecciona la visibilidad, tipo y nombre de la operación.  Además, se seleccionan  todos los parámetros de la operación <i>o</i>.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;c&#8712;Class&#8704;o&#8712;Operation &#8729; o.class  = c &#8658;    <br> (    <br> //visibilidad tipo nombre (parámetros)    <br> o.visibility o.type.name o.name ‘(‘    <br> &#8704;ownedParameter&#8712;Parameter &#8729; ownedParameter.operation = o &#8658;    <br> //tipo parámetro nombreParametro    ]]></body>
<body><![CDATA[<br> ownedparameter.type.name    <br> ownedparameter.name‘){‘    <br> ‘}’    <br> ) </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.2 Reglas  de Transformación  a Partir del Diagrama de Secuencias.</b>    <br>  <i>R7_NEWO - Regla Creación de Objetos:</i> La  creación de objetos se representa en el diagrama de secuencias con los mensajes  de tipo <i>createMessage</i>, que gráficamente se representan con la palabra  clave <i>&lt;&lt;create&gt;&gt;</i>. La siguiente regla permite generar código  de creación de objetos. El tipo y nombre del objeto que se desea crear se obtiene  a partir de las líneas de vida, o instancias de la metaclase <i>Lifeline</i>.   </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si <i>m</i>, instancia de la metaclase <i>Message</i>,  es de tipo <i>createMessage</i>, entonces se debe crear un objeto cuyo tipo  y nombre se obtienen a partir del atributo <i>covered</i>.<i>represents</i> de <i>m</i>.  Los argumentos del constructor del objeto son los argumentos de <i>m</i> dados  por su atributo <i>argument</i>.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;m&#8712;Message &#8729; m.messageSort  = MessageSort.createMessage &#8658;    <br>  //tipo variable    <br> m.receiveEvent.covered.represents.type.name    ]]></body>
<body><![CDATA[<br> //nombre objeto    <br> m.receiveEvent.covered.represents.name    <br> //operador new    <br> ‘= new ‘    <br> //constructor    <br> m.receiveEvent.covered.represents.type.name ‘(‘    <br> //argumentos del constructor    <br> &#8704;e&#8712;Expression &#8729; e = m.argument &#8658; e.symbol ‘);’</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R8_CALLOP -  Regla invocación  de operaciones:</i> La  operación invocada por un objeto puede pertenecer al objeto mismo o a otro.  En este último caso, la regla valida si la visibilidad de la operación es privada,  lo cual impide que sea accedida por objetos diferentes al que la contiene.  No se considera el alcance de los modificadores de acceso <i>public</i> y <i>protected</i>,  por lo cual se considera como accesible toda operación que tenga alguno de  estos modificadores.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Un mensaje <i>m</i> es  enviado desde una línea  de vida referenciada por el atributo <i>sendEvent</i> de <i>m</i>, y es recibido  por una línea de vida referenciada por el atributo <i>receiveEvent</i> de <i>m.</i>  </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si las líneas de vida de envío y recepción  de <i>m</i> son  diferentes, entonces la operación <i>o,</i> enviada por <i>m</i> pertenece  al objeto representado por la línea de vida de recepción, es decir, por <i>receiveEvent</i>.  Si son iguales, entonces el objeto representado por las líneas de vida es el  mismo.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El tipo y nombre  de la operación <i>o</i> están  dados por sus atributos <i>type</i> y <i>name</i> respectivamente. Los argumentos  pasados a <i>o</i> son los argumentos de <i>m</i> dados por su atributo <i>argument</i>.  Si  la operación tiene tipo, entonces retorna un valor cuyo tipo es el mismo tipo  de la operación.   </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;m&#8712;Message &#8729;    <br> (    <br> //operación de otro objeto    <br> ~(m.sendEvent = m.receiveEvent) &#8896; (&#8707;o&#8712;  m.receiveEvent.covered.represents.type.ownedOperation &#8729; o = m.signature) &#8896;  ~(o.visibility=private) &#8658;    <br>  (~(o.type = Ø) &#8658;    <br> //tipo    <br> o.type.name ‘var_’+o.type.name ‘=’) &#8896;    <br> //invocación de la operación    ]]></body>
<body><![CDATA[<br> m.receiveEvent.covered.represents.name ‘.’ m.signature.name ‘(‘    <br> //parámetros de la operación invocada    <br> &#8704;e&#8712;Expression &#8729; e &#8712; m.argument &#8658;    <br> e.symbol‘); ’    <br> )    <br> V    <br>  (    <br> //operación del objeto actual    <br> (m.sendEvent = m.receiveEvent &#8896; (&#8707;o&#8712; m.receiveEvent.covered.represents.type.ownedOperation &#8729; o = m.signature)) &#8658;    <br> ~(o.type = Ø) &#8658;    ]]></body>
<body><![CDATA[<br> //tipo    <br> o.type.name ‘var_’+o.type.name ‘=’) &#8896;    <br> //invocación de la operación    <br> self ‘.’ m.signature.name ‘(‘&#8704;e&#8712;Expression &#8729; e &#8712; m.argument &#8658;    <br> e.symbol‘); ’    <br> )</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La disyunción de la regla permite discernir entre  la invocación de operaciones de otro objeto, o del objeto mismo que envía el  mensaje, caso en el cual se utiliza el operador <i>self</i> para hacer referencia  al objeto invocador. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R9_IF - Regla  Sentencias de Decisión (if – then – else):</i>La  <a href="#fig10">Figura 10</a> muestra un diagrama de secuencias en el cual se utiliza un fragmento  combinado alt para decidir si se debe invocar la operación <i>op1()</i> o la  operación <i>op2()</i> de acuerdo a una condición booleana dada por <i>guard</i>.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La siguiente regla  aprovecha las características  del fragmento combinado <i>alt</i> para generar código que contenga la estructura  de decisión <i>if-then-else</i>.  </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig10"></a><img src="/img/revistas/dyna/v74n153/a28fig10.gif">    ]]></body>
<body><![CDATA[<br>   Figura  10.</b> Fragmento  Combinado “Alt”    <br> <b>Figure 10.</b> The “Alt” Combined Fragment </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El tipo de un fragmento combinado <i>f</i> está dado  por su atributo <i>interactionOperator</i>.  Si el tipo de <i>f</i> es <i>alt</i>,  entonces <i>f</i> estará compuesto por instancias <i>o, o', ..., o<sup>n</sup></i>,  de la metaclase <i>InteractionOperand</i>, que representan la estructura <i>if-then-else</i>.  La condición <i>if</i> está  representanda por una expresión booleana, llamada guarda que es referenciada  por el atributo <i>guard</i> de <i>InteractionOperand</i>.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las operaciones de cada bloque de la estructura <i>if-then-else</i> son  obtenidas de los mensajes enviados entre las líneas de vida.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;f&#8712;CombinedFragment &#8729; f.interactionOperator = InteractionOperadorKind.alt &#8658; (&#8707;o&#8712;InteractionOperand &#8729; (o&#8712;f.operand &#8896; ~(o.guard.specification.symbol  = ‘else’)) &#8896; &#8707;o’&#8712;InteractionOperand &#8729; (o&#8712;f.operand &#8896; o.guard.specification.symbol  = ‘else’)) &#8658; ‘if(‘ o.guard.specification.symbol ‘) {‘    <br>  //mensajes contenidos  en el if    <br> &#8704;m&#8712;Message  &#8729;  m&#8712;o.message &#8658;    <br>  &lt; R8_CALLOP&gt;    <br> ‘}’    <br> ‘else {‘    ]]></body>
<body><![CDATA[<br>  //mensajes contenidos en el else    <br> &#8704;m’&#8712;Message &#8729;  m’&#8712;o’.message &#8658;    <br> &lt; R8_CALLOP&gt;    <br> ‘}’</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nótese que luego  de seleccionar el fragmento combinado <i>alt</i>,  la regla hace una distinción entre el conjunto de mensajes que hacen parte  del <i>if</i> y el conjunto de mensajes que hacen parte del <i>else</i>.  Esto  se logra gracias a que el fragmento combinado está compuesto por dos <i>InteractionOperand</i>,  uno que representa al <i>if</i>, y otro que representa al <i>else</i>, y cada <i>InteractionOperand</i> está  relacionado con el conjunto de mensajes que lo componen.    </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> La <a href="#fig11">Figura       11</a> muestra la interacción contenida  en el fragmento combinado de la <a href="#fig10">Figura 10</a>, como instancia del metamodelo del  diagrama de secuencias.  La instancia <i>m1</i> de <i>Message</i>, está asociada  con el <i>InteractionOperand</i> que tiene la restricción <i>guard</i>, mientras  el mensaje <i>m2</i> está relacionado con el <i>InteractionOperand</i> que  representa al <i>else</i>. </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig11"></a><img src="/img/revistas/dyna/v74n153/a28fig11.gif">    <br>   Figura       11.</b> Instancia del metamodelo del diagrama de secuencias incluyendo       el Fragmento Combinado &ldquo;Alt&rdquo;    <br>  <b>Figure 11.&nbsp;</b> Metamodel Instance of the Sequence Diagram including the &ldquo;Alt&rdquo; Combined Fragment</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R10_LOOP -  Regla Ciclos de Repetición:</i> Para  obtener los ciclos de repetición <i>while</i> y <i>for</i> se sigue la misma  lógica de la regla para obtener estructuras de decisión, excepto por el fragmento  combinado, que ahora será <i>loop</i>, y que en el caso específico del <i>for</i>,  deben seleccionarse los límites inferior y superior de la iteración, utilizando  las relaciones <i>minint</i> y <i>maxint</i> entre <i>InteractionConstraint</i> y <i>Expression</i>. </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>4.3 Reglas  de Transformación  a Partir del Diagrama de Máquina de Estados</b>    <br>  La regla de transformación a partir del diagrama  de máquina de estados permite generar el código necesario para administrar  la transición de estados de los objetos de una clase particular y lo que esta  transición implica, como es la verificación de las condiciones de guarda y  la ejecución de las operaciones indicadas en la transición y en los estados  actual y nuevo. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la regla se  parte del supuesto de que se ha generado un evento y continúa con los siguientes  pasos: </font></p> <ul>    <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Determina  si el evento generado pertenece al estado s actual y además, que la condición  guarda sea verdadera.  </font></li>      <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Selecciona  las operaciones <i>exit</i> del estado actual, que deben ser ejecutadas antes  del cambio de estado. </font></li>      <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Establece  el nuevo estado del objeto, verificando que la transición que contiene al evento  disparado es la transición entrante al nuevo estado. </font></li>      <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Selecciona  las operaciones <i>entry</i> y <i>doActivity</i> del nuevo estado.    </font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>R11_STATES – Regla de Transformación del diagrama  de máquina de estados:</i>Al generarse un evento <i>e</i>, se selecciona  la transición de salida <i>t</i> del estado <i>s</i> que contenga al evento  generado. El evento de una transición es referenciado por su atributo <i>trigger</i>.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Si <i>t</i> tiene  una condición para el cambio  de estado, y  ésta es verdadera, entonces se ejecutan las operaciones de salida de <i>s</i>,  referenciadas por el atributo <i>exit</i> de <i>s</i>.  </font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las operaciones  de la transción <i>t</i> están  dadas por el atributo <i>referred</i> de <i>t</i>. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El estado de destino  de una transición se obtiene  evaluando la igualdad entre las transiciones de salida de un estado <i>s</i> y  las transiciones de entrada de un estado <i>s'</i>.  Las operaciones de entrada  del nuevo estado <i>s'</i>  y las operaciones <i>doActividy</i> están dadas  por los atributo <i>entry</i> y <i>doActivity</i> de <i>s'</i> respectivamente. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Sea <i>e</i> un evento <i>Event</i> generado, entonces: </font></p>     <blockquote>      <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&#8704;s&#8714;State • (&#8707;t&#8714;(s.outgoing &#8473;) • t.trigger  = e &#8743; t.guard=true) &#8658;    <br>  //operaciones exit    <br>  &#8704;o&#8714;Operation • o&#8714;(s.exit.specification &#8473;) &#8658;    <br>  //regla de creación  de operaciones    <br>  &lt;R6_OP&gt;    <br>  //invocación de la operación creada    ]]></body>
<body><![CDATA[<br>  s.exit..specification.name’(‘ ‘);’    <br>  //nuevo estado    <br>  &#8707;s’&#8714;State • (&#8707;t’&#8714;(s’.incoming &#8473;) &#8743; t’ =  t)    <br>  &#8658;    <br>  //operaciones de la transición    <br>  &#8704;o’&#8714;Operation • o’&#8714;(t.referred &#8473;) &#8658;    <br>  //regla de creación  de operaciones    <br>  &lt;R6_OP&gt;    <br>  //invocación de la operación creada    <br>  t.referred.name ‘(‘ ‘);’    ]]></body>
<body><![CDATA[<br>  //operaciones entry del nuevo estado    <br>  &#8704;o’’&#8714;Operation • o’’&#8714; (s’.entry.specification &#8473;) &#8658;    <br>  //regla de creación  de operaciones    <br>  &lt;R6_OP&gt;    <br>  //invocación de la operación creada    <br>  s’.entry.specification.name ‘(‘ ‘);’    <br>  //operaciones doActivity    <br>  &#8704;o’’’&#8714;Operation • o’’’&#8714; (s’.doActiviy.specification &#8473;) &#8658;    <br>  //regla de creación  de operaciones    <br>  &lt;R6_OP&gt;    ]]></body>
<body><![CDATA[<br>  //invocación de la operación creada    <br>  s’.doActivity.specification.name ‘(‘ ‘);’</font></p> </blockquote>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la anterior  regla se utilizó  la regla de transformación del diagrama de clases que permite la generación  de código para operaciones. Gracias a la relación, señalada en la sección “Metamodelo  del Diagrama de Máquina de Estados”, entre el diagrama de clases y el diagrama  de máquina de estados, es posible enlazar reglas de diferentes diagramas.  </font></p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>5. CASO DE ESTUDIO</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Utilizando las  reglas de transformación propuestas  en este artículo, se puede obtener el código fuente a partir de los diagramas  de clases, secuencias y máquina de estados de un sistema particular; el caso  de estudio corresponde al manejo de una pizzería. El código fuente se representa  utilizando el lenguaje orientado a objetos Java aunque las reglas fueron expresadas  de manera genérica para cubrir otros lenguajes orientados a objetos.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Inicialmente,  se obtiene la estructura del sistema en código, lo cual se hace utilizando el diagrama de clases. Para lograr esto,  se utiliza una plantilla con la sintaxis del lenguaje, la cual se completa  con los resultados de las reglas de transformación. En la plantilla se combinan  elementos propios del lenguaje y los consecuentes de las reglas de transformación,  estos últimos reemplazados por sus equivalentes en los modelos UML. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La plantilla para las clases Java es: </font></p>     <p><font size="2" face="Courier New, Courier, mono">public class $c.name{    <br>                 //atributos    ]]></body>
<body><![CDATA[<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $p.visibility $.type.name $p.name;    <br>                 //operaciones    <br>                 $o.visibility $o.type.name $o.name ($ownedParameter.type.name $ownedParameter.name)    <br>                 {    <br>                                //método    <br>                 }    <br> }</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La <a href="#tab01">Tabla       1</a> muestra  las reglas de transformación  que debe ser aplicadas para completar la plantilla de la clase.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="tab01"></a>Tabla  1.</b> Relación código-reglas de transformación  del diagrama de clases    <br>  <b>Table 1.</b> Relationship between code and Class Diagram Transformation Rules </font>    ]]></body>
<body><![CDATA[<br> <img src="/img/revistas/dyna/v74n153/a28tab01.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> La <a href="#fig03">Figura       3</a> es  la representación del diagrama  de la <a href="#fig12">Figura 12</a> como instancia del metamodelo del diagrama de clases, correspondiente  a las clases Pedido y Cliente.  Al aplicar las reglas de transformación para  el diagrama de clases sobre la instancia <i>c3</i> de la metaclase <i>Class</i>,  la cual hace referencia a la clase Pedido, el código generado para esta clase,  de acuerdo a la plantilla y las relaciones presentadas en la <a href="#tab01">Tabla1</a> es: </font></p>     <p><font size="2" face="Courier New, Courier, mono">public class Pedido{    <br>      //atributos    <br>      private String number;    <br> &nbsp;&nbsp;&nbsp;&nbsp; private Cliente cliente;    <br> &nbsp;&nbsp;&nbsp;&nbsp; //operaciones    <br> &nbsp;&nbsp;&nbsp;&nbsp; public void agregarDetalle(){    <br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; //método    <br> &nbsp;&nbsp;&nbsp;&nbsp; }    ]]></body>
<body><![CDATA[<br> }</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig12"></a><img src="/img/revistas/dyna/v74n153/a28fig12.gif">    <br>   Figura       12.</b> Diagrama de clases del servicio a domicilio de un restaurante (porci&oacute;n)    <br>  <b>Figure 12.</b> Class Diagram of a restaurant&rsquo;s domicile service (fragment)</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El método o implementación de la operación <i>agregarDetalle</i>,   se obtiene utilizando un diagrama de secuencias y su representación como instancia   del metamodelo. Para este caso se emplea la instancia de la <a href="#fig05">Figura   5</a> que representa   la llamada a la operación <i>setPedido</i> del diagrama de la <a href="#fig13">Figura   13</a>. </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig13"></a><img src="/img/revistas/dyna/v74n153/a28fig13.gif">    <br>   Figura  13.</b> Diagrama  de Secuencias del servicio a domicilio de un restaurante    <br>  <b>Figure 13.</b> Sequence Diagram of a restaurant's domicile service</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Aplicando las  reglas de transformación para creación  de objetos e invocación de operaciones del diagrama de secuencias, se obtiene  el siguiente código: </font></p>     <p><font size="2" face="Courier New, Courier, mono">public void agregarDetalle()    ]]></body>
<body><![CDATA[<br> {    <br>        //creación de objeto    <br>         Detalle detalle = new Detalle();    <br>         //llamada a método    <br>         detalle.setPedido(this);    <br> }</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">De acuerdo con  las reglas de transformación, el  nombre del objeto y su tipo fueron obtenidos a partir de la sentencia <i>m.receiveEvent.covered.represents</i>,  que hace referencia a la propiedad detalle. El operador <i>new</i> es utilizado  como operador de creación de objetos.  Finalmente, el constructor es obtenido  a partir de la misma sentencia, agregando los parámetros del constructor que  en este caso es un conjunto vacío.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nótese que la  palabra clave <i>self</i>, ha sido  reemplazada por <i>this</i>, su equivalente en Java.    </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En el caso del  diagrama de secuencias no es necesario utilizar una plantilla como la utilizada  para la declaración de la clase. Es  suficiente recorrer el diagrama, como instancia del metamodelo, y agregar el  código como método de la operación referenciada por el diagrama.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> La <a href="#tab02">Tabla       2</a> muestra  las reglas  utilizadas en la  generación del método de la operación <i>agregarDetalle</i>.  </font></p>     ]]></body>
<body><![CDATA[<p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="tab02"></a>  Tabla  2.</b> Relación código - Reglas de Transformación  del Diagrama de Secuencias    <br>  <b>Table 2.</b> Code - Sequence Diagram's Transformation Rules relationship</font>    <br> <img src="/img/revistas/dyna/v74n153/a28tab02.gif"></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En las reglas  del diagrama de secuencias, el mensaje actúa como principal elemento pues a partir de él se navega a través de la  instancia del metamodelo.  Por ejemplo, en la sentencia de la regla R7_NEWO:</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><i>m.receiveEvent.covered.represents.type</i></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Se utiliza la instancia <i>m</i> de <i>Message</i> y  su cadena de relaciones <i>receiveEvent</i>, <i>covered</i>, <i>represents</i> y <i>type</i>,  para hacer referencia a la clase instanciada en la línea de vida que recibe  el mensaje.  De igual forma puede tenerse acceso a la clase instanciada por  la línea de vida que envía el mensaje, reemplazando a <i>receiveEvent </i>por <i>sendEvent.  </i></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Finalmente, el  diagrama de máquina de estados se  utiliza para complementar el código obtenido hasta el momento, con los posibles  estados en los que puede estar un objeto y las reglas de transición entre estados.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El diagrama de  máquina de estados de la <a href="#fig14">Figura  14</a> muestra  los dos posibles estados, Registrado o Cancelado, en los cuales  puede encontrarse un pedido.  </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig14"></a><img src="/img/revistas/dyna/v74n153/a28fig14.gif">    <br>   Figura  14. </b>Diagrama  de Máquina de Estados de la clase Pedido    ]]></body>
<body><![CDATA[<br>  <b>Figure 14.</b> State Machine Diagram of the Order class</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La transición del estado Registrado a Cancelado  sólo requiere de la generación del evento <i>cancelar.  </i>Una vez el pedido  ha sido cancelado, se ejecuta la operación <i>informarCancelación.  </i></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Antes de utilizar  la regla de transformación R11_STATES,  es necesario obtener una representación del modelo de la <a href="#fig14">Figura  14</a> como instancia  del metamodelo comprimido del diagrama de máquina de estados (Véase la <a href="#fig15">Figura  15</a>).  </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><a name="fig15"></a><img src="/img/revistas/dyna/v74n153/a28fig15.gif">    <br>   Figura       15.</b> Instancia  del metamodelo del diagrama de máquina de estados para el caso de estudio    <br>  <b>Figure  15.</b>  Metamodel  instance of the State machine diagram of   the study case</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A partir de la  regla R11_STATES se genera el siguiente código: </font></p>     <p><font size="2" face="Courier New, Courier, mono">if(Registrado.events(e) &amp;&amp; e.transition.guard){    <br>         //operaciones exit    <br>         //operaciones transición    ]]></body>
<body><![CDATA[<br>         //Nuevo estado    <br>         estadoActual = Cancelado;    <br>         //operaciones entry    <br>         informarCancelacion();    <br>         //operaciones doActivity    <br> }    <br> else if(Cancelado.events(e) &amp;&amp; e.transition.guard){    <br>         //operaciones exit    <br>         //operaciones transición    <br>         //Nuevo estado    ]]></body>
<body><![CDATA[<br>         //operaciones entry    <br>         //operaciones doActivity    <br> }</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para cada estado  se genera una condición <i>if</i> en  la cual se evalúa si el evento generado hace parte del estado y si la condición  de la transición es verdadera. Nótese que ésta es la primera condición de la  regla R11_STATES, y que la regla obliga a generar una estructura de clases  en código, similar a la presentada en el metamodelo. De esta forma, se deben  haber generado las clases Java <i>Event</i>, <i>Transition</i>, <i>State</i> y  demás, necesarias para el modelo bajo estudio.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">También es importante anotar que a partir del  diagrama de máquina de estados es posible obtener operaciones no consideradas  en el diagrama de clases, como es el caso de <i>informarCancelacion</i> de  la clase <i>Pedido</i>.  Por esta razón, la regla R11_STATES, incluye además  de la invocación de operaciones, la llamada a la regla de generación de código  para operaciones de la clase.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para el caso de  estudio, lo anterior significa que el código de la clase Pedido, además de ser complementado con el código  para el manejo de los estados, también lo será con la declaración de una nueva  operación llamada <i>informarCancelación.  </i>  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El código generado para la clase Pedido luego  de aplicar las reglas de transformación sobre los diagramas de clases, secuencias  y máquina de estados es: </font></p>     <p><font size="2" face="Courier New, Courier, mono">public class Pedido{    <br> //atributos    <br> private String number;    ]]></body>
<body><![CDATA[<br> private Cliente cliente;    <br> //operaciones    <br> public void agregarDetalle(){    <br>           //creación de objeto    <br>                 Detalle detalle = new Detalle();    <br>                 //llamada a método    <br>                 detalle.setPedido(this);    <br> }</font></p>     <p><font size="2" face="Courier New, Courier, mono">Public void informarCancelacion(){    <br> }</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Courier New, Courier, mono">public void manejadorEventos(Event e){    <br>            if(Registrado.events(e)&amp;&amp; e.transition.guard){    <br>                 //operaciones exit    <br>                 //operaciones transición    <br>                 //Nuevo estado    <br>                 estadoActual = Cancelado;    <br>                 //operaciones entry    <br>                 informarCancelacion();    <br>                 //operaciones doActivity    <br>            }    ]]></body>
<body><![CDATA[<br>         Else    <br>          if(Cancelado.events(e)&amp;&amp; e.transition.guard){    <br>                 //operaciones exit    <br>                 //operaciones transición    <br>                 //Nuevo estado    <br>                 //operaciones entry    <br>                 //operaciones doActivity    <br>         }    <br> }</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En el código anterior, el manejo de eventos fue  agregado en una operación adicional, llamada <i>manejadorEventos.  </i></font></p>     ]]></body>
<body><![CDATA[<p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>6. CONCLUSIONES Y TRABAJO FUTURO</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En este artículo se presentó una propuesta para  la generación de código fuente desde los metamodelos del diagrama de clases,  secuencias, y máquina de estados de UML. </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Dada la complejidad  de la especificación de UML,  se propusieron metamodelos comprimidos hasta disponer de las metaclases suficientes  para la generación del código fuente en Java.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las reglas de  transformación fueron especificadas  utilizando lógica de primer orden. Esta representación evita ambigüedades y  una fácil interpretación de las reglas, ya que no obliga al lector a aprender  un lenguaje particular. Adicionalmente, disponer de una representación no condicionada  a un lenguaje particular, permite la generación de código en cualquier lenguaje  a partir de plantillas sintácticas.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Como trabajo futuro,  se pretende desarrollar una herramienta CASE que incluya los metamodelos  comprimidos y las reglas de transformación  presentadas.  </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">También es necesario, incluir las restricciones  sobre los metamodelos, como las especificadas en la especificación de UML,  que permitan validar la consistencia de cada diagrama; y de esta forma lograr  una herramienta que además del código permita modificar en un proceso de ingeniería  inversa los modelos del usuario.</font></p>     <p>&nbsp;</p>     <p><b><font size="3" face="Verdana, Arial, Helvetica, sans-serif">REFERENCIAS</font></b></p>     <!-- ref --><p>  <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b> [1]</b> FUJABA, University of Paderborn, Software Engineering Group. Fujaba Tool Suite. En: <a href="http://wwwcs.uni-paderborn.de/cs/Fujaba/index.html" target="v">http://wwwcs.uni-paderborn.de/cs/Fujaba/index.html</a>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000392&pid=S0012-7353200700030002800001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[2]</b> GEIGER, LEIF Y ZÜNDORF, ALBERT, TOOL modeling with fujaba. Electronic Notes in Theoretical Computer Science. 2006, No 148, p. 173–186.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000393&pid=S0012-7353200700030002800002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[3]</b> GROSSMAN, MARTIN; ARONSON, JAY Y MCCARTHY, RICHARD. Does UML the  grade? Insights from the software development community. Information and Software  Technology, 2005. No. 47, p. 383–397.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000394&pid=S0012-7353200700030002800003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[4]</b> KEPPLE, ANNEKE; WARMER, JOS Y BAST, Wim. MDA Explained, The Model  Driven Architecture: Practice and Promise. Indianápolis: Addison-Wesley, 2003.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000395&pid=S0012-7353200700030002800004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[5]</b> LALEAU R. y MAMMAR A. (2005), From a B formal specification to an  executable code: applicational to the relational database domain. Information  and Software Technology. In Press: 1–27.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000396&pid=S0012-7353200700030002800005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[6]</b> LIU, ZHIMING Y JIFENG, HE. Towards a Rigorous Approach to UML-Based  Development. Electronic Notes in Theoretical Computer Science. No 130, p. 57–77     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000397&pid=S0012-7353200700030002800006&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[7]</b> LIU, ZHIMING Y JIFENG, HE LONG, LUANG; LIU, ZHIMING; Y LI, XIAOSHAN Y JIFENG, He. Consistent code Generation from UML models. Technical Report, UNU/IIST, 2005.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000398&pid=S0012-7353200700030002800007&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[8]</b> MELLOR, STEPHEN; SCOTT, KENDALL; UHL, AXEL; WEISE, DIRK. MDA Distilled. Addison-Wesley Professional, 2004.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000399&pid=S0012-7353200700030002800008&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[9]</b> MORGAN, CARROLL. Programming from Specifications, Second Edition. Prentice Hall International, 1998.    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000400&pid=S0012-7353200700030002800009&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[10]</b> OMGa (Object Management Group). Unified Modeling Language: Superstructure.  Fecha de actualización: Septiembre 23 de 2005. Fecha de Consulta: Julio 3 de  2006. <a href="http://www.omg.org/cgi- bin/apps/doc?formal/05-07-04.pdf" target="v">http://www.omg.org/cgi- bin/apps/doc?formal/05-07-04.pdf</a>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000401&pid=S0012-7353200700030002800010&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[11]</b> OMGb (Object Management Group). Modeling Language (UML) Specification:  Infraestructure. Fecha de actualización: Septiembre 23 de 2005. Fecha de Consulta:  Julio 3 de 2006. <a href="http://www.omg.org/cgi-bin/apps/doc?ptc/04-10-14.pdf" target="v">http://www.omg.org/cgi-bin/apps/doc?ptc/04-10-14.pdf </a>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000402&pid=S0012-7353200700030002800011&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[12]</b> ROSE, IBM Corporation. Rational Rose ArchitectTM. En: <a href="http://www-306.ibm.com/software/awdtools/architect/swarchitect/index.html" target="v">http://www-306.ibm.com/software/awdtools/architect/swarchitect/index.html</a>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000403&pid=S0012-7353200700030002800012&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><br>  <b>[13]</b> TOGETHERTM, BORLAND Software Corporation. Borland Together Architect. En: <a href="http://www.borland.com/us/products/together/index.html" target="v">http://www.borland.com/us/products/together/index.html</a>.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000404&pid=S0012-7353200700030002800013&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> ]]></body><back>
<ref-list>
<ref id="B1">
<label>1</label><nlm-citation citation-type="">
<collab>University of Paderborn^dSoftware Engineering Group</collab>
<source><![CDATA[Fujaba Tool Suite]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B2">
<label>2</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[GEIGER]]></surname>
<given-names><![CDATA[LEIF]]></given-names>
</name>
<name>
<surname><![CDATA[ZÜNDORF]]></surname>
<given-names><![CDATA[ALBERT]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[TOOL modeling with fujaba]]></article-title>
<source><![CDATA[Electronic Notes in Theoretical Computer Science]]></source>
<year>2006</year>
<numero>148</numero>
<issue>148</issue>
<page-range>173-186</page-range></nlm-citation>
</ref>
<ref id="B3">
<label>3</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[GROSSMAN]]></surname>
<given-names><![CDATA[MARTIN]]></given-names>
</name>
<name>
<surname><![CDATA[ARONSON]]></surname>
<given-names><![CDATA[JAY]]></given-names>
</name>
<name>
<surname><![CDATA[MCCARTHY]]></surname>
<given-names><![CDATA[RICHARD]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Does UML the grade?: Insights from the software development community]]></article-title>
<source><![CDATA[Information and Software Technology]]></source>
<year>2005</year>
<numero>47</numero>
<issue>47</issue>
<page-range>383-397</page-range></nlm-citation>
</ref>
<ref id="B4">
<label>4</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[KEPPLE]]></surname>
<given-names><![CDATA[ANNEKE]]></given-names>
</name>
<name>
<surname><![CDATA[WARMER]]></surname>
<given-names><![CDATA[JOS]]></given-names>
</name>
<name>
<surname><![CDATA[BAST]]></surname>
<given-names><![CDATA[Wim]]></given-names>
</name>
</person-group>
<source><![CDATA[MDA Explained, The Model Driven Architecture: Practice and Promise]]></source>
<year>2003</year>
<publisher-loc><![CDATA[Indianápolis ]]></publisher-loc>
<publisher-name><![CDATA[Addison-Wesley]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B5">
<label>5</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LALEAU]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
<name>
<surname><![CDATA[MAMMAR]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[From a B formal specification to an executable code: applicational to the relational database domain]]></article-title>
<source><![CDATA[Information and Software Technology]]></source>
<year>2005</year>
<page-range>1-27</page-range></nlm-citation>
</ref>
<ref id="B6">
<label>6</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LIU]]></surname>
<given-names><![CDATA[ZHIMING]]></given-names>
</name>
<name>
<surname><![CDATA[JIFENG]]></surname>
<given-names><![CDATA[HE]]></given-names>
</name>
</person-group>
<source><![CDATA[Electronic Notes in Theoretical Computer Science]]></source>
<year></year>
<numero>130</numero>
<issue>130</issue>
<page-range>57-77</page-range></nlm-citation>
</ref>
<ref id="B7">
<label>7</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LIU]]></surname>
<given-names><![CDATA[ZHIMING Y JIFENG]]></given-names>
</name>
<name>
<surname><![CDATA[HE LONG]]></surname>
<given-names><![CDATA[LUANG]]></given-names>
</name>
<name>
<surname><![CDATA[LIU]]></surname>
<given-names><![CDATA[ZHIMING]]></given-names>
</name>
<name>
<surname><![CDATA[LI]]></surname>
<given-names><![CDATA[XIAOSHAN]]></given-names>
</name>
<name>
<surname><![CDATA[JIFENG]]></surname>
<given-names><![CDATA[He]]></given-names>
</name>
</person-group>
<source><![CDATA[Consistent code Generation from UML models]]></source>
<year>2005</year>
</nlm-citation>
</ref>
<ref id="B8">
<label>8</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[MELLOR]]></surname>
<given-names><![CDATA[STEPHEN]]></given-names>
</name>
<name>
<surname><![CDATA[SCOTT]]></surname>
<given-names><![CDATA[KENDALL]]></given-names>
</name>
<name>
<surname><![CDATA[UHL]]></surname>
<given-names><![CDATA[AXEL]]></given-names>
</name>
<name>
<surname><![CDATA[WEISE]]></surname>
<given-names><![CDATA[DIRK]]></given-names>
</name>
</person-group>
<source><![CDATA[MDA Distilled]]></source>
<year>2004</year>
<publisher-name><![CDATA[Addison-Wesley Professional]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B9">
<label>9</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[MORGAN]]></surname>
<given-names><![CDATA[CARROLL]]></given-names>
</name>
</person-group>
<source><![CDATA[Programming from Specifications]]></source>
<year>1998</year>
<edition>Second</edition>
<publisher-name><![CDATA[Prentice Hall International]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B10">
<label>10</label><nlm-citation citation-type="">
<collab>OMG</collab>
<source><![CDATA[Unified Modeling Language: Superstructure]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B11">
<label>11</label><nlm-citation citation-type="">
<collab>OMGb</collab>
<source><![CDATA[Modeling Language (UML) Specification: Infraestructure]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B12">
<label>12</label><nlm-citation citation-type="">
<collab>IBM Corporation</collab>
<source><![CDATA[Rational Rose ArchitectTM]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B13">
<label>13</label><nlm-citation citation-type="">
<collab>BORLAND Software Corporation</collab>
<source><![CDATA[Borland Together Architect]]></source>
<year></year>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
