| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 11:28:56
|
MauricioAniche
Entusiasta Java
Membro desde: 20/12/2007 18:33:07
Mensagens: 24
Offline
|
Pessoal,
Estou começando agora no DDD, e esse é meu primeiro projeto tentando usar os conceitos... Talvez a dúvida seja boba, mas, vamos ver!
Bom, eu tenho a seguinte regra de negócios.. Tenho TABELAS DE PREÇO que variam mensalmente, ou seja tenho a tabela1 do mês 01/2008, 02/2008, e assim por diante...
Minha dúvida é: Como devo carregar essa tabela? Se pensarmos em banco de dados, tenho 2 tabelas relacionadas.. TabelaDePreco e ValoresDaTabela.
Minhas classes estão mais ou menos assim:
public interface TabelaRepository {
Tabela pegaPorId(int id) throws SQLException;
List<ValorTabela> pegaValores(int tabela, int mes, int ano) throws SQLException;
}
public class Tabela {
private String nome;
private List<ValorTabela> valores;
// getters and setters!
public Tabela() { valores =new LinkedList<ValorTabela>(); }
public void carregaValores(int mes, int ano) {
setValores(repositorio.pegaValores(getId(), mes, ano));
}
}
E aí no meu Struts Action, eu faço algo do tipo:
Tabela t = repositorioTabelas.pegaPorId(id);
t.carregaValores(01,200 ; // para carregar janeiro!
Estou pensando corretamente?
O que vocês sugerem?
Acabou de me vir na cabeça, que o cliente da loja nunca abre uma tabela sem mês ou ano definido (afinal pra ele, tabelas sem mês ou ano não existem, correto?). Então minha busca de tabelas, além do ID, eu devo passar mes e ano obrigatoriamente?
Conseguiram entender?
Grato,
Mauricio
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 12:48:07
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
MauricioAniche wrote:
1) Repositorios não lançam SQLException! 2) Repositorios não são interfaces! O que vc quer é trabalhar com dados que dependem da data. Isso é algo comum e para resolve isso vc cria um método passando a data. Simplesmente faça assim Desta forma vc obtem a tabela com os preços atuais por default. Se em algum ponto vc precisa das tabelas anteriores vc pode fazer isso executando valueAt() Use Date ou um outro objeto ( No seu caso um MonthOfYear seria melhor mas pode usar Date com o dia setado em 1). Isso aumenta a segurança do seu codigo e a legibilidade.
This message was edited 1 time. Last update was at 24/04/2008 12:48:43
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 13:09:28
|
MauricioAniche
Entusiasta Java
Membro desde: 20/12/2007 18:33:07
Mensagens: 24
Offline
|
Oi Sérgio,
Eu coloquei meu Repositorio como interface, pois pelo que vi em todas as discussões aqui, um DAO deve implementar um Repositorio...
Então eu tenho um iBatisDAO que extende meu Repositório... Não usei injeção de dependência pq o projeto é muito simples, acabei usando um factoryzinho básico...
Entendi que não posso fazer ele lançar SQLException já que a exceção está ligada à um banco de dados.. Mas posso fazer ele lançar um RepositorioException, certo? Afinal, falhas podem ocorrer, eu devo tratá-las!
Entendi sua abordagem, foi o que coloquei no final da minha msg!
Acrescentando mais uma dúvida:
Eu preciso deletar um item ali na lista de itens... É um projeto web, e você sabe que o máximo que eu posso fazer é passar o ID do item a ser excluido... Minha solução, veja se você concorda:
class Tabela {
public ItemTabela deletaItem(int id) {
for(ValorTabela it : getValores()) {
if(it.getId()==id) {
getValores().remove(it);
// exclui do repositorio
repositorio.deletaItem(it);
}
}
}
}
Repare que eu chamei a função de deletar do repositório dentro da função. Como o pcalcado disse em outros posts, e não me recordo exatamente das palavras, mas a idéia era que ter que pedir pro repositório excluir é uma 'falha', mas somos obrigados a excluir de alguma forma o item do banco de dados...
Vocês concordam com o código acima?
Desculpem pelas perguntas tão ignorantes, mas é só pondo a mão na massa que se aprende!
[]'s
Mauricio
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 13:31:01
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 719
Offline
|
Eu coloquei meu Repositorio como interface, pois pelo que vi em todas as discussões aqui, um DAO deve implementar um Repositorio...
Um DAO deve abstrair em qual banco de dados vc guarda os dados, esta é a motivação do padrão. Ele não precisa necessariamente implementar um repositório, embora possa tbm ser implementado desta forma. Particularmente eu prefiro compor um Repositório com um DAO, do que implementa-lo com um.
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 13:48:09
|
MauricioAniche
Entusiasta Java
Membro desde: 20/12/2007 18:33:07
Mensagens: 24
Offline
|
Alessandro,
Então seu repositório é algo parecido com:
class Repositorio {
private Dao dao;
public Elemento pegaPorId(id) { return dao.pegaPorId(id); }
}
Você assim não acaba apenas repassando o comando pro teu DAO? Qual a vantagem de compor o repositório com o DAO?
[]'s
Mauricio
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 14:06:55
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 719
Offline
|
Qual a API uso para persistir ou consultar meus dados abaixo?
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.org/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 14:31:11
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
MauricioAniche wrote:Oi Sérgio,
Eu coloquei meu Repositorio como interface, pois pelo que vi em todas as discussões aqui, um DAO deve implementar um Repositorio...
hum... procurar no guj é legal, mas procure tb fora dele ...
Então eu tenho um iBatisDAO que extende meu Repositório...
Repare na contradição logica : um DAO extend um Repositorio.
"Extend" significa "é um". Vc está dizendo que "DAO é um Repositorio" ... humm meio inutil ter dois nomes para a mesma coisa.... Se é um DAO deve extender DAO , se é um Repositorio deve extender Repositorio
O que é mais logico
E como eu disse antes, Repositorio não é uma interface. É uma classe.
Vc faz um e usa sempre o mesmo
DAO é uma interface. Vc faz um, mas no futuro pode fazer outro e ter dois.
Entendi que não posso fazer ele lançar SQLException já que a exceção está ligada à um banco de dados.. Mas posso fazer ele lançar um RepositorioException, certo?
certo. Pode ser algo mais geral como PersistenceException.
Eu preciso deletar um item ali na lista de itens... É um projeto web, e você sabe que o máximo que eu posso fazer é passar o ID do item a ser excluido...
cof cof... isso é minimo, não o máximo. Vc pode passar o objeto a ser excluido
Minha solução, veja se você concorda:
Repare que eu chamei a função de deletar do repositório dentro da função.
Esse código está meio confuso. Porque eu gostaria de remover um Valor da tabela ?
E porque eu gostaria que isso se refletisse automáticamente no banco ? E se eu quiser me arrepender ?
uma opção
This message was edited 1 time. Last update was at 24/04/2008 14:32:12
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 14:50:43
|
MauricioAniche
Entusiasta Java
Membro desde: 20/12/2007 18:33:07
Mensagens: 24
Offline
|
Oi Sérgio,
Eu não procuro apenas no guj... O GUJ aliás, comecei a ler há alguns dias quando um amigo me disse que haviam bastante pessoas de DDD discutindo lá!
Eu usei a palavra errada. No meu caso meu DAO implementa Repositorio (já que ele é uma interface)... Mas entendi e concordo com vc!
Sim, é o mínimo (de novo me expressei mal), mas o usual é mesmo passar o id do elemento que você quer apagar. Não sei como fazer em Java, para que de uma forma fácil ele guarde o objeto e recupere na hora do post. Em .NET (na qual eu conheço um pouco mais) eu usaria ViewState ou até mesmo o framework MindLib para isso.
Pq eu apagaria o objeto naquele momento? Não sei, regra do cliente... A minha dúvida era se eu poderia chamar o repositório para operações de altera(), deleta(), etc, de dentro do domínio, do jeito que eu fiz!
[]'s
Mauricio
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 15:54:56
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
MauricioAniche wrote:
Pq eu apagaria o objeto naquele momento? Não sei, regra do cliente... A minha dúvida era se eu poderia chamar o repositório para operações de altera(), deleta(), etc, de dentro do domínio, do jeito que eu fiz!
"poder" vc pode. "dever" vc não deve.
Alterações do estado do sistema devem estar dentro de uma transação , de um processo. Senão vira uma zona...
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 16:19:36
|
MauricioAniche
Entusiasta Java
Membro desde: 20/12/2007 18:33:07
Mensagens: 24
Offline
|
Sérgio,
Entendi, na teoria. Na prática, como implemento esse processo?
[]'s
Mauricio
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 16:41:09
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
MauricioAniche wrote:Sérgio,
Entendi, na teoria. Na prática, como implemento esse processo?
Existem várias formas.
)chamar o DAO directamente (TabelaDAO.alterar(tabela)). Este é o mais usual. Parte-se do principio
de que quem executa este codigo está dentro de uma transação. Se não estiver usa-se outro método
) chamar um método em um serviço especial
(TabelaService.altera(tabela)) isso é normalmente usado quando a lateração da tabela tem outras impliações.
Por exemplo quando vc guarda uma conta bancária vc quer inicializar o saldo dela criando um registro em outra tabela. O facto de usar um serviço ( na realidade um método) vc pode injetar o controle transacional dentro dele ou (em ambiente JEE) em torno dele.
) seguir o padrão UnitOfWork. Aqui vc cria uma classe (unidade de trabalho) que tem um método execute() por exemplo. Vc inicializa essa classe com os parametros necessários ao funcionamento. No caso a tabela. Ai vc envia para um executor de trabalho (WorkExecutor). Esse objeto irá iniciar a transação, executar a sua unidade de trabalho e finalizar a transação. Em opção ele pode ainda controlar concorrencia ( não pode executar duas unidades de trabalho da mesma classe ao mesmo tempo). Exemplo
Os dois ultimos mecanismo são especialmente utilizados onde ha mais coisas a fazer que simplesmente gravar no banco. Nesses casos utiliza-se o primeiro. Mas sempre tendo em atenção que o codigo é chamado dentro de uma transação.
Não sei se respondi a pergunta...
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 21:58:27
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Cuidado com os "certos" e "errados".
Não existe *QUALQUER* problema em um Repositório ser apenas uma interface se ele não possuir lógica. Uma interface é um contrato, implementar uma interface diz que o objeto implementa o contrato. Interfaces não são hierarquias.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/04/2008 23:29:15
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Tirou palavras da minha boca. (essa thread pode ficar ferrenha)
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/04/2008 13:56:46
|
danielbussade
JavaEvangelist
Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline
|
Olá galera, cada vez que leio um tópico sobre DDD fico mais confuso, uns falam que pode ser uma interface caso não tem lógica de negócios nenhguma, o que concordo totalmente, mas dizem também que no máximo pode ser uma classe abstrata, mas nunca uma concreta. Mas de acordo com a definição do sergiotaborda Repository, seria uma classe concreta, então no Padrão Repository criado por MartinFowler o Repository seria o que afinal??
Att
This message was edited 1 time. Last update was at 25/04/2008 13:58:27
|
When you steal from one author, is called plagiarism, when you steal from many is called research.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/04/2008 14:25:26
|
dreampeppers99
Virtual Machine Man
![[Avatar]](/images/avatar/6fb993285d56e6927284ff9b11ac6851.jpg)
Membro desde: 29/08/2006 21:50:17
Mensagens: 523
Offline
|
Lezinho wrote:... Particularmente eu prefiro compor um Repositório com um DAO, do que implementa-lo com um...
Gostei desse modo, assim ainda tira a "preocupação" de como instânciar o repositório...
|
- Não respondo dúvida por PM!
- Blog -> Software development - Clojure, Ruby, Java, Test and little pumpkins
- Blog - Desenvolvimento de software - Java |
|
|
 |
|
|