Warum werden die data transfer objects (DTOs) ein anti-pattern?
Ich habe mir vor kurzem hörte die Leute sagen, dass Daten-transfer-Objekte (DTOs) sind ein anti-pattern.
Warum? Was sind die alternativen?
InformationsquelleAutor der Frage ntownsend | 2009-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Projekte haben alle Daten doppelt. Einmal als domain-Objekte, und einmal als Daten-transfer-Objekte.
Diese Vervielfältigung hat eine riesige Kostenso dass die Architektur braucht, um ein großer Vorteil von dieser Trennung, die sich lohnt.
InformationsquelleAutor der Antwort KLE
DTOs nicht ein anti-pattern. Wenn Sie das senden einige Daten über den Draht (sagen wir, um eine web-Seite in einem Ajax-call), Sie wollen sicher sein, dass Sie die Bandbreite zu schonen, indem nur Daten senden, die das Ziel verwenden. Auch ist es oft bequemer für die Präsentation zu haben, die Daten in einem etwas anderen format als eine native business-Objekt.
Ich weiß, dies ist eine Java-orientierte Frage, aber in .NET-Sprachen anonyme Typen-Serialisierung, LINQ erlauben DTOs gebaut werden on-the-fly, das reduziert die setup und Aufwand mit Ihnen.
InformationsquelleAutor der Antwort Gabe Moothart
DTO ein AntiPattern in EJB 3.0 sagt:
InformationsquelleAutor der Antwort aem
Ich glaube nicht, DTO ' s sind ein anti-pattern per se, aber es gibt antipatterns im Zusammenhang mit der Nutzung DTO. Bill Dudney bezieht sich auf DTO explosion als Beispiel:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
Gibt es auch eine Reihe von Missbräuchen von DTO ' s hier erwähnt:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
Sie sind entstanden, weil der drei-tier-Systeme (in der Regel mithilfe der EJB-Technologie) als ein Mittel zum übergeben von Daten zwischen tiers. Die meisten modernen Java-Systeme basieren auf frameworks wie Spring nehmen, eine alternative, vereinfachte Darstellung mit POJOs als domain-Objekte (oft versehen mit JPA etc...) in ein einziges tier... Die Verwendung von DTO ' s hier unnötig ist.
InformationsquelleAutor der Antwort Jon
OO-Puristen würden sagen, dass DTO anti-pattern, da Objekte werden Daten Tabelle Darstellungen statt der echten domain-Objekte.
InformationsquelleAutor der Antwort Darin Dimitrov
Einige halten DTOs ein anti-Muster auf Grund Ihrer möglichen Missbrauch. Sie sind oft verwendet, wenn Sie nicht sein sollte/nicht sein müssen.
Dieser Artikel vage beschreibt einige Missstände.
InformationsquelleAutor der Antwort Ben S
Wenn Sie ein verteiltes system verwenden, dann DTO ' s sind sicherlich nicht ein anti-pattern. Nicht jeder wird sich entwickeln, in diesem Sinne, aber wenn du (zum Beispiel) Öffnen Sie die Soziale app, alles läuft aus JavaScript.
Es werde nach einem laden der Daten in Ihrer API. Dies ist dann deserialisiert in irgendeiner form-Objekt, in der Regel ein DTO/Request-Objekt. Dies kann dann validiert werden, um sicherzustellen, dass die Daten richtig eingegeben wurde, bevor Sie umgewandelt in ein model-Objekt.
Meiner Meinung nach, es sieht aus wie ein anti-pattern, weil es falsch verwendet. Wenn Sie nicht bauen ein verteiltes system, die Chancen sind Sie brauchen Sie nicht.
InformationsquelleAutor der Antwort Bealer
DTO wird eine Notwendigkeit und nicht ein ANTI-PATTERN, wenn man alle domain-Objekte geladen werden die zugehörigen Objekte Gespannt.
Wenn Sie nicht machen, DTOs, Sie haben unnötige übertragene Objekte aus deiner business-Schicht, um Ihre client/web-Schicht.
Begrenzen overhead für diesen Fall, sondern übertragen DTOs.
InformationsquelleAutor der Antwort javadev
Die Absicht, eine Data Transfer Object zum speichern von Daten aus verschiedenen Quellen, und übertragen Sie es dann in eine Datenbank (oder Remote-Fassade) auf einmal.
Jedoch das DTO-pattern verstößt gegen die Prinzip Der Einzigen Verantwortungda die DTO speichert nicht nur Daten, sondern auch transfers von oder zu der Datenbank/Fassade.
Müssen separate Daten-Objekte aus business-Objekten ist nicht ein antipattern, da ist es wahrscheinlich erforderlich, um trennen Sie die Datenbank-Schicht sowieso.
Statt DTOs verwenden Sie die Aggregat-und Repository-Muster, trennt die Sammlung von Objekten (Aggregat) und die Datenübertragung (Repository).
Zur übertragung einer Gruppe von Objekten, die Sie verwenden können, die Arbeitseinheit Muster, hält eine Reihe von Repositories und eine Transaktions-Kontext, um jedes Objekt in der Summe separat innerhalb der Transaktion.
InformationsquelleAutor der Antwort MovGP0
Ich denke, die Leute, die meinen, es könnte ein anti-pattern, wenn Sie implementiert alle remote-Objekte als DTO. Ein DTO ist nur ein Satz von Parametern und, wenn Sie haben große Objekte, Sie würden immer übertragen, alle Attribute, auch wenn Sie nicht brauchen oder nicht verwenden. Im letzteren Fall lieber über einen Proxy-pattern.
InformationsquelleAutor der Antwort jdehaan
Die Frage sollte nicht sein "warum", sondern "wenn".
Definitiv ist es anti-pattern, wenn nur das Ergebnis der Verwendung ist es höhere Kosten - Laufzeit-oder Wartung. Ich arbeitete an Projekten mit Hunderten von DTOs identisch mit Datenbank-entity-Klassen. Jedes mal, wenn Sie wollten, fügen Sie ein einzelnes Feld, das Sie ad, id hinzufügen, wie vier Male - DTO, zur Einheit, zur Konvertierung von DTO domain-Klassen oder Entitäten, die umgekehrte Konvertierung, ... haben Sie vergessen, einige der Orte und Daten haben inkonsistent.
Es ist kein anti-pattern, wenn Sie Sie wirklich brauchen unterschiedliche Darstellung von domain-Klassen - mehr Wohnung, mehr reiche, mehr schmal, ...
Persönlich fange ich mit der domain-Klasse auf und übergeben Sie es um, mit der richtigen check-in den richtigen stellen. Ich kann kommentieren und/oder fügen Sie einige "Helfer" - Klassen, Zuordnungen, zur Datenbank, zur Serialisierung Formate wie JSON oder XML ... ich kann immer aufteilen einer Klasse auf zwei, wenn ich das Bedürfnis verspüren.
Geht es um deine Sicht - ich bevorzuge zu schauen, ein domain-Objekt als ein einziges Objekt spielen verschiedene Rollen, anstatt mehrere Objekte erstellt, die von jedem anderen. Wenn die einzige Rolle, die ein Objekt hat, ist der Transport von Daten ist, dann ist es DTO.
InformationsquelleAutor der Antwort Rostislav Matl