Quel est l'intérêt d'utiliser DTO (Data Transfer Objects)?

132

Quel est l'intérêt d'utiliser DTO et s'agit-il d'un concept obsolète? J'utilise des POJO dans la couche de vue pour transférer et conserver des données. Ces POJO peuvent-ils être considérés comme une alternative aux DTO?

Vinoth Kumar CM
la source
10
Mais POJO peut être DTO et DTO peut être implémenté avec POJO. Vous comparez des pommes et des oranges.
Euphoric
3
Pourquoi les bonnes idées doivent-elles devenir obsolètes? Regarde Lisp. Outre les blagues, je suis d’accord avec Euphoric: j’implémente normalement les DTO avec des POJO. Je trouve toujours que les DTO sont très simples (KISS) et concept utile.
Giorgio
Cela ne sert à rien, c'est un anti-motif, voir: L'objet de transfert de données est une honte
yegor256

Réponses:

115

DTO est un modèle indépendant de la mise en oeuvre (POJO / POCO). Selon DTO, comme chaque appel vers une interface distante est coûteux, la réponse à chaque appel devrait apporter le plus de données possible. Ainsi, si plusieurs demandes sont nécessaires pour apporter des données pour une tâche particulière, les données à apporter peuvent être combinées dans un DTO afin qu'une seule demande puisse apporter toutes les données requises. Le catalogue des modèles d’architecture d’applications d’entreprise contient plus de détails.

Les DTO sont un concept fondamental, pas obsolète.

leD
la source
9
vous les trouverez peut-être sous des noms différents, car tout le monde semble réinventer la roue de nos jours
linkerro
3
Comme "Objet de valeur".
theD
2
@linkerro: True: Je pense que beaucoup de gens devraient passer plus de temps à lire des choses déjà inventées au lieu de les réinventer elles-mêmes. Les choses réinventées seront toujours moins matures.
Giorgio
10
@Giorgio Il y a encore beaucoup de développeurs avec des idées qui n'auraient jamais dû se concrétiser. Je souhaite que plus de développeurs remettent en question toutes les idées sur lesquelles ils ont lu.
Erik Reppen
59

DTO en tant que concept (objets dont le but est de collecter des données à retourner au client par le serveur) n'est certainement pas obsolète.

Ce qui est quelque peu dépassé est la notion de DTO ne contenant aucune logique, utilisés uniquement pour la transmission de données et "mappés" depuis des objets de domaine avant la transmission au client, puis mappés pour afficher les modèles avant de les transmettre à la couche d'affichage. Dans les applications simples, les objets de domaine peuvent souvent être directement réutilisés en tant que DTO et transmis directement à la couche d'affichage, de sorte qu'il n'existe qu'un seul modèle de données unifié. Pour des applications plus complexes, vous ne souhaitez pas exposer l'intégralité du modèle de domaine au client. Par conséquent, un mappage des modèles de domaine vers des DTO est nécessaire. Avoir un modèle de vue séparé qui duplique les données des DTO n'a presque jamais de sens.

Cependant, la raison pour laquelle cette notion est dépassée plutôt que simplement fausse est que certains frameworks / technologies (principalement les plus anciens) le requièrent, car leurs modèles de domaine et de vision ne sont pas des POJOS mais sont directement liés au framework.

Plus particulièrement, les Entity Beans dans J2EE avant la norme EJB 3 n'étaient pas des objets POJO, mais des objets proxy construits par le serveur d'applications. Il n'était tout simplement pas possible de les envoyer au client. - c'était obligatoire.

Michael Borgwardt
la source
2
En tant que développeur d’UI contraint à jouer un rôle plus généraliste, j’ai définitivement trouvé stupéfiant le phénomène Mapper.Map dans notre base de code. Pourquoi le DTO ne peut-il pas simplement se cartographier?
Erik Reppen
1
@ErikReppen Le principal avantage est le découplage de vos modèles de domaine et de vos DTO. Si votre DTO mappe lui-même, il a besoin d'une référence à vos modèles de domaine.
Alexander Derck le
17

Bien que le DTO ne soit pas un modèle obsolète, il est souvent appliqué inutilement, ce qui peut le faire paraître obsolète.

Le modèle le plus mal utilisé dans la communauté Java Enterprise est le DTO. Le DTO était clairement défini comme une solution à un problème de distribution. DTO devait être un conteneur de données à grain grossier qui transporte efficacement les données entre les processus (niveaux). ~ Adam Bien

Par exemple, supposons que vous ayez un JSF ManagedBean. Une question commune est de savoir si le bean doit contenir directement une référence à une entité JPA ou doit-il conserver une référence à un objet intermédiaire qui est ensuite converti en une entité. J'ai déjà entendu cet objet intermédiaire appelé DTO, mais si vos ManagedBeans et vos entités opèrent au sein de la même machine virtuelle, l'utilisation du modèle DTO présente peu d'avantages.

Examinez les annotations de validation de bean. Vos entités JPA sont probablement annotées avec les validations @NotNull et @Size. Si vous utilisez un DTO, vous voudrez répéter ces validations dans votre DTO afin que les clients utilisant votre interface distante n'aient pas besoin d'envoyer un message pour savoir qu'ils ont échoué à la validation de base. Imaginez tout ce travail supplémentaire de copie des annotations de validation de bean entre votre DTO et votre entité, mais si votre vue et vos entités fonctionnent au sein de la même machine virtuelle, il n’est pas nécessaire de s’acquitter de ce travail supplémentaire: utilisez simplement les entités.

Le lien de IAmTheDude au Catalogue de modèles d’architecture d’applications d’entreprise fournit une explication concise des DTO, et voici d’autres références éclairantes:

DavidS
la source
3
Il existe la phrase suivante: "..., mais si vos ManagedBeans et vos entités opèrent au sein de la même machine virtuelle, l'utilisation du modèle DTO présente peu d'avantages" . Il existe de nombreuses applications de taille moyenne dans les entreprises qui implémentent bêtement le modèle DTO sans aucun avantage. Il ajoute simplement une "couche de copie" inutile. Les personnes qui ont créé ces systèmes n'ont pas compris que le gestionnaire d'entités Java EE 5+ détache les entités à la fin de la transaction et en fait les véritables DTO. Ainsi, pour les applications Web mono-JVM, le type de modèle est obsolète . Cela semble être la relique des développeurs backend J2EE ...
Kawu
Mais qu'est-ce qu'un "JSF ManagedBean" et une "entité JPA"? Si elles ne sont pas obsolètes, vous devriez pouvoir les expliquer en utilisant des termes agnostiques pour les langages et les frameworks.
U Avalos
8

Absolument pas! Récemment, j’ai appris à mieux utiliser les DTO plutôt que votre objet d’entreprise que vous utilisez (éventuellement lié à votre mappeur ORM).

Cependant, utilisez-les seulement quand elles conviennent, et pas seulement pour les utiliser, car elles sont mentionnées dans un bon cahier de modèles.
Un exemple typique qui me vient à l’esprit est celui de l’exposition d’une interface à une tierce partie. Dans ce cas, vous voudriez que les objets échangés soient assez stables, ce que vous pouvez généralement obtenir avec les DTO.

Juri
la source
1

J'ai trouvé que les DTO sont particulièrement utiles pour contenir la logique des réponses API. Avec ce modèle, il est facile de gérer différents types de réponses, allant d'objets à différents formats, de manière testable. En utilisant ce modèle dans mon rôle actuel, nous avons pu commencer à tester les formats de réponse de nos API, ce qui est très utile car notre pile devient de plus en plus isomorphe avec divers clients (http / mobile). Certainement pas démodé.

Zquintana
la source