Business Object VS Controller

[quote=rlanhellas]Minha ideia é o seguinte, para minha aplicação MVC:

1 - br.com.meuprojeto.bean (Todos os POJOS ficam aqui)
2 - br.com.meuprojeto.dao (Todos os DAOS ficam aqui)
3 - br.com.meuprojeto.bo (Todos os Business Object ficam aqui e se comunicam com o DAO, como se fosse um Repository)

4 - br.com.meuprojeto.gui (Frames da aplicação)[/quote]

Desculpe mas dessa forma sua aplicação tende a ficar procedural.

Faça com que seus Pojos não sejam simples beans e sim implemente lógicas de negócio e que eles sejam o ponto de partida para façades de serviço (até pode chamar de BO) que façam a parte de repositório.

Sempre cito o seguinte exemplo:
A classe Conta possui os métodos deposito() e saque(), mas jamais o método transferência (que muita gente cita que faz parte da classe conta).
Transferência é um serviço que ocorre em 2 contas (origem e destino), onde é realizado o saque da origem e deposito da destino, em um contexto transacional e que pode ser chamada por diversos outros dominios do sistema, por exemplo, um funcionario fazer uma transferência ou ainda um cliente a realizar.

Ele pode ter mais do que getters / setters sim.
Porém, precisa de getters / setters para todos seus atributos. E isso pode atrapalhar a modelagem, e até a codificação.

Ele pode ter mais do que getters / setters sim.
Porém, precisa de getters / setters para todos seus atributos. E isso pode atrapalhar a modelagem, e até a codificação.

[/quote]
Não entendo assim… posso estar errado, mas qual seria o motivo disso ??? Um objeto java simples conforme definido por Fowler pode implementar suas regras de negócio usando simplesmente OO e mais nada… o que o caracteriza como um objeto puro é não implementar nenhum interface como por exemplo um EJB.
Não entendo onde isso atrapalhe a modelagem ou codificação…
O padrão javabean sim dita ter getters e setters para tudo.

E na minha visão POJO != JavaBean

[quote]Sempre cito o seguinte exemplo:
A classe Conta possui os métodos deposito() e saque(), mas jamais o método transferência (que muita gente cita que faz parte da classe conta).
Transferência é um serviço que ocorre em 2 contas (origem e destino), onde é realizado o saque da origem e deposito da destino, em um contexto transacional e que pode ser chamada por diversos outros dominios do sistema, por exemplo, um funcionario fazer uma transferência ou ainda um cliente a realizar. [/quote]
Muito bom exemplo!

E eu acho que POJO == JavaBean.

Posso estar errado e falando bobeira, mas só mudo de opinião depois de ler algum artigo que prove o contrário.

alias, se eu estiver errado e você tiver algum artigo que prove, fico muito grato se me passar - evitaria eu falar algo errado novamente.

[quote=$ERVER]E eu acho que POJO == JavaBean.

Posso estar errado e falando bobeira, mas só mudo de opinião depois de ler algum artigo que prove o contrário.[/quote]

Você leu a definição de POJO do Martin Fownler ???

An acronym for: Plain Old Java Object.

The term was coined while Rebecca Parsons, Josh MacKenzie and I were preparing for a talk at a conference in September 2000. In the talk we were pointing out the many benefits of encoding business logic into regular java objects rather than using Entity Beans. We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it’s caught on very nicely.

[quote=jmmenezes][quote=rlanhellas]Minha ideia é o seguinte, para minha aplicação MVC:

1 - br.com.meuprojeto.bean (Todos os POJOS ficam aqui)
2 - br.com.meuprojeto.dao (Todos os DAOS ficam aqui)
3 - br.com.meuprojeto.bo (Todos os Business Object ficam aqui e se comunicam com o DAO, como se fosse um Repository)

4 - br.com.meuprojeto.gui (Frames da aplicação)[/quote]

Desculpe mas dessa forma sua aplicação tende a ficar procedural.

Faça com que seus Pojos não sejam simples beans e sim implemente lógicas de negócio e que eles sejam o ponto de partida para façades de serviço (até pode chamar de BO) que façam a parte de repositório.

Sempre cito o seguinte exemplo:
A classe Conta possui os métodos deposito() e saque(), mas jamais o método transferência (que muita gente cita que faz parte da classe conta).
Transferência é um serviço que ocorre em 2 contas (origem e destino), onde é realizado o saque da origem e deposito da destino, em um contexto transacional e que pode ser chamada por diversos outros dominios do sistema, por exemplo, um funcionario fazer uma transferência ou ainda um cliente a realizar.
[/quote]

Se eu utilizar da forma que você cita, colocar todo CRUD direto no meu POJO, então não estaria sobrecarregando o mesmo e quebrando o conceito de DDD ? (Domain-Drive Design) ?

Quando Martin Fownler definiu POJO não fez nenhuma relação direta com javabean… agora, se depois ele fez isso de alguma outra forma então também estou errando chamando de POJO o que não é…

