Seguintes, vou precisar implantar um log de modificações na alteração de um objeto, isto é, sempre que esse objeto sofrer qualquer modificação, preciso saber o que mudou e persistir isso num log. No caso, é um objeto chamado Produto com vários atributos: cada vez que um ou mais desses atributos for modificado, preciso saber qual foi esse atributo e qual o novo valor dele. Eu poderia fazer isso manualmente para esse objeto, mas pensei em fazer algo mais completo, uma classe que faça essa comparação com qualquer objeto que eu quiser.
Se fosse algo específico para o “Produto”, eu até saberia por onde começar, mas não tenho nenhuma ideia por onde começar a fazer isso de modo genérico, que sirva para qualquer objeto. Eu teria que percorrer cada atributo da classe e comparar com outro, mas também precisaria poder - caso eu quisesse - ignorar um ou mais atributos dessa comparação, de alguma forma.
Esse tipo de problema tem algum nome específico, por onde eu deveria começar a pesquisar?
Eu implementei isso de uma forma genérica através de Reflection. Basicamente criei uma funcionalidade onde passo dois objetos da mesma classe (um com os valores originais e outro com valores possivelmente alterados) e essa classe varre todos os getters do objeto e compara seus valores. Caso encontre algum diferente, grava o log disso. Atualmente a funcionalidade que fiz passa em todos os métodos getters públicos do objeto, mas com algumas alterações tem como passar getters que não devem ser comparados.
Segue alguns referências que foram bastante úteis na época.
Reflection é lento… e ainda mais para gerar log…
Recomendo fortemente você utilizar Aspecto(AOP, AspectJ) para fazer essa função, alem de ser mais rapido é mais facil de implementar
[quote]Reflection é lento… e ainda mais para gerar log…
Recomendo fortemente você utilizar Aspecto(AOP, AspectJ) para fazer essa função, alem de ser mais rapido é mais facil de implementar [/quote]
Concordo. Pra gerar o log você pode usar Aspectos mesmo.
Só não entendi o que Aspecto ajudaria na comparação de atributos de uma entidade a fim de descobrir o que mudou nela. Pelo que entendi essa era a dúvida do post, fazer uma solução genérica que comparasse os atributos de um objeto (variável) para ver quais foram alterados e gravar isso num log.
Não conheço muito de programação orientada a aspectos, mas se você puder dar um exemplo de como usar Aspecto para isso eu agradeceria.
Estive dando uma lida sobre AOP e realmente é muito interessante e serve perfeitamente para o meu caso.
A programação orientada a aspectos permite que determinados comportamentos sejam embutidos de maneira transparente dentro do código, de forma que regras de infraestrutura (no caso, o log) não fiquem no mesmo ponto do código que estão as regras de negócio.
Estou seguindo uma reportagem muito boa que li na Java Magazine #34, mas o exemplo é para Eclipse. Alguém já implementou no NETBEANS? O plugin do AspectJ não roda na versão 7.x do Netbeans…
Uma maneira bem ingênua de tratar isso é modificar o objeto apenas através de setters, e implementar as chamadas aos logs nos setters. Por exemplo, em vez de usar um setter simples, pode usar algo como:
class Produto {
...
private String nome;
...
public void setNome (String novoNome) {
if (! nome.equals (novoNome)) {
log.info (String.format ("Produto %s -> %s", nome, novoNome));
nome = novoNome;
}
}
...
}