{"id":3055,"date":"2020-09-29T06:32:58","date_gmt":"2020-09-29T04:32:58","guid":{"rendered":"https:\/\/inlab.fib.upc.edu\/?p=3055"},"modified":"2020-09-29T06:39:58","modified_gmt":"2020-09-29T04:39:58","slug":"metamodelling-2","status":"publish","type":"post","link":"https:\/\/inlab.fib.upc.edu\/es\/uncategorized-ca\/metamodelling-2","title":{"rendered":"Metamodelling"},"content":{"rendered":"<p>Una de las pr\u00e1cticas m\u00e1s habituales en la Ingenier\u00eda del Software, cuando el dominio del problema es complejo, es la construcci\u00f3n de un modelo conceptual. Un modelo conceptual es la representaci\u00f3n 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\u00edculos en un circuito de Karts (y no sabemos ni qu\u00e9 es Kart), primeramente, deber\u00edamos modelizar los conceptos que intervienen (\u00abKart\u00bb y \u00abUsuario\u00bb) y como se relacionan entre ellos (un Usuario \u00abreserva\u00bb un Kart, etc). Una vez entendido el dominio, ya lo podemos programar.<\/p>\n<p>Pues bien, \u00bfqu\u00e9 es un dominio que todo ingeniero del software sabe que es incre\u00edblemente complejo? Pues ni m\u00e1s ni menos, que el propio mundo de cualquiera de las tecnolog\u00edas de la ingenier\u00eda del software. \u00bfQu\u00e9 herramienta podemos utilizar para entender mejor este dominio complejo y poder programar? Los meta-modelos.<br \/>\n&nbsp;<\/p>\n<h2>\u00bfQu\u00e9 es un Meta-modelo?<\/h2>\n<p>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\u00f1os de sus bases de datos SQL (como por ejemplo, ciclos de claves externas). \u00bfCu\u00e1les son los conceptos del mundo real con la que trabaja esta empresa? Aqu\u00ed ya no hablamos de \u00abUsuarios\u00bb o \u00abKarts\u00bb, sino de clases mucho m\u00e1s abstractas como \u00abTabla SQL\u00bb y \u00abAtributo SQL\u00bb.<br \/>\nUn meta-modelo es una representaci\u00f3n de otro modelo. Por ejemplo, la siguiente figura es un fragmento de un meta-modelo SQL:<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\" size-full wp-image-3051\" alt=\"\" src=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2020\/09\/metamodelling.jpg\" style=\"width: 467px; height: 183px;\" width=\"467\" height=\"183\" srcset=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2020\/09\/metamodelling.jpg 467w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2020\/09\/metamodelling-300x118.jpg 300w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2020\/09\/metamodelling-370x145.jpg 370w\" sizes=\"(max-width: 467px) 100vw, 467px\" \/><\/p>\n<p>Una instancia de este meta-modelo ser\u00eda un esquema SQL. Por ejemplo, una instancia de \u00abSQLTable\u00bb podr\u00eda ser la tabla SQL \u00abUsuario\u00bb (con la que guardamos usuarios en la base de datos).<br \/>\nA partir de aqu\u00ed, 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\u00e1lisis de c\u00f3digo en un lenguaje (como SQL o Java) puede convertirse en un problema de recorrer su meta-modelo.<\/p>\n<p>&nbsp;<\/p>\n<h2>Com es poden dur a la pr\u00e0ctica els meta-models?<\/h2>\n<p>Pues es muy f\u00e1cil, s\u00f3lo se necesitan dos cosas:<\/p>\n<ul>\n<li>Una implementaci\u00f3n del meta-modelo en s\u00ed. Es decir, una implementaci\u00f3n de sus clases y asociaciones<\/li>\n<li>Un componente encargado de instanciar el meta-modelo.<\/li>\n<\/ul>\n<p>Siguiendo el ejemplo del SQL, podr\u00edamos implementar, en Java, las clases de la anterior meta-modelo (clases SQLTable, SQLAttribute, etc). Es m\u00e1s, podr\u00edamos implementar un parseador, en Java, que leyera sentencias \u00abCREATE TABLE &#8230;\u00bb para instanciar las tablas, atributos y claves externas (descritas en la sentencia) como objetos de la anterior meta-modelo. A partir de ah\u00ed, encontrar ciclos de claves externas se convierte en un problema de navegar por nuestras instancias Java (que representan conceptos SQL).<\/p>\n<p>Tenga en cuenta que, al representar los conceptos SQL como clases Java, tenemos toda la potencia de la orientaci\u00f3n a objetos para hacer un c\u00f3digo extensible, mantenible y reusable. De hecho, se podr\u00eda reutilizar y extender la anterior metamodelo para hacer cosas m\u00e1s interesantes (por ejemplo, reordenar instrucciones \u00abINSERT INTO &#8230;\u00bb sobre diferentes mesas para no violar claves externas, o detectar la propagaci\u00f3n de DELETE_ON_CASCADE entre diferentes tablas, etc ).<\/p>\n<p>Pero nada de esto est\u00e1 limitado al SQL. Similarmente, podr\u00edamos hacer un analizador de JS en Java (o viceversa), para detectar problemas, patrones, o extraer cualquier informaci\u00f3n imaginable (en c\u00f3digo). Incluso, podemos hacer un analizador de un lenguaje &#8230; \u00a1en el propio lenguaje!&nbsp;<br \/>\nSi le interesa el mundo de los meta-modelos, puede ver una implementaci\u00f3n de un meta-modelo de Java, hecho con Java, en&nbsp;<a href=\"https:\/\/javaparser.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/javaparser.org\/.<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una de las pr\u00e1cticas m\u00e1s habituales en la Ingenier\u00eda del Software, cuando el dominio del problema es complejo, es la construcci\u00f3n de un modelo conceptual. Un modelo conceptual es la representaci\u00f3n de los conceptos y de las asociaciones, propios del mundo real, que queremos registrar mediante nuestro software. Por ejemplo, si queremos construir un software [&hellip;]<\/p>\n","protected":false},"author":594,"featured_media":3048,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[496,1],"tags":[],"experteses":[27],"class_list":["post-3055","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articulos","category-uncategorized-ca","experteses-knowledgeyserviceengineering-es"],"acf":[],"_links":{"self":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/3055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/users\/594"}],"replies":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/comments?post=3055"}],"version-history":[{"count":0,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/3055\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media\/3048"}],"wp:attachment":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media?parent=3055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/categories?post=3055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/tags?post=3055"},{"taxonomy":"experteses","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/experteses?post=3055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}