| Autor |
Mensagem |
|
|
|
Olá, você pode usar o @CollectionOfElements() para fazer este tipo de mapeamento.
|
 |
|
|
Andre Brito wrote:
danielbussade wrote:Na verdade a funcionalidade é feita antes do Produto ser colocado na sacola, além disso eu nao me acopla a nenhum Portador especifico como voce disse, o que eu faço é recuperar todas as COndicoes com numero de parcelas menor ou igual a configurada no produto entao faco um for nestas condicoes e chamo um metodo da classe CondicaoPagamento chamado :
Onde se tiver juros ela ja aplica e juros e divide pela sua quantidade de parcelas, depois o que faço é agrupar isso para todos os portadores,com excecao dos que sao vendidos somente avista como boleto, e quem me diz isso e a propria classe Portador atraves de um metodo
Opa... Aí o negócio já muda. O método é interessante deixar na CondicaoDePagamento mesmo, porque ela conheça as informações e vai retornar um valor. Achei bem interessante e válido.
Mas depois que você diz isso, qual a sua principal dúvida? Se você deve deixar essa regra de chamar condição em Produto? Eu acho que não teria muito a ver porque Produto não conhece CondicaoDePagamento, e nem o contrário acontece. Um Produto é um produto e não tem nada a ver com o pagamento, é simplesmente um cadastro. Mesma coisa com CondicaoDePagamento.
Acho que desvirtuamos um pouco do tópico... Se fosse pra colocar o Repository dentro da Entity e não fosse pra usar isso que falei acima, colocaria pelo construtor. Se não der, acho que seria interessante você fazer o que o Robson Farias disse. Não tinha pensado daquela forma. Veja que você vai manter o construtor default pro Hibernate não reclamar. Só tem que se lembra sempre de dar o novoProduto().
Achei bem legal isso... Tá de parabéns, Robson :p
|
 |
|
|
Andre Brito wrote:
Opa... Aí o negócio já muda. O método é interessante deixar na CondicaoDePagamento mesmo, porque ela conheça as informações e vai retornar um valor. Achei bem interessante e válido.
Mas depois que você diz isso, qual a sua principal dúvida? Se você deve deixar essa regra de chamar condição em Produto? Eu acho que não teria muito a ver porque Produto não conhece CondicaoDePagamento, e nem o contrário acontece. Um Produto é um produto e não tem nada a ver com o pagamento, é simplesmente um cadastro. Mesma coisa com CondicaoDePagamento.
Então André, a minha dúvida é exatamente essa se isso é ou não responsabilidade do Produto. Ao meu modo de ver não é pois ele fere o SRP www.objectmentor.com/resources/articles/srp.pdf , todavia não sei onde mais colocar essa regra, mas ela é uma junção de responsabilidades, tipo a CondicaoPagamento faz sua parte fornecendo o valor da Parcela, o Produto deve lhe passar o seu preço, e depois tenho que agrupar isso por Portador.
O grande incoveniente é ficar dentro do método do Produto recuperar CondicoesPagamento e Portadores do meu Repositorio,
embora eu tenha enxugado bem os método fazendo Refactor com extract Method ainda ficou com declaracoes horriveis, algo como
Ou seja para cada portador, eu tenho uma lista de mapas de CondicoesPagamento e seu respectivo valor, até pensei em extrair isso para uma Classe, mas além de ser uma classe de nome difícil, ainda teria que ter o mapa, mas para algo reduzido assim:
O que acha da criacao dessa classe? Acha válido? Acha que enriquece o modelo?
Quanto o problema do Repositorio irei colocá-lo no Construtor, resolvi o problema da IoC
com AOP, criando pointcuts e injetando depois do new.
Valeu
Obrigado
|
 |
