Metamodelling

image_1
Metamodelling
Autores:

Una de las prácticas más habituales en la Ingeniería del Software, cuando el dominio del problema es complejo, es la construcción de un modelo conceptual. Un modelo conceptual es la representación de los conceptos y de las asociaciones, propios del mundo real, que queremos registrar mediante nuestro software. Por ejemplo, si queremos construir un software para registrar los alquileres de vehículos en un circuito de Karts (y no sabemos ni qué es Kart), primeramente, deberíamos modelizar los conceptos que intervienen («Kart» y «Usuario») y como se relacionan entre ellos (un Usuario «reserva» un Kart, etc). Una vez entendido el dominio, ya lo podemos programar.

Pues bien, ¿qué es un dominio que todo ingeniero del software sabe que es increíblemente complejo? Pues ni más ni menos, que el propio mundo de cualquiera de las tecnologías de la ingeniería del software. ¿Qué herramienta podemos utilizar para entender mejor este dominio complejo y poder programar? Los meta-modelos.
 

¿Qué es un Meta-modelo?

Imaginemos, por un momento, que tenemos que hacer un software para una empresa que desarrolla bases de datos. En concreto, imaginemos que nos piden de implementar un software para ayudarles a detectar problemas en los diseños de sus bases de datos SQL (como por ejemplo, ciclos de claves externas). ¿Cuáles son los conceptos del mundo real con la que trabaja esta empresa? Aquí ya no hablamos de «Usuarios» o «Karts», sino de clases mucho más abstractas como «Tabla SQL» y «Atributo SQL».
Un meta-modelo es una representación de otro modelo. Por ejemplo, la siguiente figura es un fragmento de un meta-modelo SQL:

Una instancia de este meta-modelo sería un esquema SQL. Por ejemplo, una instancia de «SQLTable» podría ser la tabla SQL «Usuario» (con la que guardamos usuarios en la base de datos).
A partir de aquí, el problema de detectar ciclos de claves exterjasmse convierte en un problema de recorrer las asociaciones del meta-modelo. De hecho, cualquier problema de análisis de código en un lenguaje (como SQL o Java) puede convertirse en un problema de recorrer su meta-modelo.

 

Com es poden dur a la pràctica els meta-models?

Pues es muy fácil, sólo se necesitan dos cosas:

  • Una implementación del meta-modelo en sí. Es decir, una implementación de sus clases y asociaciones
  • Un componente encargado de instanciar el meta-modelo.

Siguiendo el ejemplo del SQL, podríamos implementar, en Java, las clases de la anterior meta-modelo (clases SQLTable, SQLAttribute, etc). Es más, podríamos implementar un parseador, en Java, que leyera sentencias «CREATE TABLE …» para instanciar las tablas, atributos y claves externas (descritas en la sentencia) como objetos de la anterior meta-modelo. A partir de ahí, encontrar ciclos de claves externas se convierte en un problema de navegar por nuestras instancias Java (que representan conceptos SQL).

Tenga en cuenta que, al representar los conceptos SQL como clases Java, tenemos toda la potencia de la orientación a objetos para hacer un código extensible, mantenible y reusable. De hecho, se podría reutilizar y extender la anterior metamodelo para hacer cosas más interesantes (por ejemplo, reordenar instrucciones «INSERT INTO …» sobre diferentes mesas para no violar claves externas, o detectar la propagación de DELETE_ON_CASCADE entre diferentes tablas, etc ).

Pero nada de esto está limitado al SQL. Similarmente, podríamos hacer un analizador de JS en Java (o viceversa), para detectar problemas, patrones, o extraer cualquier información imaginable (en código). Incluso, podemos hacer un analizador de un lenguaje … ¡en el propio lenguaje! 
Si le interesa el mundo de los meta-modelos, puede ver una implementación de un meta-modelo de Java, hecho con Java, en https://javaparser.org/.