Pourquoi sont des objets de transfert de données (Otd) un anti-modèle?
J'ai récemment entendu des gens dire que objets de transfert de données (Otd) sont un anti-modèle.
Pourquoi? Quelles sont les alternatives?
- Peut-être parce que les objets sont eux-mêmes capables de transporter leurs propres données, merci beaucoup!
- "Anti-modèle" est peut-être mon candidat à "une phrase dont 15 minutes ont été jusqu'il y a longtemps." Il est synonyme de "je n'ai pas de soins à la peine de justifier ma pensée", maintenant, comme "Il est bien connu que..."
- Zoidberg, l'envoi d'objets avec des méthodes sur le fil nous a donné CORBA, DCOM, et d'autres expériences que j'ai essayer d'effacer ma mémoire. Le problème est que, tôt ou tard, les gens veulent appeler les méthodes.
- Otd incarnent le principe DRY, qui malheureusement en J2EE stands pour faire répéter vous-même.
Vous devez vous connecter pour publier un commentaire.
Certains projets avoir toutes les données deux fois. Une fois que les objets du domaine, et une fois que les objets de transfert de données.
Ce duplication a un coût énorme, de sorte que l'architecture a besoin d'obtenir un avantage énorme de cette séparation en vaut la peine.
Otd ne sont pas un anti-modèle. Lorsque vous envoyez quelques données sur le réseau (par exemple, pour une page web dans un appel Ajax), vous voulez être sûr que vous économiser de la bande passante que de l'envoi de données que la destination d'usage. Aussi, il est souvent commode pour la couche de présentation pour avoir les données dans un format légèrement différent qu'un natif de l'objet métier.
Je sais que c'est un Java orienté question, mais dans .NET languages types anonymes, la sérialisation, et LINQ permettre Otd à être construit à la volée, ce qui réduit le programme d'installation et les frais généraux de les utiliser.
DTO un AntiPattern dans EJB 3.0 dit:
Je ne pense pas que les Dto sont un anti-modèle en soi, mais il y a antipatterns associés à l'utilisation de l'Otd. Le projet de loi Dudney se réfère à DTO explosion comme un exemple:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
Il y a également un certain nombre de violations de l'Otd mentionné ici:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
Ils sont originaires, en raison de trois systèmes tiers (généralement à l'aide d'EJB que la technologie) comme un moyen pour transmettre les données entre les niveaux. Plus moderne de jour Java des systèmes basés sur des frameworks tels que Spring prendre une variante simplifiée de vue à l'aide de Pojo comme des objets du domaine (souvent annotés avec JPA, etc...) dans un seul niveau... l'utilisation de L'Otd ici est inutile.
OO les puristes dire que DTO est anti-modèle, car les objets deviennent des données de la table des représentations au lieu de véritables objets de domaine.
Certains considèrent Otd un anti-modèle, en raison de leurs possibles abus. Ils sont souvent utilisés quand ils ne devriez pas/vous n'avez pas besoin de l'être.
Cet article vaguement décrit un certain nombre d'abus.
Si vous êtes la construction d'un système distribué, puis les Dto sont certainement pas un anti-modèle. Pas tout le monde va se développer dans ce sens, mais si vous avez un (par exemple) Ouvrir l'application Sociale tout en cours d'exécution hors du JavaScript.
De poster une charge de données de votre API. C'est alors désérialisée dans une certaine forme de l'objet, généralement un DTO/objet de Demande. Cela peut ensuite être validées pour s'assurer que les données entrées sont correctes avant d'être converti en un objet de modèle.
À mon avis, il est vu comme un anti-modèle, car elle est mal utilisée. Si vous n'êtes pas construire un système distribué, les chances sont que vous n'en avez pas besoin.
DTO devient une nécessité et non un ANTI-MODÈLE lorsque vous avez tous vos objets du domaine de charger des objets associés avec Impatience.
Si vous ne faites pas Otd, vous aurez inutiles les objets transférés à partir de votre couche de gestion de votre client/calque web.
Pour limiter les frais généraux pour ce cas, plutôt le transfert des Otd.
De l'intention d'un Objet De Transfert De Données consiste à stocker les données provenant de différentes sources et ensuite le transférer dans une base de données (ou Distance De La Façade) à la fois.
Cependant, la DTO modèle viole les Principe De Responsabilité Unique, depuis la DTO non seulement de stocker les données, mais également les transferts depuis ou à la base de données/façade.
La nécessité de séparer les objets de données de business objects est pas un antipattern, car il est sans doute nécessaire pour séparer la couche de base de données de toute façon.
Au lieu de Dto vous devez utiliser la somme d'un Référentiel et de Modèles, qui sépare la collection d'objets (Agrégation) et le transfert de données (Référentiel).
Pour le transfert d'un groupe d'objets, vous pouvez utiliser le Unité De Travail modèle, qui contient un ensemble de Référentiels et d'un contexte de transaction; pour le transfert de chaque objet dans l'ensemble séparément au sein de la transaction.
La question ne doit pas être "pourquoi", mais "quand".
Définitivement c'est anti-modèle lorsque seulement le résultat de l'utilisation c'est un coût plus élevé - au moment de l'exécution ou de la maintenance. J'ai travaillé sur des projets ayant des centaines de Dto identique à la base de données de classes d'entités. Chaque fois que vous avez voulu ajouter un champ unique d'annonces pour ajouter l'id comme quatre fois à DTO, à l'entité, à la conversion de DTO de classes du domaine ou des entités, la conversion inverse, ... Vous avez oublié quelques-uns des lieux et des données incohérentes.
C'est pas anti-modèle lorsque vous en avez vraiment besoin de différents représentation des classes du domaine - plus plat, plus riche, plus étroite, ...
Personnellement je commence avec le domaine de la classe et de les passer, avec bon de vérifier dans les bons endroits. Je peux annoter et/ou ajouter un peu de "helper" classes pour faire des mappages de base de données, les formats de sérialisation comme JSON ou XML ... je peux toujours diviser une classe à deux si j'en ressent le besoin.
Il s'agit de votre point de vue, je préfère regarder un objet de domaine en tant qu'objet unique de jouer différents rôles, au lieu de plusieurs objets créés les uns des autres. Si le seul rôle d'un objet est le transport de données, alors il est DTO.
Je pense que les gens se dire qu'il pourrait être un anti-pattern si vous mettez en place tous les objets lointains comme les Dto. Un DTO est simplement qu'un ensemble d'attributs et si vous avez de gros objets que vous aimeriez transférer tous les attributs, même si vous n'avez pas besoin ou de les utiliser. Dans ce dernier cas, préférez l'utilisation d'un modèle de Proxy.