|
|
Andre Brito wrote:Olhe.
A minha opinião para a sua primeira pergunta: a primeira abordagem. Isso é injetar, não é?
Agora uma pergunta: você vai usar save, delete, update na classe Produto? Digo, produto.save() ou algo do tipo? Se sim, eu desaconselho a usar isso (pode ser chamado de ActiveRecord e funciona perfeitamente com Rails, mas com Java acho que não casa).
A minha opinião para o seu problema: eu colocaria isso de calcular o preço em todas as condições em uma outra classe. Alguma classe que juntasse os dois, Produto e CondicaoDePagamento (pode ser Sacola será?). Porque pense: qual a relação de um com outro? Digo... Usar produto.calcularValorDoProdutoNaFormaDeBoleto(), produto.calcularValorDoProdutoNaFormaDeMasterCard(), ... pode ficar muito pouco flexível. E se surge um cartão, JavaCardMasterSuperMoney? Você tem que alterar em produto e isso pode não ser tão interessante.
O que você poderia fazer é criar uma nova classe que armazena os preços (isso já pode ficar em ItemSacola, que pode ter uma referência pra produto. Aí Sacola calcula os preços de acordo com Condicao e seta em ItemSacola). Então você passa pelo for de todas as CondicoesDePagamento possíveis e vai criando objetos dinamicamente. Você nunca mais vai precisar se preocupar em implementar novos métodos, porque todo o cálculo vai ser baseado nas propriedades de CondicaoDePagamento.
Será que pode ser feito assim? Será que vai ficar acoplado demais? Só pegando outras opiniões e detonando essa arquitetura pra ver qual forma fica mais interessante. De qualquer forma, vamos esperar a opinião dos mais experientes, certo?
}
Na verdade a funcionalidade é feita antes do Produto ser colocado na sacola, além disso eu nao me acopla a nenhum Portador especifico como voce disse, o que eu faço é recuperar todas as COndicoes com numero de parcelas menor ou igual a configurada no produto entao faco um for nestas condicoes e chamo um metodo da classe CondicaoPagamento chamado :
Onde se tiver juros ela ja aplica e juros e divide pela sua quantidade de parcelas, depois o que faço é agrupar isso para todos os portadores,com excecao dos que sao vendidos somente avista como boleto, e quem me diz isso e a propria classe Portador atraves de um metodo
Acesse www.crisroli.com.br, é um de nossos clientes de e-commerce, clique em um produto e veja na parte de baixo a funcionalidade da qual falei.
Valeu
Obs:
|
 |
|
|
fernandojsjr wrote:
Se você colocar formas de pagamento na classe de produto, no caso de existir mais de um produto selecionado, como se iria decidir quais exibir, poderia acontecer casos em que haveriam contradições entre elas, um produto poderia se vendido em 10x outro em 12x.
Espero ter ajudado
Fernando, esta contradicao quem resolveria e a classe Sacola, onde ele faz um for em todos os ItensSacola
e invoca o metodo do Produto chamado getMenorQuantidadeParcela, que não só consulta os produtos
mas tbm os grupos e subgrupos dos mesmos, sempre se decidindo pela menor parcela.
|
 |
|
|
Fernando a funcionalidade é a seguinte:
Em um sistema de e-commerce quando usuário clicar em um Produto
ele deverá ver os valores das parcelas para todas as condicoes de Pagamento
que podem ser feitas para este produto, isso porque no Produto tem um atributo
quantidadeParcelas onde o sistema que este Produto só pode ser vendido em x vezes.
Entao eu preciso do Repositorio de CondicoesPagamento para pegar todas condicoes de
pagamento com parcelas menor ou igual às daquela configurada no Produto,
além disso tenho que agrupar por portador entao tbm preciso do Repositorio deste.
É algo mais ou menos assim, o Produto custa R$200 reais o usuario veria isso>
Boleto
à vista 200
Cartao Master
1 * 200
2* 100
3* 67
4 * 55 //juros de 10 porcento configurada na CondicaoPagamento
etc
Cartao Visa
..
|
 |
|
|
Olá pessoal, supondo que em uma classe de negocio, eu precise ter acesso a um repositorio, como eu deveria fazer isso;
Opcao 1: Declarar a classe como atributo da instancia da classe e recebe-la no construtor
ex:
Opcao2 : Instancia o Repositorio dentro do proprio metodo
Opcao3 : Passo o repositorio para o método como parametro
Desvantagens
Abordagem 1:
Como o Hibernate obriga um contrutor default, pode deixa o objeto
em um estado ilegal onde eu chamei um metodo mas seu Repositorio é nulo.
Abordagem 2:
Dificulta os testes, vistos que nao tem como Mockar, já que a depencia
esta "escondida" dentro do metodo
Abordagem 3:
A assinatura do método fica bem estranha;
Enfim, o que voces tem usado atualmente, além dessas tres que eu citei
alguém conhece uma outra forma melhor?
Obrigado
|
 |
