Metamodelling

image_1
Metamodelling
Autors:

Una de les pràctiques més habituals en l’Enginyeria del Software, quan el domini del problema és complex, és la construcció d’un model conceptual. Un model conceptual és la representació dels conceptes i de les associacions, propis del món real, que volem registrar mitjançant el nostre software. Per exemple, si volem construir un software per registrar els lloguers de vehicles en un circuit de Karts (i no sabem ni què és Kart), primerament, hauríem de modelitzar els conceptes que hi intervenen (“Kart” i “Usuari”) i com es relacionen entre ells (un Usuari “reserva” un Kart, etc). Un cop hem entès el domini, ja el podem programar.

Doncs bé, quin és un domini que tot enginyer del software sap que és increïblement complex? Doncs ni més ni menys, que el propi món de qualsevol de les tecnologies de l’enginyeria del software. Quina eina podem fer servir per entendre millor aquest domini complex i poder-lo programar? Els meta-models.
 

Què és un Meta-model?

Imaginem-nos, per un moment, que hem de fer un software per una empresa que desenvolupa bases de dades. En concret, imaginem-nos que ens demanen d’implementar un software per ajudar-los a detectar problemes en els dissenys de les seves bases de dades SQL (com per exemple, cicles de claus foranes). Quins són els conceptes del món real amb què treballa aquesta empresa? Aquí ja no parlem d’“Usuaris” o “Karts”, sinó de classes molt més abstractes com “Taula SQL” i “Atribut SQL”.
Un meta-model és una representació d’un altre model. Per exemple, la següent figura és un fragment d’un meta-model SQL:

Una instància d’aquest meta-model seria un esquema SQL. Per exemple, una instància de “SQLTable” podria ser la taula SQL “Usuari” (amb què guardem usuaris a la base de dades).
A partir d’aquí, el problema de detectar cicles de claus foranes es converteix en un problema de recórrer les associacions del meta-model. De fet, qualsevol problema d’anàlisi de codi en un llenguatge (com SQL o Java) es pot convertir en un problema de recórrer el seu meta-model.

 

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

Doncs és molt fàcil, només calen dues coses:

  • Una implementació del meta-model en si. És a dir, una implementació de les seves classes i associacions
  • Un component encarregat d’instanciar el meta-model.

Seguint l’exemple del SQL, podríem implementar, en Java, les classes de l’anterior meta-model (classes SQLTable, SQLAttribute, etc). És més, podríem implementar un parsejador, en Java, que llegís sentències “CREATE TABLE …” per instanciar les taules, atributs i claus foranes (descrites a la sentència) com objectes de l’anterior meta-model. A partir d’aquí, trobar cicles de claus foranes es converteix en un problema de navegar per les nostres instàncies Java (que representen conceptes SQL).

Fixeu-vos que, al representar els conceptes SQL com a classes Java, tenim tota la potència de l’orientació a objectes per fer un codi extensible, mantenible i reusable. De fet, es podria reusar i estendre l’anterior metamodel per fer coses més interessants (per exemple, reordenar instruccions “INSERT INTO …” sobre diferents taules per no violar claus foranes, o detectar la propagació de DELETE_ON_CASCADE entre diferents taules, etc).

Però res d’això està limitat al SQL. Similarment, podríem fer un analitzador de JS en Java (o viceversa), per detectar problemes, patrons, o extreure’n qualsevol informació imaginable (en codi). Fins i tot, podem fer un analitzador d’un llenguatge… en el propi llenguatge!
Si us interessa el món dels meta-models, podeu veure una implementació d’un meta-model de Java, fet amb Java, a https://javaparser.org/.