Abstrações do mundo real Sistema e seu ambiente Com um propósito específico Simulação, geração de código No MDD Quem lê e entende o modelo é o computador Uma vez que o computador entenda o modelo... O que fazer? MMA MMB 2 Modelo B Transformação M2M 1
Modelo OO Modelo E-R Mapeamento Objeto-Relacional Modelo de classes Modelo específico de plataforma Modelo EJB MMA Java, SQL, XML, HTML... Texto Transformação M2T Modelo E-R Scripts de definição de dados (CREATE TABLE...) Modelo de classes Estrutura das classes (esqueletos) Atributos, heranças, protótipos dos métodos 2
Tipos de transformações M2M Fusão (merging) Modificação Transformação Correlação (weaving) Marcações externas http://www.voelter.de/services/mdsd-tutorial.html Modelo X (A+B) Modelo B Fácil de implementar s são os mesmos Útil para modularizar os modelos no desenvolvimento http://www.voelter.de/services/mdsd-tutorial.html Um modelo é estendido durante a geração O modelo permanece seguindo o mesmo metamodelo Relativamente pouca dificuldade de implementação Complicado para mudanças mais complexas http://www.voelter.de/services/mdsd-tutorial.html 3
Modelo B O modelo original permanece inalterado Separação é clara: modelos diferentes, metamodelos diferentes Os domínios podem evoluir independentemente http://www.voelter.de/services/mdsd-tutorial.html Modelo B Modelo de correlação W Os modelos originais permanecem inalterados É necessário especificar as regras de correlação Pouco suportado pelas ferramentas atuais Exemplo: Classes e Tabelas http://www.voelter.de/services/mdsd-tutorial.html Informações adicionais (ex: qual atributo é chave) Modelo B Informações específicas da plataforma/metamodelo destino Mas que iriam poluir o modelo de origem Informação auxiliar aos transformadores Aspectos externos http://www.voelter.de/services/mdsd-tutorial.html 4
Procedural Um programa realiza as transformações Declarativa As transformações são especificadas em uma DSL Um mecanismo interpreta e executa as transformações Programação (Java, C++, C# ) Procedural Utilizando API de metamodelagem (EMF, MetaGME) XSLT Declarativa Para modelos baseados em XML Limitado pois não há um metamodelo explícitio Opera em nível de XML Eclipse ATL Declarativa, textual, prática QVT Declarativa, padrão OMG, implementações ainda estão surgindo Eclipse xtend (oaw) Declarativa, concisa, prática, suporte de IDE Código Modelo B Dificuldades: Ler arquivo de origem Escrever arquivo de destino Manter consistência e formato do arquivo gerado Lidar com as referências internas 5
MMA API Metamodelagem MMB Código Modelo B Vantagens: Leitura / escrita fica por conta da API / Framework Formato de saída é consistente Referências são garantidas É possível realizar transformações na memória Demonstração Utilizando Eclipse / xtext MMA MMT MMB Transformação Modelo B Vantagens (mesmas DSL): Alto nível de abstração Próximo aos metamodelos / problema Permite análises, otimizações, etc... 6
Demonstração Utilizando Eclipse / xtend Exemplo: Modelo OO para Modelo E-R 7
public class GeradorDeCodigo { System.out.println( ); System.out.println( ); for(int i=1;i<=5;i++) { System.out.println( System.out.println(\ Código gerado +i+ \ ); ); System.out.println( ); System.out.println( ); System.out.println( Código gerado 1 ); System.out.println( Código gerado 2 ); System.out.println( Código gerado 3 ); System.out.println( Código gerado 4 ); System.out.println( Código gerado 5 ); Código gerado 1 Código gerado 2 Código gerado 3 Código gerado 4 Código gerado 5 8
Demonstração GME public class GeradorDeCodigo { System.out.println( ); System.out.println( ); System.out.println( System.out.println(\ Código gerado\ ); ); System.out.println( ); System.out.println( ); System.out.println( Código gerado! ); Difícil modificar o código dentro das aspas Código gerado! public class GeradorDeCodigo { System.out.println( ); System.out.println( ); System.out.println( System.out.println(\ Código gerado\ ); ); System.out.println( ); System.out.println( ); System.out.println( Código gerado! ); O código final só pode ser visto após a geração Código gerado! 9
public class GeradorDeCodigo { System.out.println( ); System.out.println( ); System.out.println( System.out.println(\ Código gerado\ ); ); System.out.println( ); System.out.println( Consulta ao ); metamodelo deve ser feita manualmente System.out.println( Código gerado! ); Código gerado! Templates Estilo JSP, ASP, PHP, etc... Inversão: Ao invés de colocar System.out.println( no começo de cada linha, criar um arquivo separado, só com o texto a ser gerado...... e inserir System.out.println( automaticamente System.out.println( Código gerado! ); public class GeradorDeCodigo { System.out.println( ); System.out.println( ); System.out.println( System.out.println(\ Código gerado\ ); ); System.out.println( ); System.out.println( ); System.out.println( Código gerado! ); Código gerado! 10
<% for(int i=1;i<=5;i++) { %> System.out.println( Código gerado <%=i%> ); <% %> public class GeradorDeCodigo { System.out.println( ); System.out.println( ); for(int i=1;i<=5;i++) { System.out.println( System.out.println(\ Código gerado +i+ \ ); ); System.out.println( ); System.out.println( ); System.out.println( Código gerado 1 ); System.out.println( Código gerado 2 ); System.out.println( Código gerado 3 ); System.out.println( Código gerado 4 ); System.out.println( Código gerado 5 ); Independente do formato de saída Pode-se fazer de tudo! Desde que seja possível em uma linguagem de programação Flexibilidade Maior legibilidade do código gerado Facilidade de manutenção Diversas possibilidades Modularização Um template para cada metaclasse Um template para cada arquivo de saída Agrupar templates Dividir um template em vários 11
Templates GME Tags / macros Vantagens Código mais limpo Focado no problema Desvantagem Dependência das funções existentes Abordagem Visitante Template A Template B Template C 12
Abordagem metamodelo Template A Template B Template C? Modelo B1 Modelo Bn - Nível de abstração + Detalhes sobre plataforma + Complexidade Templates Código A Código B Código C? Modelo B1 Modelo Bn Templates Código A Código B Código C 13
? Modelo B1 Modelo Bn Templates Código A Código B Código C? Modelo B1 Modelo Bn Templates Código A Código B Código C? Modelo B1 Modelo Bn Templates Código A Código B Código C 14
Transformações M2M Apenas para modularizar/facilitar a geração de código! Customizações/informações adicionais Arquivos/modelos externos Modificar código gerado Evitar! Planejar a integração com código manual Mais sobre isso nos próximos capítulos! Sugestões: Além dos templates, quais outras abordagens existem? Quais as desvantagens dos templates? É possível utilizar mais de um metamodelo em um template? Alguém mais está com fome além de mim? Quando eu vou começar a entender isso tudo? O teste de Poincaré identifica esferas no espaço quadridimensional? As liberdades política e econômica estão intimamente ligadas? Por que a pobreza aumentou e a expectativa de vida diminuiu na África subsaariana? 15