Sei não, fiquei na dúvida nisso agora também. Vou fazer uma pesquisa amanhã, agora indo pra casa. Muito obrigado, e até amanhã! Abraços!

[quote=rlanhellas][quote=jmmenezes][quote=rlanhellas]Minha ideia é o seguinte, para minha aplicação MVC:

1 - br.com.meuprojeto.bean (Todos os POJOS ficam aqui)
2 - br.com.meuprojeto.dao (Todos os DAOS ficam aqui)
3 - br.com.meuprojeto.bo (Todos os Business Object ficam aqui e se comunicam com o DAO, como se fosse um Repository)

4 - br.com.meuprojeto.gui (Frames da aplicação)[/quote]

Desculpe mas dessa forma sua aplicação tende a ficar procedural.

Faça com que seus Pojos não sejam simples beans e sim implemente lógicas de negócio e que eles sejam o ponto de partida para façades de serviço (até pode chamar de BO) que façam a parte de repositório.

Sempre cito o seguinte exemplo:
A classe Conta possui os métodos deposito() e saque(), mas jamais o método transferência (que muita gente cita que faz parte da classe conta).
Transferência é um serviço que ocorre em 2 contas (origem e destino), onde é realizado o saque da origem e deposito da destino, em um contexto transacional e que pode ser chamada por diversos outros dominios do sistema, por exemplo, um funcionario fazer uma transferência ou ainda um cliente a realizar.
[/quote]

Se eu utilizar da forma que você cita, colocar todo CRUD direto no meu POJO, então não estaria sobrecarregando o mesmo e quebrando o conceito de DDD ? (Domain-Drive Design) ?[/quote]

Não… você não vai colocar todo seu CRUD no seu pojo… e sim as regras de dominio em cada um deles…
Veja o exemplo que citei da Conta e da transferência.
O Fluxo deve ser gerenciado por um controller ou presenter… ele que será responsável pelo fluxo destas!

Sei não, fiquei na dúvida nisso agora também. Vou fazer uma pesquisa amanhã, agora indo pra casa. Muito obrigado, e até amanhã! Abraços![/quote]

Legal… também vou fazer uma pesquisa e tentamos chegar nessa conclusão, pois posso também estar errado!
Abs

Sei não, fiquei na dúvida nisso agora também. Vou fazer uma pesquisa amanhã, agora indo pra casa. Muito obrigado, e até amanhã! Abraços![/quote]

Legal… também vou fazer uma pesquisa e tentamos chegar nessa conclusão, pois posso também estar errado!
Abs[/quote]

Algumas pesquisas rapidas e temos diversas opniões iguais a minha (e acredito que baseadas no que o Fowler definiu)…
POJO não é Javabean, mas todo Javabean é POJO

http://www.guj.com.br/java/53305-conceitos-javabeans-pojo-vo-e-dto


http://docstore.mik.ua/orelly/java-ent/jnut/ch06_02.htm

Aqui tem boas definições e uma explicação sobre as diferenças entre javaBean, POJO e Spring Bean.
Aqui uma descrição da wikipedia (em idioma bretão) sobre ambos. Notem que há uma certa confusão também.
Particularmente, entendo que POJO pode ser sempre um JavaBean, mas um JavaBean só é um POJO às vezes.

Sei não, fiquei na dúvida nisso agora também. Vou fazer uma pesquisa amanhã, agora indo pra casa. Muito obrigado, e até amanhã! Abraços![/quote]

Legal… também vou fazer uma pesquisa e tentamos chegar nessa conclusão, pois posso também estar errado!
Abs[/quote]

Algumas pesquisas rapidas e temos diversas opniões iguais a minha (e acredito que baseadas no que o Fowler definiu)…
POJO não é Javabean, mas todo Javabean é POJO

http://www.guj.com.br/java/53305-conceitos-javabeans-pojo-vo-e-dto


http://docstore.mik.ua/orelly/java-ent/jnut/ch06_02.htm

[/quote]
Discordamos, portanto.
Um POJO, como definido por Fowler, pode ser um JavaBean. Porém, como o POJO poderá ter métodos diferentes do que a especificação JavaBean define, nem todo JavaBean pode ser um POJO.

Pois é, realmente eu estava enganado, confundindo POJO com JavaBean.
Apesar de ter errado o nome, acho que no conceito nós pensamos igual, já que achamos que setters e getters jogados a esmo em todas as classes não são uma boa prática.
Muito obrigado por ter pesquisado e postado os resultados, agora não falo mais bobeira sobre isso.

Concordo contigo, sigo essa lógica também!

$SERVER, confesso que fiquei um pouco confuso com o seu ponto de vista. Primeiramente você diz que utilizar os JavaBeans na camada de modelo (classes que contem os atributos espelhando o que está no banco de dados) é uma prática ultrapassada, porém, logo após você se contradiz, dizendo que realmente não daria para agregar a uma simples classe de entidade todas as responsabilidades de gerenciamento de conexão, transações. Sendo assim, não seria nem uma coisa nem outra? :stuck_out_tongue:

