15.04.2013 Views

A Model-Driven Software Reuse Approach (in portuguese)

A Model-Driven Software Reuse Approach (in portuguese)

A Model-Driven Software Reuse Approach (in portuguese)

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Nesses casos, é possível remover a dependência entre código não-gerado e gerado por meio<br />

dos padrões de Injeção de dependência ou Localizador de serviço (FOWLER, 2004). Estes<br />

padrões removem as dependências do código (neste caso, do código não-gerado) e as colocam<br />

em agentes externos, responsáveis pela <strong>in</strong>jeção das dependências através de configuração<br />

programática ou textual (normalmente XML). As dependências devem a<strong>in</strong>da ser def<strong>in</strong>idas<br />

em algum lugar, mas uma vez que isto só ocorre em uma entidade separada, estas são<br />

explícitas, sendo também mais facilmente def<strong>in</strong>idas, o que acaba melhorando o entendimento<br />

do código f<strong>in</strong>al. O código orig<strong>in</strong>al pode ser compilado <strong>in</strong>dependentemente, facilitando testes<br />

e manutenção. Além disso, o código de configuração poderia ser gerado, de forma que até o<br />

processo de <strong>in</strong>jeção seja automatizado. Por exemplo, é possível gerar arquivos de configuração<br />

para frameworks de <strong>in</strong>jeção de dependência como o Spr<strong>in</strong>g 1 .<br />

Estes padrões assumem que há um elemento fixo entre os dois lados da dependência:<br />

uma <strong>in</strong>terface, uma classe abstrata ou uma ass<strong>in</strong>atura de método. Porém, há casos onde até<br />

mesmo as ass<strong>in</strong>aturas dos métodos são geradas, como por exemplo um gerador que produz<br />

objetos de acesso a dados (Data Access objects - DAO), com métodos para realizar operações<br />

básicas de <strong>in</strong>serção, remoção e consulta. Cada DAO possui seus próprios conjuntos de métodos<br />

com diferentes ass<strong>in</strong>aturas dependendo dos nomes e atributos das entidades. Nestes casos,<br />

técnicas de reflexão podem ser a única solução para remover dependências em tempo de<br />

compilação. Através da reflexão, é possível transformar todas as chamadas de métodos de<br />

código não-gerado para código gerado em chamadas reflexivas, de forma que o método sendo<br />

chamado é desconhecido pelo compilador.<br />

Código gerado depende de código gerado: isto normalmente acontece quando há dois<br />

subdomínios que dependem um do outro.<br />

Um problema que surge do relacionamento entre múltiplos subdomínios é como garantir a<br />

<strong>in</strong>tegridade deste relacionamento. Uma possibilidade é utilizar os nomes dos elementos como<br />

referências, isto é, o nome de uma referência em um modelo deve ser idêntico ao nome do<br />

elemento referenciado, em outro modelo. Apesar de não ser ideal, esta abordagem simplifica<br />

o processo de se implementar referências entre modelos. É efetivamente utilizada devido à<br />

sua praticidade, sendo encontrada em exemplos como Apache OFBiz e algumas Microsoft DSL<br />

<strong>Software</strong> Factories (HESSELLUND; CZARNECKI; WASOWSKI, 2007).<br />

Outra opção são as pontes entre modelos, que consistem na criação de duplicatas<br />

de elementos, no metamodelo que contém a referência, que correspondem a elementos<br />

do metamodelo referenciado. No exemplo do domínio web de autoria de conteúdo,<br />

1 <br />

135

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!