| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2007 06:09:14
|
Joaquimnabuco
What is classpath?
Membro desde: 15/09/2007 05:32:14
Mensagens: 8
Offline
|
Bom antes que alguem fale, sim ja pesquisei arduarmente sobre o assunto que irei introduzir, e o mais incrivel: ou existem topicos mto infantis com pessoas que nao sabem nada(desculpe nao estou querendo ser presuncioso) ou acham q sabem ... ou assuntos avançandos que geralmente se disvirtuam.
vamos ao interessa.
por favor o exemplo que irei colocar é infantil porem, na maioria dos casos sempre ta errado. deem uma olhada no forum ou no google e vcs veram.
ipessoa
nome
sobrenome
TemFilhos
...
iEmpresa
razaosocial
TemFilial
Classe Pessoa implenta iPessoa
Nome
TemFilhos
...
iCliente
nome
DescontoDoCliente
ClientePessoa extents Pessoa e implementa iCliente
ClienteEmpresa extents Empresa e implementa iCliente
ja criei ClienteEmpresa e ClientePessoa pois o calculo de seus desconto sao diferentes, e logo adinte teram mais variações. Logo se a unica diferença fosse cpf e cnpj nao teria pq criar duas classes, porem na maioria dos exemplos a razao de ser ter duas classes para clientes é unica e exclusivamente cpf e cnpj q nao faz sentido nehum.
para mim nao me estender mto a questao é a seguinte
Classe OpVenda ... essa classe tem um cliente que ira comprar alguma coisa, para essa classe oq importa é que quem vai comprar seja um cliente. Logo terei OpVenda.DefineCliente(iCliente cliente). e terei um OpVenda.DefineCliente.cliente_ID.
DefineCliente(iCliente cliente)
this.cliente = cliente
cliente_ID = cliente.ID
estarei passando como parametro no preenchimento da venda um ClientePessoa por exmplo.
Agora como faço quanto quero pesistir OpVenda?
como terei
apenas cliente_ID e uma variavel apontando para um interface iCliente
como irei carregar(pesistir) cliente se eu nao sei mais se ele é ClientePessoa ou CLienteEmpresa? e nao posso persistir uma interface
logo achei essa alternativa:
OpVenda.Carrear
iCliente this.cliente = new FactoryCliente.carregaCliente(thies.cliente_ID); //esse metodo retorna uma interface iCliente
//sendo que cliente_id ja esta persistido
FactoryCliente.carregaCliente(int cliente_ID) : iCliente
ClienteEmpresa ce = new ClienteEmpresa
if ce.carregar(cliente_ID) then
return := ce
else
ClientePessoa cp = new ClienteEmpresa
if cp.carregar(cliente_ID) then
return := cp
nao estou usando hibernate pois apenas quero endender se isso faz sentido.
Agradeço desde ja. desculpe pelos erros portugues, e desculpe a má implemntacao da sintaxe em java.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2007 08:37:52
|
raphael_adrien
Thread.start()
![[Avatar]](/images/avatar/34437adb80c38b197974f5105052609a.jpg)
Membro desde: 28/08/2007 14:32:58
Mensagens: 46
Offline
|
Olá, achei seu modelo bastante complicado. Da uma ollhada nele.
So uma sugestão.
Não entendi bem o seu modelo, da uma olhada quando fica meio confuso e que pode ficar melhor.
Bons Códigos.
|
http://www.gojava.org
http://www.dfjug.org.br/DFJUG/jedi/index.jsp
http://raphaeladrien.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2007 08:56:33
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Factory (Fábrica) é um padrão para criação de objetos. As fábricas constroem coisas.
Construir um objeto é fazer "new" dele. A fábrica mais simples é a que simplesmente faz new e retorna.
O que vc quer é um mecanismo que procure um objeto através de uma condição , no caso o valor do ID, e retorne o objeto dentro dessa condição.
Podemos imaginar , abstratamente, que todos os objetos de uma certa classe ficam numa lista na memoria.
Procurar por um deles significaria iterar esta lista e comparar os atributos dos objetos até que a condição de procura fosse satisfeita. O padrão que conrresponde a isto é o padrão Repository.
O ID é uma variável privada do sistema de persistencia. Se não existice banco de dados , vc não precisava dessa ID. ID é portanto uma chave para o sistema de persistencia de forma que o registro seja identificado de forma independente dos valores que ele contém. O que eu estou dizendo com isto é que vc não deve manipular o ID nem passar o ID de forma explicita. Se isso for necessário encapsule o ID num objeto.
A sua interface iCliente não tem um campo ID. Isso é correto. Mas o objeto ClientePessoa tem um ID. Porquê ? Porque ClientePessoa é um objeto persistivel.
Então vc pode fazer assim
Vc pode tirar o i de iCliente , em Java os nomes das interfaces não começam com I.
A longo prazo isso so serve para atrapalhar. Chama Cliente mesmo.
O OPVenda tem como parametro um Cliente. Eu não tendi muito bem o que seira OpVenda.DefineCliente(Cliente c)
parece uma método estático. Se for, tudo bem, mas chame algo mais perto da realidade OpVenda.vendePara(Cliente c)
Concerteza terá mais parametos como o produto e a quantidade ou vc seta isso depois com um addItem(Produto, quantidade)
Então se vc quer vender parao Cliente com id 345 ficaria assim
Repare que não precisa saber de 345 é uma pessoa ou empresa
o método findBy é que tem que descobrir isso e devolver o objeto certo.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/09/2007 09:37:27
|
Kenobi
GUJ Master
![[Avatar]](/images/avatar/cf2226ddd41b1a2d0ae51dab54d32c36.jpg)
Membro desde: 14/11/2003 13:06:37
Mensagens: 1678
Localização: Brasil
Offline
|
sergiotaborda wrote:Factory (Fábrica) é um padrão para criação de objetos. As fábricas constroem coisas.
Construir um objeto é fazer "new" dele. A fábrica mais simples é a que simplesmente faz new e retorna.
O que vc quer é um mecanismo que procure um objeto através de uma condição , no caso o valor do ID, e retorne o objeto dentro dessa condição.
Podemos imaginar , abstratamente, que todos os objetos de uma certa classe ficam numa lista na memoria.
Procurar por um deles significaria iterar esta lista e comparar os atributos dos objetos até que a condição de procura fosse satisfeita. O padrão que conrresponde a isto é o padrão Repository.
O ID é uma variável privada do sistema de persistencia. Se não existice banco de dados , vc não precisava dessa ID. ID é portanto uma chave para o sistema de persistencia de forma que o registro seja identificado de forma independente dos valores que ele contém. O que eu estou dizendo com isto é que vc não deve manipular o ID nem passar o ID de forma explicita. Se isso for necessário encapsule o ID num objeto.
A sua interface iCliente não tem um campo ID. Isso é correto. Mas o objeto ClientePessoa tem um ID. Porquê ? Porque ClientePessoa é um objeto persistivel.
Então vc pode fazer assim
Vc pode tirar o i de iCliente , em Java os nomes das interfaces não começam com I.
A longo prazo isso so serve para atrapalhar. Chama Cliente mesmo.
O OPVenda tem como parametro um Cliente. Eu não tendi muito bem o que seira OpVenda.DefineCliente(Cliente c)
parece uma método estático. Se for, tudo bem, mas chame algo mais perto da realidade OpVenda.vendePara(Cliente c)
Concerteza terá mais parametos como o produto e a quantidade ou vc seta isso depois com um addItem(Produto, quantidade)
Então se vc quer vender parao Cliente com id 345 ficaria assim
Repare que não precisa saber de 345 é uma pessoa ou empresa
o método findBy é que tem que descobrir isso e devolver o objeto certo.
Boa sérgio, mandou bem ... utilizando repository e tudo mais, não tem nem o que acrescentar
|
----------------------------------------------------------
SOA|EXPERT - http://www.soaexpert.com.br
SOA de um jeito simples e eficiente. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/09/2007 01:53:42
|
Joaquimnabuco
What is classpath?
Membro desde: 15/09/2007 05:32:14
Mensagens: 8
Offline
|
Antes d td Obrigado Sergio pelas observações. É interessante citar que sou programar delphi, porem estou migrando algumas aplicações para java, e aproveitando para aplicar um poo descente e com bons beneficios.
bom ... mais um comentario: se vc esta iniciando no mundo poo aproveitem esse otimo forum e as pessoas que participam dele. estou esperando a mais de 3 semanas uma resposta em um forum delphi e outro c#, ou respondem bobagens ou nao respondem nada.
A outra dica: peguem uma aplicaçao que ja esta funcionando e pronta e tentem migrar para uma programação oo. assim fica mais facil de entender os beneficios do poo, pois a regras e fluxos do negocio ja estao em sua cabeça.
bom vamos lá
Sergio vou abusar da sua boa vontade, ou daqueles que queiram contribuir para um assunto bem mascado porem ainda nao digerido por mtos.
quanto sua obs sobre o Persistable, valeu, mas como com certeza absoluta vou sempre usar um bd, vou manter o ID em classes que teram seus obetos persistidos.
class ClientePessoas extendsPessoa implementsCliente
quanto a isso entao esta tranquilo, fica a interface Cliente e a classe Pessoas
para Vendedor
class VendedorPessoas extendsPessoa implementsFuncionario
oq interessa para mim é seu findByID do repository
classClienteRepository {
staticCliente findByID(Object id ){
// código de procura
}
}
esse codigo de procura vai procurar primeiro em uma um obj da classe ClientePessoa se nao achar vai procurar em um obj da classe ClienteEmpresa? exemplo: ClientePessoaRepository.findByID depois ClienteEmpresaRepository.findByID isso dentro do repo do ClienteRepository.findBy
Pergunto isso pq Obj do tipo Cliente(interface) nao podem ser persistidos, e tb nao tenho um mapeamento com meu hibernate(por exemplo) de Cliente.
Cliente conceituamente nao existe, existe somente um ClientePessoa. sendo assim tenho mapeado ClientePessoa e Clienteempresa e esses sim eu posso usar resursos do meu framework de persistencia para buscar um ou outro atraves do ID.
quando eu digo que nao tenho um Cliente, é pq nao posso cadastrar ou conceber um Cliente(interface). eu sempre terei um ClientePessoa ou um ClienteEmpresa. estou dizendo isso pq ja vi implementações que tem a Classe Cliente, depois a classe ClientePF e ClientePJ que herdam de Cliente ("Classico isso"), porem se acredita que isso sao 3 modelos, 3 regras, e nao, pois qual a diferença de Cliente para ClientePF dentro do negocio.
no meu caso aqui quero apenas usar o recurso da interface Cliente para implementar no futuro ClienteEmpresaRevenda.
Se nao fui bem claro desculpa
Valeu gente
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2007 04:51:14
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Desculpe, Joaquimnabuco, mas eu não tinha visto esta resposta.
Passo a comentar.
Joaquimnabuco wrote:
oq interessa para mim é seu findByID do repository
classClienteRepository {
staticCliente findByID(Object id ){
// código de procura
}
}
esse codigo de procura vai procurar primeiro em uma um obj da classe ClientePessoa se nao achar vai procurar em um obj da classe ClienteEmpresa? exemplo: ClientePessoaRepository.findByID depois ClienteEmpresaRepository.findByID isso dentro do repo do ClienteRepository.findBy
Pergunto isso pq Obj do tipo Cliente(interface) nao podem ser persistidos, e tb nao tenho um mapeamento com meu hibernate(por exemplo) de Cliente.
Não. Não é assim que funciona. Embora Cliente não seja algo concreto , existem realmente clientes no seu modelo.O que o seu modelo trata é de clientes , são eles que fazem compras. Não interessa se são pessoas ou empresas. O repositório deve apenas trabalhar com clientes e retornar apenas clientes. Vc escolheu usar uma interface para cliente, mas no seu caso uma classe abstrata seria melhor. Isto porque vc não vai criar uma classe que é simultanemente um Cliente e um não-cliente como ClienteFornecedor. O ponto, é que cliente é uma entidade abstracta do seu modelo. Ela é realmente mais importante que ClientePessoa ou ClienteEmpresa.
Os modelos de banco para isto são vários, mas em todos eles existe algum atributo da entidade abstrata que
identifica que tipo de subclasse está em causa. O caso mais simples é colocar todos os dados do cliente pessoa e do cliente empresa numa mesma tabela. Alguns campos vão ser comuns, como nome, por exemplo. Um campo q tb vai ser comum é o campo identiifcador de subclasse. Imagine-se que 1 é pessoa e 2 é empresa.
Então quando eu pesquisar o banco dentro do repositorio eu farei algo como "select * from Cliente where cliente_id = 357", isto vai retornar todos os campos, entre os quais o campo que indeitifica a subclasse.
Ai eu faço o seguinte:
Cliente conceituamente nao existe, existe somente um ClientePessoa. sendo assim tenho mapeado ClientePessoa e Clienteempresa e esses sim eu posso usar resursos do meu framework de persistencia para buscar um ou outro atraves do ID.
Não. Cliente existe sim. É abstrato, mas existe. (se não existisse não haveria uma interface para o representar)
quando eu digo que nao tenho um Cliente, é pq nao posso cadastrar ou conceber um Cliente(interface). eu sempre terei um ClientePessoa ou um ClienteEmpresa. estou dizendo isso pq ja vi implementações que tem a Classe Cliente, depois a classe ClientePF e ClientePJ que herdam de Cliente ("Classico isso"), porem se acredita que isso sao 3 modelos, 3 regras, e nao, pois qual a diferença de Cliente para ClientePF dentro do negocio.
Não necessariamente. Se Cliente é uma classe abstrata vc nunca vai poder criar objecos que são apenas clientes sem serem pessoas ou empresas, mas poderá trabalhar com todos estes de forma unificada já que todos são clientes.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/10/2007 19:48:10
|
Joaquimnabuco
What is classpath?
Membro desde: 15/09/2007 05:32:14
Mensagens: 8
Offline
|
Po Sergio vc é rápido. Qualquer coisa me manda a conta pela a ajuda. Valeu mesmo.
Bom finalmente acho q vou resolver essas duvidas, pq nem com o prof da faculdade consegui resolver, por increvel que pareça. Bom comentários a parte vamos la:
Acho que talvez minha modelagem não esteja adequada. Será que não seria mais sensato eu fazer assim segundo oq vc comentou:
Interface Cliente
String Nome;
Double MeuDesconto ...
Abstract class AbstractCliente implements Cliente
class ClientePessoa extends AbstractCliente implements Pessoa, Persistable
Sinceramente nunca vi uma modelagem coerente de clientes pessoa e empresas, acho q tem mta confusao por ai, embora pareça simples.
Eu estava usando uma interface Cliente anteriormente pois queria aproveitar a classe Pessoa e classe Empresa via herança(esse é um dos poucos lugares que usa herança pois sei os ricos disso). Como mais adiante teria o papel do vendedor eu tb usaria essa herança de pessoa, so que ao invés de implementar Cliente eu iria implementar Funcionario: class Vendedor extends Pessoa implements Funcionario, Persistable
Isso poupa o tempo de ter q fazer todos membros de pessoa e empresa, como os famigerados cpf e cnpj, que na verdade tem um porem, se a pessoa for americana ela nao vai ter isso, ou se a empresa for alemã tb não vai ter cnpj, mas o pior é ter que fazer a parte de endereço e telefone.
Voltando ao caso de Cliente:
no futuro vou ter ClienteEmpresaRevenda, ClienteFinal e outros mais, por isso achei o uso da interface Cliente mais adequada ao invés de usar uma classe abstrata implementando a propria Interface Cliente. Contudo se em um momento louco eu quiser vender para um cachorro, ou querer ter um cachorro como Cliente poderei class ClienteCachorro extends Cachorro implements Cliente , Persistable. e assim o metodo VenderPara(Cliente cliente) satisfaz a situação medonha.
Bom aqui vejo que seria interessante abrir um tópico somente para essa discussão de Pessoa e Empresa loco que se procurarmos na net veremos que os exemplos sao grotescos, salve o artigo que tem nesse site sobre interface.
Contudo agradeço mais uma vez Sergio e aos demais que postaram aqui.
Abraços
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/10/2007 09:51:31
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Modelar estruturas de negocio não é fácil. No fim vc vai depender de implementar uma certa estrutura que tena na cabeça , testar e remodelar. Esse processo iterativo e ciclico acaba sendo a melhor opção.
Por outro lado, vc precisa definir os objetivos dos seus modelo ou ele será gigante.
Começar por uma interface é muito bom. Eu sempre prefiro isso. Afinal Cliente é um papel que uma pessoa desempenha (é uma "interface" no sentido que ele se apresenta de certa forma). Usar classes Abstratas que implementam os métodos mais comuns da interface tb é uma mao-na-roda.
Se vc está pensando em ter clientes estrangeiros tlv o seu modelo de Pessoa e Empresa tenha que ser bem mais genérico e tlv um campo CNPJ não faz sentido nesses casos. Tlv um campo Pais ajude a destinguir e junto com o descriminador que falei antes ajude a criar vários tipos de clientes como ClienteEmpresaNacional (que tem o campo CNPJ) e ClienteEmpresaEstrageira ( que não tem CNPJ, mas pode ter outro identiifcador) o mesmo para pessoa.
Ou tlv vc queira um campo chamado identificadorFiscal que todos os clientes têm que é um objeto IDFiscal que pode ter implementações diversas: CPF extends IDFiscal ; CNPJ extends IDFiscal ; IDInternacional extends IDFIscal. Com isto vc poupa de criar tantos tipos diferentes de clientes e concentra-se nas diferenças reais dos seus atributos.
Enfim, não é simples, e no fim é uma questão de gosto...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2007 11:23:02
|
YvGa
Virtual Machine Man
Membro desde: 07/03/2007 15:58:16
Mensagens: 518
Offline
|
Esse exemplo do clienteFisica e clienteJuridica da mto pano pra manga mesmo, e ninguem tem a solucao milagrosa pro caso.
O Sergio deu otimas respostas na minha opiniao.
A minha solucao (depois de muita cabecada tbm) foi mais ou menos assim:
se vc tem pessoa fisica e juridica com muitas difierencas elas nao devem implementar a mesma interface soh por se chamarem pessoa(AlgumaCoisa), se elas sao parecidas eu usei o pattern state. O cliente possui uma referencia ao objeto TipoPessoa(ou qqr nome melhor q esse q lhe vier a cabeca - nao achei nenhum ainda) q é responsavel por manter os atributos q diferenciam as pessoas
ex:
public class TipoPessoa{
private String indicadorFiscal;
private bool isValido(){
//verifica se é valido
}
//get,set
}
public class PessoaFisicao extends Tipopessoa{
}
public class Pessoa{
private Endereco endereco;
private TipoPessoa tipo;
}
O q eu fiz eh um pouco mais complexo, com classes CPF e CNPJ, extendendo Identificador e sendo usada como membros de TipoPessoa.
Acho q ainda esta longe de ser a solucao ideal, mas eh a melhor q eu tenho ateh agora.
|
Paulo Borio |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2007 16:48:16
|
fabim
GUJ Master
![[Avatar]](/images/avatar/d4e3e8180a65648886ff348c7a6bbff5.jpg)
Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline
|
Sérgio,
No seu exemplo acima, nao estou vendo muita diferença entre seu Repository e um DAO.
Se eu falei besteira, poderia me explicar a diferença?
|
ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται
Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2007 18:41:28
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
fabiocsi wrote:Sérgio,
No seu exemplo acima, nao estou vendo muita diferença entre seu Repository e um DAO.
Se eu falei besteira, poderia me explicar a diferença?
Repository: Mediador entre a camada de dominio e a camada de mapeamento usando uma interface semelhante à de uma coleção* para acessar objetos do dominio. http://martinfowler.com/eaaCatalog/repository.html
DAO: Data Access Object :
# Generalizar a interface de acesso a dados para diferentes mecanismos de acesso a esses dados.
# Adapta a API de acesso aos dados persistidos para uma API de acesso a dados (independente de onde estão esses dados) **
http://java.sun.com/blueprints/patterns/DAO.html
* Uma interface semelhante a uma coleção quer dizer que existem métodos que adicionam o objeto ao repositorio ( add ) , substituem o objecto por uma "copia" mais atualizada (set) , removem o objeto (remove)
e iteram sobre uma lista de objetos do mesmo tipo (iterate)
** Adaptar interface pode significar adaptar para uma interface do tipo de listagem, mas normalmente não.
A diferença essencial é que um Repository devolve objetos de Dominio e não apenas aglomerados de dados, enquanto um DAO apenas retorna aglomerados dados e não objetos de Dominio.
O fato do repositório usar jdbc diretamente não o torna um DAO. O Objetivo do DAO é isolar/separa a API de persistência de forma que os mesmos dados possam ser persistido de formas diferentes. O objectivo do Repositorio é simular uma coleção de objetos de dominio, se ele o faz usando um Banco de Dados é um detalhe da implementação e não uma definição do que é um Repositorio.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/10/2007 13:08:58
|
fabim
GUJ Master
![[Avatar]](/images/avatar/d4e3e8180a65648886ff348c7a6bbff5.jpg)
Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline
|
Ummm... DAO não retorna objetos de dominio?
Entao isso quer dizer tambem que o método incluir() de um DAO tb nao recebe objetos de dominio?
Teria como vc me mostrar 1 exemplo concreto? queria muito entender isso
|
ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται
Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/10/2007 13:54:53
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
fabiocsi wrote:Ummm... DAO não retorna objetos de dominio?
Entao isso quer dizer tambem que o método incluir() de um DAO tb nao recebe objetos de dominio?
Teria como vc me mostrar 1 exemplo concreto? queria muito entender isso
Imagine que tenho um dominio onde existem clientes e pedidos dos clientes. Imagine que quero fazer um report que relacionas os dois. O repositorio permite-me acesso à lista de Cliente e à lista de Pedido. O Pedido tem um cliente associado e um cliente têm vários pedidos associados. Eu navego nesta estrutura diretamente nos objetos de domínio e o Repositório serve apenas para encontrar o objeot "raiz" da minha navegação.
Mas ao criar um report tem um monte de joins que quero fazer e um monte de campos das entidades que não me interessam. Então crio uma frase SQL que me retorne os campos para o report. Como eu não quero usar SQL diretamente e pretendo isolar o acesso a esses dados , uso um DAO. O meu dao , que obtenho de uma fabrica, é configurado externamente para ler/escrever do banco certo no dialecto sql certo. O DAO abstraem para mim os detalhes do acesso as dados, eu apenas passo um critério de procura e ele me retorna os dados. Mas ele retorna os dados em bruto e não disfarçados de objeto de dominio.
Para criar o report eu não quero ter que criar objetos Cliente nem Pedido, apenas quero um conjunto de dados de cada um. Poderia criar um objeto ResultadoDoReportClientePedido com os dados que quero e preencher esse objeto da mesma forma que preencho Cliente ou Pedido, mas ResultadoDoReportClientePedido não seria um objeto de dominio porque não tem nenhum metodo de negocio associado. É apenas um conjunto de dados.
O DAO poderia ser esperto o suficiente para retornar um objeto como este já preenchido, mas um DAO nunca será esperto para distinguir os objetos de dominio.
Entenda que a distinção entre DAO e Repositorio é muito teorica, mas existem diferenças práticas. Estamos falando de padrões e dando exemplos de objetos que implementam um padrão de cada vez. Poderiamos ter um objeto que faz as duas coisas, sendo responsável pela logica de negocio e pelo acesso aos dados. Tudo bem. Não ha problema nisso.
Mas para se possa dizer que esse objeto segue o padrão X ou Y ele tem que ter certas características. Um objecto que contém logica de negocio e acesso a dados junto , nunca será um DAO , porque o objetivo do dao
é poder ter várias implementações que acesso os mesmos dados em locais/estilosl/inguagens diferentes.
Inerante a isto está o uso de um fábrica de DAO e o não uso explicito de nenhuma das implementações possíveis. Logo, por construção e definição se o seu codigo não permite esta estrutura , isso não é DAO.
Mas um objeto que contém logica de negocio e acesso a dados junto pode muito bem ser um Repositorio.
O que precisa ser entendido é que um Repositório pode e deve conter logica de negocio. Um DAO não pode conter lógica de negocio.
Se vc entrar em http://martinfowler.com/eaaCatalog/repository.html verá um uml explicando o Repositorio. Verá que existe uma estratégia de acesso aos dados que o repositorio usa (Strategy Pattern)
Isso singifica que a estratégia pode mudar, mas as ordens e o resultado não podem mudar. Estrategias diferentes correspondem com DAOs diferentes e por isso que Repositorio e DAO não são a mesma coisa.
DAO é um padrão que permite alterar a estratégia de acesso a dados que o Repositorio usa.
Não sei como ser mais claro.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/10/2007 14:19:02
|
fabim
GUJ Master
![[Avatar]](/images/avatar/d4e3e8180a65648886ff348c7a6bbff5.jpg)
Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline
|
Foi bem claro.
Só mais uma pergunta sérgio:
Baseado no que vc me explicou, o código acima nunca poderia ser método de um DAO.
A) Poderia ser método de um Repository?
B) Ou nao pode ser porcaria nenhuma e eu nem deveria fazer isso?
Se a resposta for B, explique com código se possivel como eu poderia fazer certo.
This message was edited 1 time. Last update was at 08/10/2007 14:23:16
|
ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται
Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/10/2007 15:53:25
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
fabiocsi wrote:
Baseado no que vc me explicou, o código acima nunca poderia ser método de um DAO.
A) Poderia ser método de um Repository?
B) Ou nao pode ser porcaria nenhuma e eu nem deveria fazer isso?
Isso não é concerteza um DAO porque não abstrai a interface de acesso aos dados ( ou seja, vc explicitamente usa JDBC). Isso sim pode ser um Repositório. O problema é que :
a)Se vc considera um repositorio, então é um repositório mal implementado porque a sua interface está dependente do método de persistência ( vc passa uma frase SQL)
b)Se vc não considera um repositorio porque está dependente do SQL, então isso não é nem um Repositório nem um DAO.
Você pode :
a) Usar esse objeto sem problema, não pode é dizer que isso é um Design Pattern , nem DAO, nem Repositorio. Mas é válido usar isso. Eu disse válido, não disse bom , nem recomendável.
b) Vc pode retirar StringBuffer e usar uma classe especial de critério. Tipo assim :
Essa classe é um grafo com sub-criterios. Vc pode fazer isso com o padrão Composite. Básicamente vc precisa dos critérios logico e de comparação de valores de campo. Internamente ao método vc traduz isso em num Buffer de sql e continua igual depois disso. (ao fazer isto vc estará usando outro padrão : Intrepreter)
Esta opção é melhor que (a) pois já permite dizer que esse objeto é um Repositorio pois trata os objetos Gerente como se eles estivessem numa coleção.
c) O objeto de critério é muito legal, mas pode haver critérios demasiado complicados para escrever em forma de grafo. Ai vc inclui um método no repositorio que é especifico, ou seja, ele recebe parametros da query e não a query em si. Esta opção é a melhor, vc monta o SQL internamente e só passa os parametros necessários.
Claro que assim vc precisa de um metodo para cada pesquisa. Exemplo:
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
|
|