Muito tem se falado em POJOs (Plain Old Java Objects), boas e más coisas. As boas coisas geralmente mencionam como é mais fácil desenvolver sem utilizar parafernalhas como EJB 2.x e sobre o poder que utilizar OO pura te dá. As coisas ruins falam sobre como a comunidade Java é formada por um bando de idiotas que acaba de descobrir que existe vida além de frameworks e dão para este conceito um nome estúpido.
Justificando a ‘abordagem POJO’, vamos tentar entender o porque do hype em cima de POJOs. Antes de mais nada vamos a uma definição:
Um POJO é um objeto java normal que não implementa nenhuma interface nem estende nenhuma classe específica de um framework.
Exemplificando, isso é um POJO:
public class Venda{
private List
public void adicionarItem(Item i){
vendas.add(i);
}
…
}
Esta classe não depende de nenhum framework, ela lida apenas com os objetos do domínio em questão.
Mas isto não é um POJO:
public class AdicionarVendaServlet extends HttpServlet {
...
public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
venda.add(daoItens.get(req.getparameter("item"));
}
}
Porque para criar um Servlet você precisa estender uma classe do framework de Servlets.
E porque dar um nome para classes Java normais? Bem, segundo Fowler, um dos autores do termo, basicamente o termo surgiu como um vocabulário comum e cool para se referir a esta técnica. É aquela história de vocabulário comum que falamos outro dia.
Um sistema baseado em POJOs utilizando Camadas, DIP e outras técnicas para eliminar a dependência de frameworks e outras classes de infra-estrutura é bem interessante. Na revista Mundo Java deste mês há um artigo introdutório meu falando sobre como você pode aplicar POJOs no desenvolvimento do seu Domain Model, utilizando Patterns específicos.
Uma coisa que andei pensando estes dias é uma lei que restrinja ainda mais o acoplamento de POJOs na Camada de Negócios com a infra-estrutura. Taí o que eu chamo de Strict POJOs:
Um POJO só pode se relacionar diretamente com outro POJO ou com POJIs.
POJI são Plain Old java Interfaces, é o mesmo conceito de POJO aplicado a interfaces. A idéia é baseada no DIP (Dependency Inversion Principle, mais detalhes na revista) e a sua classe de infra-estrutura deve implementar uma POJI para poder ser utilizada por seu POJO. Confuso?
Exemplo:
Imagine que temos uma classe Usuario que precisa acessa o banco de dados para consultar seus grupos. Como é uma classe de negócio ela não deve nem pensar em encostar em hibernate, JDBC, JDO ou o que estiver utilizando. Normalmente alguém faria um DAO acessar o banco de dados e a classe de negócios utilizar o DAO. Bem, DAO é uma classe de infra-estrutura e para aplicarmos nosso conceito de Strict POJOs o Usuario não pode conversar com ela. E agora?
Abstraímos o banco de dados seguindo o padrão Repository:
public interface RepositorioGrupos{
public List
}
Esta interface é uma POJI. Agora faremos nosso usuário lidar com esta interface ao invés de com o DAO:
public class Usuario{
private RepositorioGrupos repositorio=null;
/** Checa se o usuário pertence a um dado grupo */
public boolean pertenceA(Grupo g){
List
boolean pertence = meusGrupos.contains(grupo);
return pertence;
}
}
E faremos o DAO implementar a interface RepositorioGrupos (essa parte foca para você).
A vantagem desta abordagem é separar completamente a infra-estrutura da sua aplicação. Se você trabalha com um processo onde se produzem diagramas antes de codificar, isto permite que você crie diagramas muito mais reais, já que neles você não precisa se preocupar com bancos de dados e etc. O uso de um framework como Spring ou Java EE 5.0 ajuda muito já que você não precisaria nem mesmo isntanciar seus objetos.
A idéia básica é que você deve manter seus objetos de negócio isolados de tudo que não seja regra de negócio.
Bom, espero que gostem do artigo ;)
Amigo, só faltou o código fonte da matéria. Vc diz que o código esta no site da revista, mas fui lá, e tem o código de outras matérias, mas não a sua. Ai vi aqui e novamente não encontrei. Bem, eu gostei muito da matéria e é uma pena que nem vc e nem a revista tenham chegado num acordo para disponibilizar aos seus leitores.
:(
cara.. parabéns pelo artigo.. tah muito bom.. me esclareceu coisas que eu nao tinha conseguido entender ainda.. :D
só nao consegui imagina uma situação, por exemplo..
na minha aplicacao tem uma tabela pessoa… todos as outras tabelas do sistema que tambem sao uma pessoa (empresa, cedente, sacado) tem ligacao
com ela, como eu faria os meos BO pra esse objeto? ele não tem uma regra de negocio especifica.. as regras ficam
nestes outros objetos, que estao vinculados a pessoa..
nao sei se fui muito claro..
mais uma vez parabens!
Oi, rafael, obrigado,
Não entendi muito bem seu exemplo. Você tem uma classe Pessoa e outras que herdam desta? Lembre-se que o ideal é fazer o modelo de dados ser baseado no modelo de classes, não o contrário. Acho que você está com dificuldade no mapeamento Objeto-Relacional…. hmm, bom tema para um outro artigo :)
nao é heranca.. é só o relacionamento mesmo..
na real o seguinte… o sistema já existe.. só que ele vai entra numa reestruturacao forte.. e nessa reestruturacao nao vo pode mexe no banco (pelo menos agora), e quero monta a estrutura dele usando POJOs.. porem nao entendi como usar isso quando um dado que vai ser persistido nao tiver uma regra de negocio.. o façade acessa direto o DAO?
no caso do exemplo (que é real), as tabelas de cedente, sacado, empresa, etc, “herdam” da tabela pessoa, entao pessoa só serve pra centraliza os dados, e essa tabela só tem essa utilidade, só vai ter “insert”, “update”, e “delete” na final das contas.. como eu trato isso?
Tem como me manda os codigos do artigo da revista?
valeu!
muito bom o seu artigo. você poderia me enviar arquivos fontos citados para melhor entender o conceito
Eu também gostaria de receber os fontes, se possível.!
E tenho uma dúvida… os métodos pra persistir o objeto de domínio também ficariam no “Repositório”?
Exemplo:
RepositorioCliente.salvar(Cliente c);
Outra coisa… esse tipo de método seria estático, como também métodos que não dependem da existência de um objeto específico, como “listarTodosOsClientes”?
Valeu!