Frage

Ich habe vor kurzem hörte Leute, dass Datentransferobjekte (DTOs) sind ein anti-Muster .

Warum? Was sind die Alternativen?

War es hilfreich?

Lösung

haben Einige Projekte werden alle Daten zweimal . Sobald als Domänenobjekte und einmal als Datentransferobjekte.

Das Duplizierung hat ein enorm Kosten , so dass die Architektur braucht einen großen Nutzen aus dieser Trennung zu bekommen, um zu sein Geld wert.

Andere Tipps

DTOs ist kein anti-Muster. Wenn Sie einige Daten über den Draht sind zu senden (zum Beispiel auf eine Web-Seite in einem Anruf Ajax), wollen Sie sicher sein, dass Sie Bandbreite sparen, indem nur das Senden von Daten, die das Ziel verwenden. Auch ist es oft praktisch für die Präsentationsschicht, die Daten in einem etwas anderen Format als ein nativer Business-Objekt zu haben.

Ich weiß, das ist eine Java-orientierte Frage, aber in .NET-Sprachen anonyme Typen, Serialisierung und LINQ erlaubt DTOs on-the-fly aufgebaut werden, die den Aufbau und die Overhead mit ihnen reduziert.

DTO ein Antipattern in EJB 3.0 sagt:

  

Die hohe Gewicht der Natur von Entity   Beans in EJB-Spezifikationen vor   EJB 3.0, führte zur Verwendung von   Entwurfsmuster wie Datenübertragung   Objects (DTO). DTOs wurde die   leichte Gegenstände (welche sollte   waren die Entity Beans selbst in   die erste Stelle), die für das Senden verwendet,   Daten über die Ränge ... EJB 3.0 jetzt   spec macht das Entity-Bean-Modell gleichen   als Plain Old Java-Objekt (POJO). Mit   Dieses neue POJO Modell, werden Sie nicht   mehr benötigen einen DTO für jeden zu schaffen   Einheit oder für eine Gruppe von Unternehmen ... Wenn   Sie wollen die EJB 3.0 Einheiten senden   über die Ebene machen sie nur   implementieren java.io.Serialiazable

Ich glaube nicht, DTOs ist ein Anti-Muster per se, aber es gibt Antipatterns mit der Verwendung von DTOs verbunden. Bill Dudney bezieht sich auf DTO Explosion als Beispiel:

http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf

Es gibt auch eine Reihe von Verletzungen der DTOs hier erwähnt:

http: // anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/

Sie entstanden, weil die dreistufigen Systeme (in der Regel EJB als Technologie) als Mittel Daten zwischen den Ebenen passieren. Die meisten modernen Java-Systeme auf Basis von Frameworks wie Spring nimmt eine alternative vereinfachte Ansicht POJOs als Domänenobjekte mit (oft mit JPA kommentierte etc ...) in einem einreihigen ... Die Verwendung von DTOs hier ist nicht erforderlich.

OO Puristen würden sagen, dass DTO anti-Muster, da Objekte Datentabelle Darstellungen anstelle von realen Domänenobjekten worden.

Einige betrachten DTOs ein Anti-Muster aufgrund ihrer möglichen Missbrauch. Sie sind oft verwendet, wenn sie nicht sein sollten / nicht sein müssen.

Dieser Artikel beschreibt vage einige Mißbräuche.

Wenn Sie ein verteiltes System Gebäude sind, dann DTOs ist sicherlich nicht ein Anti-Muster. Nicht jeder wird in diesem Sinne entwickeln, aber wenn man ein (zum Beispiel) Open Social App haben alle JavaScript wegzulaufen.

Es wird eine Last von Daten auf Ihren API veröffentlichen. Dies wird dann in irgendeine Form von Objekt deserialisiert, typischerweise ein DTO / Request-Objekt. Dies kann dann validiert werden, um die Daten zu gewährleisten eingegeben korrekt ist, bevor in ein Modellobjekt umgewandelt wird.

Meiner Meinung nach, ist es als ein Anti-Muster gesehen, weil es falsch eingesetzt. Wenn Sie nicht ein verteiltes System aufzubauen, stehen die Chancen, Sie brauchen sie nicht.

DTO wird eine Notwendigkeit und nicht ein Anti-Muster, wenn Sie alle Ihre Domain Last-Objekte zugeordnet sind Objekte mit Spannung.

Wenn Sie nicht DTOs machen, werden Sie unnötige übertragen Objekte aus der Business-Schicht haben, um Ihre Client / Web-Schicht.

Um Aufwand für diesen Fall zu beschränken, sondern DTOs übertragen.

Die Absicht eines Data Transfer Object ist, Daten aus verschiedenen Quellen zu speichern und dann übertragen es in eine Datenbank (oder Remote Facade ) auf einmal.

Doch das DTO Muster verletzt die Einzel Prinzip Verantwortung , da der DTO speichert nicht nur Daten, sondern überträgt sie auch von oder zu der Datenbank / Fassade.

Die Notwendigkeit, Datenobjekte aus Business-Objekten zu trennen ist kein Antipattern, da es wahrscheinlich auf trennt die Datenbankschicht sowieso.

Statt DTOs sollten Sie die Aggregate und Repository-Muster verwenden, die die Sammlung von Objekten trennt ( Aggregate ) und die Datenübertragung ( Repository ).

Um eine Gruppe von Objekten übertragen Sie die Arbeitseinheit Muster verwenden kann, das hält ein Satz von Endlagern und einem Transaktionskontext; um jedes Objekt in dem Aggregate separat innerhalb der Transaktion zu übertragen.

Die Frage sollte nicht sein "Warum", sondern ", wenn ".

Definitiv ist es anti-Muster, wenn nur Ergebnis der Verwendung es ist höher Kosten - Laufzeit- oder Wartung. Ich arbeitete an Projekten hunderte DTOs identisch Datenbank Entitätsklassen haben. Jedes Mal, wenn Sie ein einzelnes Feld hinzufügen wollte Anzeige, die Sie id wie viermal hinzufügen - zu DTO, zu Unternehmen, die Umwandlung von DTO zu Domain-Klassen oder Organisationen, die inverse Umwandlung, ... Sie haben vergessen, einige der Orte und Daten einsehen inkonsistent.

Es ist nicht anti-Muster, wenn Sie wirklich andere Darstellung von Domain-Klassen benötigen - flacher, reicher, schmale, ...

Persönlich beginne ich mit Domain-Klasse und übergeben Sie es mit dem richtigen Scheck an den richtigen Stellen um. Ich kann mit Anmerkungen versehen und / oder einige „Helfer“ Klassen in den Zuordnungen zu machen, Datenbank, zu Serialisierungsformaten wie JSON oder XML ... Ich kann aufgeteilt immer eine Klasse zwei, wenn ich das Bedürfnis verspüren.

Es geht um Ihre Sicht - ich ziehe an einem Domain-Objekt als ein einzelnes Objekt zu spielen verschiedene Rollen zu suchen, statt mehr Objekte voneinander erstellt. Wenn die einzige Rolle Daten ein Objekt transportiert, dann ist es DTO.

Ich denke, die Leute meinen, es könnte ein anti-Muster sein, wenn Sie alle Remote-Objekte als DTOs implementieren. Ein DTO ist lediglich nur eine Reihe von Attributen und wenn Sie große Objekte haben, die Sie immer übertragen alle Attribute, auch wenn Sie sie nicht brauchen oder verwenden. Im letzteren Fall vorziehen, ein Proxy-Muster verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top