A Model-Driven Software Reuse Approach (in portuguese)
A Model-Driven Software Reuse Approach (in portuguese)
A Model-Driven Software Reuse Approach (in portuguese)
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
160<br />
Por exemplo, pode-se embutir o código referente a uma feature opcional dentro de uma tag<br />
do tipo condicional, que aceita como parâmetro um tipo booleano em uma DSL que <strong>in</strong>dica a<br />
presença ou ausência da feature. Especificando-se este parâmetro com o valor VERDADEIRO<br />
faz com que o gerador <strong>in</strong>clua aquele trecho de código, enquanto o valor FALSO faz com que o<br />
gerador não o <strong>in</strong>clua. Exemplos de tags são aquelas <strong>in</strong>cluídas pelo projeto JET (Java Emitter<br />
Templates), descrito na Seção 2.2.2.<br />
Variabilidades mais complexas podem precisar de mecanismos mais flexíveis do que as tags<br />
para serem implementadas e parametrizadas. Neste caso, pode-se utilizar scriptlets, trechos<br />
de metacódigo que fazem um trabalho mais elaborado de cópia/colagem, produz<strong>in</strong>do uma<br />
saída que une fragmentos de código de forma a implementar a variabilidade exatamente como<br />
orig<strong>in</strong>almente idealizada.<br />
Geradores baseados em templates representam transformações modelo-para-texto, em um<br />
único passo. Porém, transformações modelo-para-modelo devem ser utilizadas para produzir<br />
geradores mais bem organizados. Nestes casos, cuidado especial deve ser tomado para<br />
que não seja necessário modificar os modelos <strong>in</strong>termediários, visando evitar problemas de<br />
<strong>in</strong>consistência. Pode-se evitar este tipo de problema através de alguns padrões e práticas de<br />
sucesso na construção de geradores (VÖLTER, 2008; VÖLTER; BETTIN, 2004).<br />
O processo de migração de código deve sempre manter a implementação de referência<br />
consistente com o código gerado, ou seja, deve ser possível gerar uma nova implementação<br />
de referência sempre que desejado, utilizando os geradores construídos. A pr<strong>in</strong>cípio, não<br />
existe nenhum problema, desde que a migração de código não modifique a implementação<br />
de referência. Mas esta situação pode acontecer, já que durante a migração de código pode-se<br />
identificar oportunidades para melhorar o suporte à variabilidade.<br />
Por exemplo, a implementação de referência pode implementar alternativas diferentes para<br />
um ponto de variação através de trechos de código dist<strong>in</strong>tos. Após a migração de código para<br />
o template, o implementador pode perceber que a criação de funções separadas, uma para<br />
cada alternativa, é uma solução melhor. Assim, ele modifica o template para implementar esta<br />
solução, fazendo com que a implementação de referência se torne <strong>in</strong>consistente.<br />
Mesmo que a migração de código não modifique a implementação de referência, a própria<br />
evolução do domínio normalmente causa este tipo de <strong>in</strong>consistência. Sempre que for necessário<br />
corrigir algum erro, seja no gerador ou em outro lugar, deve-se idealmente realizar a manutenção<br />
primeiro na implementação de referência, testá-la e validá-la, e somente então repetir o processo<br />
de migração, de forma que a <strong>in</strong>consistência não exista. Mas na prática, pr<strong>in</strong>cipalmente correções<br />
menores ou de erros do próprio gerador, modifica-se diretamente os templates, causando