Essa é para quem usa frameworks de AOP dinamico, JAC e AspectWerks por exemplo.
Antes de continuar lendo esse post eu recomento ler o blog do
Rickard Öberg http://www.jroller.com/page/rickard.
Ele fala de uma forma parareduzir o número de casts e boa parte da falta de tipo encontrada em aspectos e mixins.
A idéia é estabelecer um contrato entre as classes sendo aspectadas e os aspects/mixins. Esse contrato seriam interfaces que seriam compartilhadas entre todos. Mas como isso ficaria parecendo?
public interface hasPolicy {
public void setPolicy(SecurityPolicy policy);
public SecurityPolicy getPolicy();
}
public interface ResourceLocator {
Resource locateResource(URL url);
}
Nossa implementação de ResourceLocator exige que o objeto modificado possua uma SecurityPolicy:
public abstract class SecureResourceLocator implements ResourceLocator,
hasPolicy {
public Resource locateResource(URL url) {
Resource r = ...
r.checkPolicy(getPolicy());
}
}
e nossa classe que vai receber o mixin:
public class SecureObject implements hasPolicy {
SecurityPolicy policy;
public void setPolicy(SecurityPolicy policy) { this.policy = policy; }
public SecurityPolicy getPolicy() { return policy; }
}
Agora mandamos nosso framework de AOP fazer o seguinte mixin:
classe SecureObject
- interface ResourceLocator implementação SecureResourceLocator
A dependencia de SecureResourceLocator é resolvida já que SecureObject implementa hasPolicy.
Resultado, o código do mixin ficou muito mais claro alem do maior poder que isso permite. Inclusive, seria possivel usar outro mixin com a implementação de hasPolicy, ela não precisa ficar na classe sofrendo as introductions.
O Rickard implementou essa ideia usando dynamic proxies, porêm esse método possui alguns problemas e limitações.
Implementei hoje um protótipo dessa ideia somente para mixins usando javassist. E funcionou muito bem!
Essa idéia pode ser utilizada também com advices, porêm aqui eu discordo do rickard, ele acha que usar 1 interface Advice com 1 método proceed é melhor que usar diretamente a interface da classe sendo advised, acho o contrario, que fica melhor sem essa interface.
Alguem aqui, alem do cv, já deu uma pensada nessa idéia do rickard?