Impasse entre lentidão e quebra de camadas.  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
nei.junior
JavaChild
[Avatar]
Membro desde: 11/12/2008 15:57:03
Mensagens: 101
Localização: SP
Offline

Pessoal, bom dia !

Considerem o exemplo abaixo:

No método "getDataUltimaVenda" o correto seria fazer um "FOR" e ficar procurando qual seria a última data de venda e retorná-la. Porém tenho o receio que isso com o tempo possa ficar lento, porque o número de pedidos irá aumentando com o tempo.
Uma solução seria fazer uma busca no banco de dados, porém não devo fazer acesso ao banco a partir das minhas classes de domínio.

Gostaria de sugestões de como resolver isso ?

Exemplo das classes:

Mojarra 2.1.7, Facelets, Glassfish V3.1.2, EclipseLink 2.3.2, Primefaces 3.2, NetBeans 7.1.1

Nei Alcantara Jr.
http://twitter.com/NeiAlcantaraJr

"Tudo aquilo que algum idiota diz que é urgente, é algo que um imbecil não fez em tempo hábil e quer que você se ferre para fazer em tempo recorde."
alissonvla
GUJ Master

Membro desde: 17/04/2006 15:29:07
Mensagens: 1491
Offline

cara,

vc pode fazer um select max data pedido, vc pode ter no seu DAO uma sql normal, que nao necessite usar hql ou criteria.

T+
nei.junior
JavaChild
[Avatar]
Membro desde: 11/12/2008 15:57:03
Mensagens: 101
Localização: SP
Offline

alissonvla wrote:cara,

vc pode fazer um select max data pedido, vc pode ter no seu DAO uma sql normal, que nao necessite usar hql ou criteria.

T+

Vlw pela resposta.
Mas então cara, tanto faz ser hql, criteria ou não. Isso não mudaria em nada.
A questão é, como fazer isso no "get" que esta dentro do produto sem ferir a camada e ficar fazendo "FOR" ? Pois teoricamente essa seria forma correta.

Mojarra 2.1.7, Facelets, Glassfish V3.1.2, EclipseLink 2.3.2, Primefaces 3.2, NetBeans 7.1.1

Nei Alcantara Jr.
http://twitter.com/NeiAlcantaraJr

"Tudo aquilo que algum idiota diz que é urgente, é algo que um imbecil não fez em tempo hábil e quer que você se ferre para fazer em tempo recorde."
alissonvla
GUJ Master

Membro desde: 17/04/2006 15:29:07
Mensagens: 1491
Offline

entao,

eu no meu caso faria esse seu caso passando pela camada de negocio e depois camada de persistencia, não colocaria isso direto na sua entidade.

t+
Lindberg
JavaEvangelist
[Avatar]

Membro desde: 02/05/2006 19:23:53
Mensagens: 363
Offline

uma dica, não sei se vale pra vc

eu faço assim

Select minhadata From tabela Order By minhadata desc Limit 1;



Aqui... A turma é D+++.
[WWW] [MSN]
danilo.magrini
HelloWorld

Membro desde: 26/04/2011 08:09:57
Mensagens: 14
Offline

alissonvla wrote:entao,

eu no meu caso faria esse seu caso passando pela camada de negocio e depois camada de persistencia, não colocaria isso direto na sua entidade.

t+



nei.junior e alissonvla

Essa sugestão seria uma solução, porém ao meu ver não fica tão OO quanto se estivesse dentro da entidade, a não ser que suas entidades sejam apenas objetos de valor (o que daria outra discussão enorme). Além disso, se colocar isso na camada de negócio ou persistência eu ainda vejo uma dificuldade caso você tenha que exibir uma lista (uma table por exemplo) com os atributos do seu produto e se esse valor 'dataUltimaCompra' tiver que ser listado, terá um certo trabalho para poder exibir isso.
nei.junior
JavaChild
[Avatar]
Membro desde: 11/12/2008 15:57:03
Mensagens: 101
Localização: SP
Offline

danilo.magrini wrote:
nei.junior e alissonvla

Essa sugestão seria uma solução, porém ao meu ver não fica tão OO quanto se estivesse dentro da entidade, a não ser que suas entidades sejam apenas objetos de valor (o que daria outra discussão enorme). Além disso, se colocar isso na camada de negócio ou persistência eu ainda vejo uma dificuldade caso você tenha que exibir uma lista (uma table por exemplo) com os atributos do seu produto e se esse valor 'dataUltimaCompra' tiver que ser listado, terá um certo trabalho para poder exibir isso.


Exatamente, concordo com o que o danilo.magrini disse.

Mojarra 2.1.7, Facelets, Glassfish V3.1.2, EclipseLink 2.3.2, Primefaces 3.2, NetBeans 7.1.1

