20 AFR: Uma Abordagem para a Sistematização do Reúso de Frameworks Orientados a Aspectos
Frameworks orientados a objetos (FOOs), ou simplesmente frameworks, são
construídos de forma a se reutilizar tanto o código quanto o projeto de uma solução, sendo
assim uma espécie de “esqueleto” de aplicações. Frameworks possuem o código genérico
comum a todas as aplicações de seu domínio e pontos abstratos que devem ser preenchidos de
acordo com os requisitos específicos da aplicação final. Para isso, é necessária a realização de
um processo de reúso, que concretizará esses pontos abstratos – também chamados de pontos
de extensão – gerando assim a aplicação.
A implementação desses pontos de extensão geralmente utiliza parametrização e/ou
características próprias das linguagens orientadas a objetos, como herança, redefinição de
métodos, métodos abstratos, etc., além de padrões de projeto voltados para orientação a
objetos. O projeto, a construção e a utilização dos pontos de extensão são partes essenciais de
todo framework e devem ser muito bem documentados, de forma que o conhecimento possa
ser transmitido ao desenvolvedor da aplicação. Embora pareça uma idéia simples, o processo
envolvido durante a aplicação do reúso de software encontra diversos obstáculos [JAC97],
que exigem uma abordagem para a sistematização deste processo a fim de conseguir de forma
eficaz os benefícios associados ao reúso.
Existem diversas abordagens propostas com o objetivo de documentar e/ou sistematizar
o reúso de frameworks orientados a objetos, das quais podemos citar Cookbooks [KRA88],
Motifs [LAJ94], Patterns [JOH92], Hooks [FRO97], Smartbooks [ORT00], OBS [CEC03],
FRED [HAK01], UMLAUT [HO 99], UML-F [FON99], UML-FI e RDL [OLI01][OLI04]
[MEN05].
O desenvolvimento de frameworks só se tornou possível com o advento da
programação orientada a objetos. As linguagens orientadas a objetos possibilitam mais reúso
de código que as linguagens estruturadas, e também oferecem os mecanismos necessários
para a criação de pontos de extensão e a inversão de controle, como herança, polimorfismo,
interfaces e classes e métodos abstratos. Apesar disso, a programação orientada a objetos
possui certas limitações para abstrair interesses que afetem todo um sistema, como
persistência de objetos, controle de acesso, logging, desempenho, etc.
A programação orientada a aspectos [KIC97a] surgiu com o objetivo de separar
claramente esses interesses do código funcional em estruturas chamadas de aspectos. Esses
aspectos devem ser então combinados com o código da aplicação para que a funcionalidade
definida nos mesmos possa ser incorporada pelo sistema.
Logo começou-se a investigar o uso desses novos mecanismos de abstração e
composição no desenvolvimento de frameworks, dando origem a novas formas de projeto e