DAO e DTO == Bobagem?

Só complementando. No site da sun:
"
Transfer Object Factory Strategy - Transfer Objects and Interfaces:

public interface Contact
extends java.io.Serializable {
public String getFirstName();
public String getLastName();
public String getContactAddress();
public void setFirstName(String firstName);
public void setLastName(String lastName);
public void setContactAddress(String address);
}

public class ContactTO implements Contact {
// member attributes
public String firstName;
public String lastName;
public String contactAddress;

// implement get and set methods per the
// Contact interface here.

}
public interface Customer
extends java.io.Serializable {
public String getCustomerName();
public String getCustomerAddress();
public void setCustomerName(String customerName);
public void setCustomerAddress(String
customerAddress);
}

public class CustomerTO implements Customer {
public String customerName;
public String customerAddress;

// implement get and set methods per the
// Customer interface here.

}

public class CustomerContactTO implements Customer,
Contact {
public String firstName;
public String lastName;
public String contactAddress;
public String customerName;
public String customerAddress;

// implement get and set methods per the
// Customer and Contact interfaces here.

}
"

um DTO é um objeto sem significado no domínio da aplicação, que serve apenas para passar um bandod e dados de um ponto para outro em um ambiente distribuído. É uma gambiarra, bacalhau, etc.

Um JavaBean é um objeto que segue convenções (também gambiarras, IMHO) para acesso de seus atributos.

Nada impede um DTO de ser um JavaBean, mas não é necessário.

O único motivo real apra usar um DTO hoje é suprir a carência numa rede. Se você não produz aplicações distribuídas, se seus objetos estão semrpe no mesmo servidor, usar DTO é uma bela besteira.

[]s

:mad: cada vez mais confuso… o jeito é ser anti-pattern mesmo…

Eu sei… custo de chamadas remotas…
O que eu estava exemplificando é o inverso:nada impede um javabean de ser um dto (normalmente o é).De fato usei mal o termo (dto entre “camadas lógicas”, tsc tsc), é só bean mesmo !

Sobre dto ser gambiarra, concordo em gênero, número e grau, é só pra economia de recursos.

Sobre javabeans, acho até elegante (bom, mas esta realmente é uma opinião pessoal).

Aliás, que solução vocês adotaram para transportar do banco para a view (principalmente naquelas seleções com “200 campos e 50 tabelas” onde não se utilizou framework de persistência) ?

Ahco qeu você quis dizer o contrário… JavaBeans são usado normalmente em muitas cosias diferentes, mas normalment eDTOs são Beans.

O que eu não gosto na especificação é a necessidade de getXX e setXX. O ideal seria eu poder chamar um equivalente a getNome() como nome() apenas, mas eu não imagino como poderia ter as vantagens de um bean sem uma covnençãod e nomenclatura e/ou sem metadata.

[quote=“MHudson”]
Aliás, que solução vocês adotaram para transportar do banco para a view (principalmente naquelas seleções com “200 campos e 50 tabelas” onde não se utilizou framework de persistência) ?[/quote]

Não transporte, transporte seus objetos e faça um lazyloading quando necessário :wink:

[]s

Na verdade era isso mesmo que eu quis dizer, pcalcado (êta efeito tostines). Acho que esta é a grande confusão: se você mapeia cada tabela em uma classe, é um bean, e se os transporta, é dto.

Engraçado, é este encapsulamento que eu gosto. Acho a convenção get e set interessante pois pode-se aplicar alguma lógica a estes métodos quando necessário (atenção, não estou falando de dto).

Sim, com relação ao volume, equaciona-se. Estava falando da quantidade atributos de entidades diferentes sendo agrupados em uma única chamada. No exemplo da Sun, se eu quizer tão somente o nome do cliente (junto com outros 200 atributos de 50 entidades diferentes), como há uma factory, se eu quizer respeitá-la, ou eu passo todos os demais atributos do cliente ou os passo como null.

Calma microfilo, pattern é igual pimenta, sempre arde no início, mas depois que se acostuma a dosar é jóia. :wink:

de qq maneira, vc sempre usara DTOs qndo for fazer um DAO, né?

caso constrário, como vc vai mandar teus dados para camada view??

[quote=“microfilo”]de qq maneira, vc sempre usara DTOs qndo for fazer um DAO, né?
[/quote]