Nei Alcantara Jr.
http://twitter.com/NeiAlcantaraJr

"Tudo aquilo que algum idiota diz que é urgente, é algo que um imbecil não fez em tempo hábil e quer que você se ferre para fazer em tempo recorde."
alissonvla
GUJ Master

Membro desde: 17/04/2006 15:29:07
Mensagens: 1491
Offline

cara,

eu penso no seu caso, como se fosse uma regra de negocio e não uma propriedade de uma entidade.
esse é meu pensamento.

t+
fantomas
GUJ Master
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1534
Localização: Terra (maior parte do tempo)
Offline

Começo a pensar que o método getDataUltimaVenda não deva estar na classe Produto, o que acham?

flws
ruivo
JavaChild

Membro desde: 23/08/2003 10:18:09
Mensagens: 102
Localização: Curitiba-PR
Offline

Vamos lá então. Você não quer ferir o seu modelo e isso é o correto a se fazer.
Entretanto, vejo um grande problema no seu modelo, que é o Produto ter q saber quando ele foi vendido pela última vez. Ao meu ver, isso vai contra a aquele princípio da responsabilidade única (SRP).

O modelo que eu faria é o seguinte: ter um outro objeto que, dado um produto, ele saiba responder quando aquele produto foi vendido pela última vez. Mais ou menos assim
[MSN] [ICQ]
fantomas
GUJ Master
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1534
Localização: Terra (maior parte do tempo)
Offline

nei.junior wrote:Exatamente, concordo com o que o danilo.magrini disse


Acho que vc irá afetar seu modelo incluindo uma responsabilidade de outros objetos relacionados a view.

flws
alissonvla
GUJ Master

Membro desde: 17/04/2006 15:29:07
Mensagens: 1491
Offline

e pra mim, tudo que envolve sql, faz parte da regra de negocio.

t+
danilo.magrini
HelloWorld

Membro desde: 26/04/2011 08:09:57
Mensagens: 14
Offline

ruivo wrote:Vamos lá então. Você não quer ferir o seu modelo e isso é o correto a se fazer.
Entretanto, vejo um grande problema no seu modelo, que é o Produto ter q saber quando ele foi vendido pela última vez. Ao meu ver, isso vai contra a aquele princípio da responsabilidade única (SRP).
[/code]


Aqui é onde entra as enormes discussões sobre arquitetura. Ao meu ver é responsabilidade sim do Produto saber a dataUltimaVenda, pois se isso fere o princípio da responsabilidade única então teriamos que ter objetos ProdutoCodigo, ProdutoDescricao, ProdutoPreco, ProdutoUnidade, etc;
ruivo
JavaChild

Membro desde: 23/08/2003 10:18:09
Mensagens: 102
Localização: Curitiba-PR
Offline

danilo.magrini wrote:
Aqui é onde entra as enormes discussões sobre arquitetura. Ao meu ver é responsabilidade sim do Produto saber a dataUltimaVenda, pois se isso fere o princípio da responsabilidade única então teriamos que ter objetos ProdutoCodigo, ProdutoDescricao, ProdutoPreco, ProdutoUnidade, etc;


De maneira alguma. O que é uma venda? Nada mais é que um pedido finalizado. E é um pedido que tem um produto, não o contrário. Pensa numa garrafa. Ela não tem gravada nela quando foi vendida. Agora, se pensar na nota fiscal, lá estarão as referências para os produtos que foram vendidos, com as datas e valores pagos pelo consumidor.

Se você quiser saber qual a data que um produto foi vendido pela última vez, você deve perguntar para os pedidos (ou notas fiscais) qual a última vez que aquele produto aparece, e não perguntar pro produto quando ele foi vendido, que não faz muito sentido.
[MSN] [ICQ]
edilmar
Java Ninja

Membro desde: 30/12/2003 11:14:08
Mensagens: 277
Localização: Campo Grande/MS
Offline

Isso é um dilema de arquitetura mesmo. Na minha opiniao, a data da ultima venda é uma regra de negocio, como tambem data da ultima compra, media de preco vendida, meses onde ocorre maior venda, etc. Para usar estas informacoes calculadas em uma table ou um relatorio, o melhor seria fazer estes calculos e possiveis acessos ao BD em uma classe DAO, que retornasse, por ex., uma lista de produtos com data de ultima venda. Eu inclusive crio uma classe auxiliar e faco no DAO um "SELECT new classeAuxiliarXXX(lista de campos) FROM... WHERE...", e nas tables/relatorios uso a classe auxiliar, pois fica facil acessar todos os campos, que podem vir de Produto, Venda, Cliente, etc.

SubMacro Project Owner
http://submacro.dev.java.net/
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team