Sobre Data Transfer Object - DTO
Autor: Welder | Publicado: 2012-05-05T09:16:00-07:00


Introdução



Um dos assuntos que gera calorosas discussões entre desenvolvedores Java Web é a utilização ou não de DTO's no desenvolvimento Web. Trata-se de um tema bastante polêmico e de grande relevância e devido a isso vou tratar desse tema neste post.

Conceituação

Um DTO (Data Transfer Object = Objeto de Transferência de Dados) é um POJO (Plain Old Java Object) que não tem nada de especial. Trata-se apenas de uma instância de classe com atributos e métodos getters e setters, DTO's são conhecidos também como VO's (Value Objects).

Os DTO's são (?) utilizados na transferência de dados entre as diversas camadas existentes no desenvolvimento da aplicação, principalmente na transferência da interface gráfica para o código ou vice-versa.

Tipos

Eu costumo classificar os DTO's em dois tipos, os DTO's de top-down e de bottom-up que são utilizados para transferência de dados da interface gráfica para o código java e do código java para a interface gráfica, respectivamente.&nbsp;

DTO's e JPA

Com o surgimento da especificação JPA (Java Persistence API), principalmente com a padronização que ocorreu com o lançamento do EJB 3.0 (Enterprise Java Beans) muitos desenvolvedores e inclusive autores da área, consideram que a utilização de DTO's se tornou obsoleta e desnecessária, porém, essa opinião está longe de ser unânime, muito pelo contrário, existe um outro grande número de profissionais que defendem a utilização dos DTO's mesmo com a nova padronização do JPA.

Contra DTO

O principal argumento contra a utilização de DTO's reside que a necessidade de utilização deste tipo de objeto era a inexistência de beans de entidade desacoplados, de modo que qualquer chamada de método em um bean de entidade refletiria em uma sincronização com o banco de dados o que tornava a utilização de entity beans para transferência de dados muito cara.

Porém, com o lançamento do EJB 3.0 os beans de entidade passaram a poder ser não gerenciados em determinados momentos, de modo que uma chamada em um método do entity bean que esteja desacoplado, que tem a mesma estrutura dos DTOs (somente atribudos e métodos getters e setters), não resulta em uma sincronização com o banco de dados. Surge aí então a possibilidade de utilizar os entity beans na função dos DTO's, o que torna a utilização destes desnecessárias por constituir uma camada a mais.

Pró DTO

Por outro lado, os defensores do DTO argumentam que a utilização dos beans de entidade na função de DTO constitui uma grande falha de coesão, lembrando que a coesão determina que as camadas tenham papel específico e bem definido e neste caso a utilização dos beans de entidade como DTO seria uma dupla utilização da camada de entidades o que de fato constitui uma ofensa aos padrões de coesão.
 
Além disso, existe o argumetno que os entity beans por certas vezes possuem muito mais informação do que o necessário em determinados momentos o que ocasiona um consumo de memória e de largura de banda (em aplicações web) desnecessário.

Conclusões

Dadas as definições, a classificação, os argumentos pró e contra, vou dar a minha opinião acerca da utilização ou não de DTOs.
 
Penso que na maioria dos casos os entity beans podem ser utilizados como DTOs de top-down de modo que as informações da interface gráfica já reflitam diretamente no bean que será persistido no banco de dados, porém, mesmo com essa utilização por certas vezes é necessário transportar informações da interface gráfica para o código java que não serão persistidas, nesse caso eu acho que a melhor solução é utilizar DTOs, embora os contra DTO utilizem campos transientes no entity bean para transportar essas informações o que eu acho uma falha de projeto.

Já no caso de bottom-up os DTOs são mais adequados na maioria dos casos, uma vez que quase sempre as consultas só necessitam recuperar algumas das informações existentes no banco de dados e a utilização de entity beans carregaria todos os campos da tabela o que consumiria memória e largura de banda de modo desnecessário. Mais uma vez os contra DTO argumentam que podem ser criados construtores nos entity beans somente com as informações necessárias de modo que no bean estariam carregadas somente as informações necessárias no momento. Peno que esse argumento não é válido pelo fato de que ter um bean carregado com vários campos nulos e somente alguns preenchidos ainda consome memória e largura de banda, além de ser algo muito deselegante.

Fato é que em determinadas situações utilizar os entity beans para a função de DTO's apesar de constituir uma falha de coesão não se trata de uma falha tão grave a ponto de ser evitada, já que gera o benefício de redução de complexidade e de quantidade de código e camadas, porém, querer "aposentar" os DTO's é algo bastante inviável, por isso deve-se buscar um meio termo entre os momentos de se utilizar DTO's e os momentos de evitá-los.

Bom, acho que esse post ficou um pouco longo, mas é sempre complicado tratar de assuntos polêmicos, espero que tenha ficado claro para todos quais são as grandes incógnitas, as vantagens e desvantagens dos DTOs e a minha opinião sobre o assunto. Depois vou tentar postar sobre outros assuntos polêmicos como a utilização de DAO's por exemplo, mas por hoje é só. Obrigado pela visita.