Skip to content

[MediniQVT] De declarativo a procedural

octubre 16, 2012

Algo que me mata es que cada vez que tengo ciertas transformaciones que cada vez que las ejecuto me dan un resultado distinto. Esto es algo frustrante, porque al querer verificar si un cambio fue bueno o no, hay que ejecutar varias veces y ver con qué resultados quedarse!

Hace poco Ricardo me comentó que hay distintas formas de hacer las mismas cosas, algunas veces a él le pasaba eso, y otras veces no, con lo cual adoptó esa forma de hacer las cosas para evitar este problema. Me pasó sus transformaciones y las estuve mirando, y ahora entendí cuál es el truco: hay que usar el lenguaje declarativo lo más procedural (imperativo) posible, y esto se logra con el uso de ciertos constructores OCL en el where de una relación.

Imaginen que tenemos una relaciónA y una relaciónB, y la relaciónB tiene que invocarse una vez que se invoca la relaciónA, entonces lo que se aconseja hacer es poner un when en la relaciónB, referenciando relaciónA. En lugar de hacerlo declarativamente, lo que mejor funciona parece ser la forma más imperativa, que sería poner un código como el que sigue en la relaciónA:

where {
     packageA.packagedElement->forAll(elem|
                     if (elem.oclIsTypeOf(uml::Class) and
                        (not elem.getAppliedStereotypes()->isEmpty()) and
                        elem.isStereotypeApplied(helper::getStereotype('Table')))
                     then 
                         generateTestContext(elem, tcont, testcase, p)
                     else
                         true
                     endif
              );
 }

Y lo que terminamos poniendo en el cuerpo del forAll es algo similar a lo que pondríamos en el when de relaciónB. En este ejemplo estoy logrando que para cada clase que tiene el estereotipo “Table” se invoque a “generateTestContext”.

Anuncios

From → QVT, UML

Dejar un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: