Lenguaje ATL (Atlas Transformation Language)

La transformación desde un modelo a otro es un aspecto importante en el desarrollo de software orientado a modelos y ATL, un lenguaje de programación para realizar transformaciones entre modelos impulsado por Eclipse, brinda una serie de herramientas para estas transformaciones.

 Para llevar a cabo transformaciones con ATL, los desarrolladores tienen que mezclar la programación imperativa con la programación declarativa, ya que ATL es un híbrido entre estas dos programaciones. La programación declarativa pretende describir el problema al cual se quiere dar solución declarando un conjunto de condiciones, proposiciones o afirmaciones, y a través de mecanismos internos llegar a las instrucciones necesarias para dar la solución del problema. A diferencia de la programación declarativa, la programación imperativa brinda una serie de instrucciones o pasos que indican al computador cómo debe realizar una tarea.

 Un programa de transformación ATL se compone de reglas que definen cómo el modelo de elementos fuente se empareja para crear e inicializar los elementos de los modelos destino. Además de las transformaciones de modelos básicos, ATL define un modelo adicional que permite especificar las peticiones en los modelos.

 ATL ofrece a los desarrolladores la posibilidad de diseñar mediante tres tipos de unidades diferentes. Módulo ATL, consulta ATL y Biblioteca ATL; cualquiera de estas unidades se define en su propio archivo ATL. Los archivos ATL se caracterizan por tener la extensión .atl.

Families to Persons es un ejemplo básico de ATL algo así como un “Hola mundo”. Consiste en transformar cada uno de los miembros de una familia a persona.

Para este ejemplo el archivo .atl contiene lo siguiente:

</pre>
module Familia2Personas; --Nombre del archivo o modulo

create OUT : Persona from IN : Familias; --Metamodelo de salida (out) y de entrada(in)
<h5>

Este es el encabezado del documento donde se define el nombre y los metamodelos de entrada y salida. Los caracteres “–“ Sirven para poner los comentarios, son equivalentes a “//” en java.


helper context Familias!Miembro def: Apellido : String =

if not self.Padre.oclIsUndefined() then

self.Padre.Apellido

else

if not self.Madre.oclIsUndefined() then

self.Madre.Apellido

else

if not self.Hijos.oclIsUndefined() then

self.Hijos.Apellido

else

self.Hijas.Apellido

endif

endif

endif;</pre>
<h5></h5>
<pre>
helper context Familias!Miembro def: esMujer() : Boolean =

  if not self.Madre.oclIsUndefined() then

        true

  else

        if not self.Hijas.oclIsUndefined() then

              true

        else

              false

        endif

  endif;</pre>
<h5>

Estos son los helpers que se necesitan para realizar las transformaciones. Los helpers se componen de la palabra helper, seguido de context,  que puede ser opcional y es donde se define el contexto del helper,  def:, es acá donde se le da el nombre al helper, este nombre debe ser único ya que a través de este se realiza el llamado a los helpers. Después del el nombre del helper se debe especificar el tipo del helper, String, Boolean, etc. Y por último el cuerpo del helper. Los anteriores helpers sirven para identificar el Apellido de un miembro y saber si es mujer u hombre.


rule Miembro2Hombre {

from

s : Familias!Miembro (not s.esMujer())

to

t : Persona!Hombre (

Nombre_Completo <- s.Nombre + ' ' + s.Apellido

)

}</pre>
<h5></h5>
<pre>
rule Miembro2Mujer {

  from

        s : Familias!Miembro (s.esMujer())

  to

        t : Persona!Mujer (

              Nombre_Completo <- s.Nombre + ' ' + s.Apellido

        )

}</pre>
<h5>

Por último se encuentran las reglas de transformación, estas están compuestas por la palabra rule seguida del nombre de la regla. El cuerpo de toda regla se conforma por cuatro partes, dos de las cuales son opcionales. La primera parte se conoce como el origen de la transformación se denota con la palabra from y es acá donde se declara la variable del metamodelo origen, en nuestro primer ejemplo se define la variable “s” como un objeto de tipo Familias!Miembro y con los paréntesis del frente se determina cuando se debe hacer esta transformación, para este caso la primera transformación se debe realizar siempre y cuando el objeto “s” no sea mujer.

 La segunda parte del Helper se conoce como el sitio de declaración de variables locales, se denota con la palabra using, esta sección es opcional y es donde se declaran e inicializan las variables que se van a utilizar para poder llevar acabo la transformación. En este caso de uso no se requiere de una sección using, para llevar acabo las transformaciones.

La tercera parte se conoce como el destino de la transformación y se denota con la palabra to. Acá es donde se define el objeto destino de la transformación y dentro de los paréntesis se asigna valor a cada uno de los componentes del objeto destino. En las reglas de transformación ejemplo se puede ver como al componente Nombre_Completo se le asigna el valor del nombre de “s” más un espacio y el apellido de “s”.

La cuarta y última parte se conoce como el bloque imperativo de la transformación. En este parte es permite establecer instrucciones de tipo imperativo que serán ejecutadas una vez que el modelo destino sea inicializado. Esta sección se denota con la palabra do e igual que la sección using es opcional.

Facebook Twitter Linkedin Mail BVision