Leia o que eu escrevi, você não deve usar DTOs dentrod e um mesmo nó em uma rede, a menos que esteja fazendo algo muito estranho. Você pode usar objetos de negócio no DAO.

[quote=“microfilo”]
caso constrário, como vc vai mandar teus dados para camada view??[/quote]

O que o DAO tem a ver com a apresentação?

a minha ideia de como fazer as coisas é o seguinte:

o DAO acessa o DB, e retorna o resultado em um DTO (javabean ou list de javabean), aí o controller manda o DTO para a camada view… não é isso??

[quote=“microfilo”]a minha ideia de como fazer as coisas é o seguinte:

o DAO acessa o DB, e retorna o resultado em um DTO (javabean ou list de javabean), aí o controller manda o DTO para a camada view… não é isso??[/quote]

Microfilo, DTO != BO.

Vamos combinar uma coisa, se você não estiver trabalhando em um ambiente distribuído, esqueça o termo DTO e pronto!

Os seus DAOs retornam BOs(um BO é um objeto contendo seus relacionamentos que podem ou não estar carregados) e o seu controler envia o so BO para a view.

View0 > Controler > DAO > BOs > View1.

Supomos que no seu modelo você tenha um objeto pessoa, ele possui seus relacionamentos e praticamente a mesma estrutura da tabela pessoa (exceto pelo fato de utilizar referências de objetos à fks). Você recebe um solicitação de consulta de uma determinada pessoa, e através do seu DAO você recupera um objeto pessoa vindo do banco, pronto agora é só enviá-lo diretamente para a view.

:wink:

:neutral: ta… então é só um emaranhado de nomes O.o…

e se eu to num sistema distribuido?

DTO é um cache???

cada vez mais confuso!!! :tonto:

[quote=“microfilo”]:neutral: ta… então é só um emaranhado de nomes O.o…

e se eu to num sistema distribuido?

DTO é um cache???

cada vez mais confuso!!! :tonto:[/quote]

DTO =! cache

Se você estivesse em um sistema distribuído os DTOs (Data Transfer Objects) seriam utilizados para transportar um conjunto de valores através dos servidores e demais locais da rede.

Esses objetos (burros) seriam úteis para evitar várias chamadas de métodos, por exemplo: um dto poderia levar todos os dados de um cadastro, mesmo que esses dados fizessem partes de entidades diferentes. Então ao receber um DTO o receptor utilizaria o pattern assembler para converter seu DTO em objetos de negócio.

Ex:
Ao passar os dados para o servidor de um cadastro de pessoa, supondo que pessoa e endereço façam parte de entidades diferentes no seu sistema seria muito melhor* passar um único objeto doque vários.

*É claro que esse é um exemplo simples que não teria um impacto significativo na performance, mas parte desse princípio.

:wink:

:viva: :viva: :viva: :viva: :viva: :viva:

finalmente entendi… valeu volnei!

tem algum IM?

MSN: volneigm@hotmail.com

:wink:

Oooo complicação hein?!

era soh ler a documentação, ela diz exatamente isso.
Mas valeu a discussão, alguns aspectos interessantes foram abordados!

Abraços!

O pessoal tá dizendo que usa DAO com seus BOs. Porque isso então? Seus BO não seriam espertos o suficiente para persistir os próprios dados?

Usar um DAO de dentro do seu BO me faz mais sentido.

[quote=“danieldestro”]
Usar um DAO de dentro do seu BO me faz mais sentido.[/quote]

Você vai acoplar seus objetos de negócio á sua camada de persistência. Vai misturar duas camadas.

Seus objetos de negócio são responsáveis pela lógica de negócios, e não por mapeamento objeto-relacional.

Assim:

((VO == TO) != DTO), certo?

O VO (Value object) é o novo nome de TO (Tranfer Object) certo?

Certo

pcalcado,

mas eu falei:

“O VO (Value object) é o novo nome de TO (Tranfer
Object) certo?” e tu respondeste que sim.

Mas olhando:
(http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html),
o Pattern de Transfer Object, ele é o contrário, ou
seja, TO é o novo nome de VO. Mas na Structure ele
trata como VO. Acho que entendi, mas fica difícil pra
quem le a primeira vez…

Rodrigo