Qual é o sentido de usar o DTO (Data Transfer Objects)?

132

Qual é o sentido de usar o DTO e é um conceito desatualizado? Eu uso POJOs na camada de exibição para transferir e manter dados. Esses POJOs podem ser considerados uma alternativa aos DTOs?

Vinoth Kumar CM
fonte
10
Mas o POJO pode ser DTO e o DTO pode ser implementado com o POJO. Você está comparando maçãs e laranjas.
Euphoric
3
Por que boas idéias devem estar desatualizadas? Olhe para Lisp. Além das piadas, concordo com o Euphoric: normalmente implanto DTOs usando POJOs. Ainda acho que os DTOs são muito simples (KISS) e conceito útil.
Giorgio
Não há nenhum ponto, é um anti-padrão, consulte: Transferência de Dados Objeto é uma vergonha
yegor256

Respostas:

115

O DTO é um padrão e é independente da implementação (POJO / POCO). O DTO diz que, como cada chamada para qualquer interface remota é cara, a resposta a cada chamada deve trazer o máximo de dados possível. Portanto, se várias solicitações forem necessárias para trazer dados para uma tarefa específica, os dados a serem trazidos poderão ser combinados em um DTO para que apenas uma solicitação possa trazer todos os dados necessários. O catálogo de padrões da arquitetura de aplicativos corporativos tem mais detalhes.

DTOs são um conceito fundamental, não desatualizado.

theD
fonte
9
você pode encontrá-los sob nomes diferentes, porém, já que todo mundo parece estar reinventando a roda nos dias de hoje
linkerro
3
Como "Objeto de valor".
theD 26/10/12
2
@linkerro: Verdade: acho que muitas pessoas deveriam gastar mais tempo lendo coisas que já foram inventadas, em vez de reinventá-las. Coisas reinventadas sempre serão menos maduras.
Giorgio1
10
@Giorgio Há muitos desenvolvedores por aí ainda correndo com idéias que nunca deveriam ter saído do papel. Eu gostaria que mais desenvolvedores questionassem todas as ideias sobre as quais leram.
Erik Reppen
59

DTO como um conceito (objetos cujo objetivo é coletar dados a serem retornados ao cliente pelo servidor) certamente não está desatualizado.

O que está um pouco desatualizado é a noção de ter DTOs que não contêm lógica alguma, são usados apenas para transmitir dados e "mapeados" de objetos de domínio antes da transmissão ao cliente e mapeados para exibir modelos antes de passá-los para a camada de exibição. Em aplicativos simples, os objetos de domínio geralmente podem ser reutilizados diretamente como DTOs e transmitidos diretamente para a camada de exibição, para que haja apenas um modelo de dados unificado. Para aplicativos mais complexos, você não deseja expor o modelo de domínio inteiro ao cliente, portanto, é necessário um mapeamento de modelos de domínio para DTOs. Ter um modelo de visualização separado que duplique os dados dos DTOs quase nunca faz sentido.

No entanto, a razão pela qual essa noção está desatualizada, e não simplesmente errada, é que algumas estruturas / tecnologias (principalmente mais antigas) exigem, pois seus modelos de domínio e exibição não são POJOS e, em vez disso, estão diretamente ligados à estrutura.

Mais notavelmente, os Entity Beans no J2EE anteriores ao padrão EJB 3 não eram POJOs e, em vez disso, eram objetos de proxy construídos pelo servidor de aplicativos - simplesmente não era possível enviá-los ao cliente, portanto, você não tinha escolha sobre ter uma camada DTO separada - era obrigatório.

Michael Borgwardt
fonte
2
Como um desenvolvedor de interface do usuário forçado a assumir um papel mais generalista, definitivamente encontrei o fenômeno Mapper.Map em nossa base de código estupefata. Por que o DTO não pode apenas se mapear?
Erik Reppen
11
@ErikReppen O principal benefício é dissociar seus modelos de domínio e DTOs. Se o seu DTO mapeia a si próprio, ele precisa de uma referência aos seus modelos de domínio.
Alexander Derck
17

Embora o DTO não seja um padrão desatualizado, ele é frequentemente aplicado desnecessariamente, o que pode fazer com que pareça desatualizado.

O padrão mais mal utilizado na comunidade Java Enterprise é o DTO. O DTO foi claramente definido como uma solução para um problema de distribuição. O DTO era para ser um contêiner de dados de granulação grossa que transporta dados de forma eficiente entre processos (camadas). ~ Adam Bien

Por exemplo, digamos que você tenha um JSF ManagedBean. Uma pergunta comum é se o bean deve conter uma referência a uma Entidade JPA diretamente ou deve manter uma referência a algum objeto intermediário que é posteriormente convertido em uma Entidade. Eu ouvi esse objeto intermediário chamado DTO, mas se seus ManagedBeans e Entidades estiverem operando na mesma JVM, haverá pouco benefício em usar o padrão DTO.

Considere anotações de Validação de Bean. Suas entidades JPA provavelmente estão anotadas nas validações @NotNull e @Size. Se você estiver usando um DTO, convém repetir essas validações no DTO para que os clientes que usam sua interface remota não precisem enviar uma mensagem para descobrir que falharam na validação básica. Imagine todo esse trabalho extra de copiar anotações de Validação de Bean entre seu DTO e Entidade, mas se seu View e Entidades estiverem operando na mesma JVM, não será necessário executar esse trabalho extra: basta usar as Entidades.

O link do IAmTheDude para o Catálogo de padrões de arquitetura de aplicativos corporativos fornece uma explicação concisa dos DTOs, e aqui estão mais referências que achei esclarecedoras:

DavidS
fonte
3
Há a frase: "..., mas se seus ManagedBeans e Entidades estiverem operando na mesma JVM, haverá pouco benefício em usar o padrão DTO" . Existem muitos aplicativos de tamanho médio nas empresas que implementam estupidamente o padrão DTO sem nenhum benefício. Ele apenas adiciona uma "camada de cópia" inútil. As pessoas que criaram esses sistemas não perceberam que o gerenciador de entidades do Java EE 5+ desanexa as entidades quando a transação termina e as transforma em DTOs reais. Portanto, para aplicativos da web JVM únicos, o padrão está desatualizado . Parece ser relíquia dos desenvolvedores J2EE backend ...
Kawu
Mas o que é um "JSF ManagedBean" e uma "Entidade JPA"? Se não estiverem desatualizados, você poderá explicá-los usando termos agnósticos de estrutura e idioma.
U-Avalos
8

Absolutamente não! Recentemente, aprendi lições sobre como usar melhor os DTOs em vez do objeto de negócios que você usa (possivelmente vinculado ao seu mapeador ORM).

No entanto, use-os quando for apropriado e não apenas para usá-los, porque eles são mencionados em algum bom livro de padrões.
Um exemplo típico que me vem à cabeça é quando você expõe algum tipo de interface a terceiros. Nesse cenário, você gostaria de manter os objetos trocados bastante estáveis, o que geralmente é possível obter com os DTOs.

Juri
fonte
1

Um lugar em que achei os DTOs especialmente úteis é a lógica para as respostas da API. Com esse padrão, é fácil gerenciar diferentes tipos de respostas de objetos para vários formatos de maneira testável. Usando esse padrão na minha função atual, pudemos começar a testar os formatos de resposta para nossas APIs, o que tem sido valioso, pois nossa pilha está se tornando mais isomórfica com vários clientes (http / mobile). Definitivamente não está desatualizado.

zquintana
fonte