|
|
Na verdade, a questão é realmente simples, o meu erro foi não perceber que o último retorno era das chamadas recursivas e não da primeira chamada, por isso ele não sai do método, o resto é bem simples de entender.
Obrigado a todos.
|
 |
|
|
entanglement wrote:Queria saber se você foi bem nessa prova (o gabarito saiu ontem mesmo). Quantas questões você acertou?
Olá, na verdade eu não fiz a prova. Só dei uma olhada para ver as questões da mesma.
Valeu
|
 |
|
|
|
Obrigado. Mas eu já entendi, eu não tinha entendido que o último return e o return da chamada recursiva e não da primeira chamada.
|
 |
|
|
Olá a todos, alguém poderia me explicar a saída do código abaixo:
Eu achei que seria 126, mas a resposta é 138.
Obrigado
|
 |
|
|
Acredito que a exceção não seja RollBackException e sim DatabaseException por uma violção de chave estrangeira. Tente fazer o seguinte remova todos os try-catchs e deixe apenas um, logo depois use o Apache ExceptionUtils e utilize o metodo rootCause, para mostrar a exceção principal.
Aqui está o javadoc caso queira dar uma olhada http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/exception/ExceptionUtils.html
|
 |
|
|
Olá a todos. A empresa pelo qual trabalho possue um ERP feito em delphi, com banco de dados Firebird, além disso a mesma empresa possui um e-commerce feito em Java acessando um banco de dados MySQL. Preciso fazer a integração de algumas tabelas destes bancos, entre elas Produtos, CondicaoPagamento, Portador, etc..
A príncipio a integração era feita por um programa em Delphi, que acessava as duas bases, um estava local, e outra acessando o IP fixo do servidor, no qual estava o MySQL, mas ficou bastante lento.
Então estamos criando uma espécie de Web Service, onde o Client, o ERP feito em delphi, terá um modulo, onde enviará so WebService, os dados a serem atualizados, aqui começam minhas dúvidas, seria melhor esse client, me enviar um String no formato do XML exemplo:
Ou enviar o próprio arquivo XML, tipo postando em uma pasta no servidor previamente selecionada para isso, ou seja ele postaria o arquivo e invocaria o web service, o WebService leria o arquivo .xml e faria as atualizações.
Minha pergunta é, existe diferença no ponto de vista de velocidade entre enviar uma String "grande" no formato de .xml, ou o proprio xml mesmo, qual seria mais rápido? Ou se tiverem outras sugestões serão bem vindas.
Obrigado
|
 |
|
|
Olá a todos , no livro do Page Jones 'Fundamentals of object-oriented design in UML', logo no capitulo 4 onde ele fala de Classes diagrams,ele define e cita um exemplo de associação que o seguinte:
LibraryPatron and LibraryBook geram a associação Borrowing, neste caso a associção é somente 'conceitual', pois eu nao preciso definir( no contexto do livro) nenhuma operacao em Borrowing. Mas no caso do exemplo temos:
Hospesdes-Quarto -> Reservas
A relação Hospesdes- Quarto gera uma associação Reservas, que neste caso faz sentido transformar a associção em uma classe concreta, visto que esta associação tem responsabilidades proprias.Uma delas seria de encontrar os quartos disponiveis, visto que a disponibilidade do quarto depende da reserva.
Entao essa operacao deveria estar no Repository Reserva, mas concordando com o taborda, o Repository Reserva deve retornar uma lista de reservas, porque isso?
Pensando um pouco, se voce pede a um repositorio que busque informacoes de reserva, porque ele deveria retornar quartos? nao vejo o sentido disso. Ora se quero informacoes do quarto pergunto ao quarto, se quero informacoes de reservas(entenda que reserva aqui e o que diz se um quarto esta disponivel ou nao), peço ao Repository de reservas, uma vez que com a reservas consigo chegar ate o quarto.
Portanto minha opção seria a segunda, com as ressalvas acima.
|
 |
|
|
magnomp wrote:Há algum problema em os objetos de negócio acessarem diretamente os repositórios? Ou isso é normal?
Ex:
Olá o padrão Repository, é um conceito de negocios, ou seja como a sua classe Cliente tbm faz parte do Negocio, não há problema alguma em sua classe Cliente acessar o Repository.
|
 |
|
|
|
|