A meu ver, isso de “Usar JavaBean está ultrapassado” não procede. Com que base você afirma isso? Considerando um projeto com ORM, utilizando por exemplo Hibernate, temos uma distribuição ideal de responsabilidades em que a “Entidade” (JavaBean) contém os atributos, os respectivos mapeamentos e também algumas named queries, que de certa forma fazem o papel do active record para busca/leitura, mas na minha opinião seria inviável adicionar métodos salvar, atualizar, remover, numa entidade em um projeto com essas características.
Em contrapartida, a utilização do DAO ou não ainda divide opiniões, visto que o próprio framework de persistência oferece uma implementação do EntityManager, que de certa forma já funciona como um DAO genérico. Sendo assim, pra mim, os DAO são totalmente dispensáveis, eu costumo trabalhar com um DAO genérico que é acessado diretamente pelos objetos de negócio (SessionBeans EJB). Para não ficar um acoplamento tão grande em relação a tecnologia (SessionBeans injetando diretamente o EntityManager), pode ser criado um SessionBean que será o DAO genérico e irá injetar dentro dele o EntityManager, assim caso você queira trocar a estratégia de persistência, bastaria trocar a implementação do DAO genérico.
Outra coisa, sobre a divisão de pacotes, citada pelo nosso amigo rlanhellas. Eu não sou muito fã de dividir pacotes dessa forma, especificando “dao”, “bean”, “bo” etc. Imagina só um sistema com 100 entidades e 150 BOs. Você vai ter uma infinidade de classes dentro de um mesmo pacote. O que eu costumo usar é separar por módulos, que conversam entre si através de interfaces. Por exemplo: módulo de autenticação tem pacotes com suas entidades e BOs, módulo de gerenciamento de pedidos, módulo de gerenciamento de produtos, etc, etc. Quanto mais você dividir e componentizar sua aplicação, melhor. Então nesse caso, a dica que eu dou é: evite os pacotes genéricos demais. A nao ser que a aplicação seja extremamente pequena e focada.

A divisão de camadas que costumo usar é, por exemplo:

Módulo Corporativo (EJB):
Interface para fachada do módulo da aplicação > [implementado por] >> Session Bean que disponibiliza os prncipais métodos para o módulo > [utiliza] >> Classes de Negócio (Sessionbeans EJB) >>> utiliza >>> Interface de gerenciamento de persistência >> [implementado por] >> Session Bean que utiliza o EntityManager >>>[manipula] >>> Entidades (JavaBeans)

Módulo Web - interface gráfica:
Páginas XHTML >>> [acessam] >>> JSF Managed Beans >>> [acessam] >>> Interface para fachada do módulo da aplicação

Então, como se pode ver, MVC não é separar a aplicação em tres pacotes (model, controller e view) e jogar tudo de qualquer jeito lá dentro. Mas sim, a forma como você organiza a responsabilidade dos seus componentes, independentemente dos pacotes em que eles estejam.

Entrei no mundo Java, e consequentemente OO há poucos meses.

Sempre que procuro ler sobre DAO’s, POJO’s, DTO’s, se devem ser usados ou não, fico sempre muito confuso e não consigo formar uma opinião consistente.

O que vou falar, pode ser um absurdo, mas gostaria que dissessem o que acham:

Quais os contras de criarmos uma classe abstrata com os atributos e assinatura dos métodos de CRUD (inserir, atualizar, remover), e criarmos 2 classes (um DAO e um BO) que herdem desta classe abstrata os atributos, e implementam os métodos abstratos de acordo com sua responsabilidade, o BO tendo o método inserir para validar os dados e o DAO tendo o método inserir contendo a implementação necessária para gravar no BD?

estevan3108, é como eu falei. Esse DAO genérico, que você se refere, caso você use ORM, já é disponibilizado pelo provedor de persistência, é o EntityManager. Você pode injeta-lo em qualquer classe de negócio e usar as funções de CRUD sob qualquer entidade. Já sobre criar um BO genérico, não vejo sentido. Primeiramente, Java não possui herança múltipla, então você estaria limitando os seus BOs a nunca poderem herdar de uma outra classe. Além disso, classes de negócio naturalmente são bem específicas, cada uma possui suas próprias regras e métodos diferentes. Sendo assim, não teria lógica ter uma classe genérica pra todos. :slight_smile:

Tem razão Diego!

Ainda ficou uma dúvida, quando não usamos DTO’s ou POJO’s. Colocamos dados e lógica na mesma classe.
Como ficaria este transporte de dados por exemplo para uma classe de persistência? Partindo do princípio que lógica de domínio e persistência estão separados. Eu passaria para a classe de persistência uma instância da classe de lógica? Faz sentido?