Sensivelmente nos últimos seis meses estive envolvido num trabalho de investigação sobre o tema acima. Chega agora a altura de escrever o relatório que vai ser feito em paralelo aqui neste
blog.
Parte IO objectivo do projecto era a implementação de alguns padrões de design de software conhecidos como
Gang of Four (GoF) para poder explorar as potencialidades da linguagem e compará-las com o muito conhecido AspectJ e também com as implementações existentes em Java.
Além dos pointcuts que são os mesmos que o AspectJ usa, o CaesarJ introduz funcionalidades mais alto-nível que permitem melhorar substancialmente a capacidade de modelar os conceitos transversais ao programa.
São exemplo disso as
collaboration interfaces que permitem que dentro duma classe possam existir outras que são partes do mesmo modelo. Definindo a estrutura em abstracto desse modelo, é deixado para mais tarde a implementação do modelo. Melhor, é possível só implementar a parte que é independente da aplicação específica do modelo. Essa parte, normalmente chamada
binding, pode ser um outro módulo à parte que ligará, no contexto da aplicação, através de
herança múltipla uma das muitas possíveis implementações existentes com o
binding para o caso específico.
ExemploUm sistema de cartografia com suporte para várias vias de comunicação: estradas, auto-estradas, caminhos de ferro, rios navegáveis, etc...
A representação típica deste modelo num sistema de computação é usando grafos. A abordagem tradicional em OOP é definir os algoritmos necessários (caminhos mais curtos, mais longos, ligações importantes, etc...) para cada tipo: para estradas e auto-estradas, para caminhos de ferro, para os rios, etc...
O AspectJ não tem nenhum mecanismo capaz de lidar com este tipo de problemas.
No entanto, o CaesarJ é capaz! Defnido uma
collaboration interface composta de "Vértice" e "Aresta", os componentes abstractos dum grafo, podemos implementar os algoritmos que trabalharão com esta representação. Tudo o que resta fazer, é fazer três simples módulos de
binding:
- estradas e auto-estradas são Arestas e os cruzamentos formados são Vértices
- as estações são Vértices e as ligações entre elas são Arestas
- os rios são Arestas ...
Quando a aplicação necessitar de efectuar um qualquer cálculo apenas tem que instanciar a combinação desejada da implementação dos algoritmos com o
binding necessário e é tudo que tem de complicado.
Parte I chega ao fim, mais se seguem...