Ich arbeite an einer RCP-Anwendung. Ich bin neu in dieser Anwendung.
Spring Beans werden zum Schreiben von Geschäftslogik zum Speichern / Abrufen von Entitäten verwendet.
Aber anstatt Entitäten direkt an den Client zu senden, konvertieren wir in DTOs und füllen den Client. Während des Speicherns konvertieren wir DTO erneut in Entity und speichern.
Was ist der Vorteil dieser Konvertierungen? Kann das jemand erklären?
What's the benefit of these conversions?
Entkopplung des Persistenzdatenmodells von dem den Verbrauchern angebotenen Datenmodell (Repräsentation). Die Vorteile der Entkopplung wurden in SE ausführlich diskutiert. Ziel der DTOs ist es jedoch, in einer einzigen Antwort so viele Informationen zu sammeln, wie Clients für erforderlich halten, um Anrufe auf dem Server zu speichern. Was macht die Kommunikation Client-Server reibungsloser.Antworten:
Wann immer ein Entwickler fragt, was der Sinn ist, dies zu tun, ist das, was er wirklich meint: "Ich sehe keinen Anwendungsfall, in dem dies einen Nutzen bringt." Lassen Sie mich zu diesem Zweck einige Beispiele zeigen.
Alle Beispiele basieren auf diesem einfachen Datenmodell:
Und Sie können davon ausgehen, dass die Anwendung diese Daten auf vielfältige Weise verwendet (Berichte, Formulare, Popups, ...).
Die gesamte Anwendung ist bereits vorhanden. Alles, was ich erwähne, ist eine Änderung der vorhandenen Codebasis. Dies ist wichtig zu beachten.
Beispiel 1 - Ändern der zugrunde liegenden Datenstruktur - Ohne DTO
Die Anforderungen haben sich geändert. Das Alter der Person muss dynamisch aus der Datenbank der Regierung abgerufen werden (basierend auf Vor- und Nachnamen).
Da Sie den
Age
Wert nicht mehr lokal speichern müssen, muss er aus derPerson
Entität entfernt werden. Hierbei ist es wichtig zu erkennen, dass die Entität die Datenbankdaten darstellt und nicht mehr. Wenn es nicht in der Datenbank ist, ist es nicht in der Entität.Wenn Sie das Alter vom Webdienst der Regierung abrufen, wird es in einem anderen Objekt (oder int) gespeichert.
Aber Ihr Frontend zeigt immer noch ein Alter an. Alle Ansichten wurden so eingerichtet, dass sie die
Person.Age
Eigenschaft verwenden, die jetzt nicht mehr vorhanden ist. Es stellt sich ein Problem: Alle Ansichten, die sich auf dieAge
einer Person beziehen, müssen behoben werden .Beispiel 2 - Ändern der zugrunde liegenden Datenstruktur - Mit DTO
Im alten System gibt es auch
PersonDTO
Unternehmen mit den gleichen fünf Eigenschaften:Id, FirstName, LastName, Age, CityId
. Nach dem Abrufen vonPerson
konvertiert die Service-Schicht es in einPersonDTO
und gibt es dann zurück.Aber jetzt haben sich die Anforderungen geändert. Das Alter der Person muss dynamisch aus der Datenbank der Regierung abgerufen werden (basierend auf Vor- und Nachnamen).
Da Sie den
Age
Wert nicht mehr lokal speichern müssen, muss er aus derPerson
Entität entfernt werden. Hierbei ist es wichtig zu erkennen, dass die Entität die Datenbankdaten darstellt und nicht mehr. Wenn es nicht in der Datenbank ist, ist es nicht in der Entität.Da Sie jedoch einen Vermittler haben
PersonDTO
, ist es wichtig zu sehen, dass diese Klasse die Eigenschaft behalten kannAge
. Die Serviceebene ruft das abPerson
, konvertiert es in einPersonDTO
, ruft dann auch das Alter der Person aus dem Webdienst der Regierung ab, speichert diesen Wert inPersonDTO.Age
und übergibt das Objekt.Der wichtige Teil hierbei ist, dass jeder, der die Service-Schicht verwendet, keinen Unterschied zwischen dem alten und dem neuen System sieht . Dies beinhaltet Ihr Frontend. Im alten System hat es ein vollständiges
PersonDTO
Objekt erhalten. Und im neuen System erhält es immer noch ein vollesPersonDTO
Objekt. Die Ansichten müssen nicht aktualisiert werden .Das ist, was wir meinen, wenn wir den Ausdruck Trennung von Bedenken verwenden : Es gibt zwei verschiedene Bedenken (Speichern der Daten in der Datenbank, Präsentieren von Daten für das Frontend) und sie benötigen jeweils einen anderen Datentyp. Auch wenn diese beiden Datentypen momentan dieselben Daten enthalten, kann sich dies in Zukunft ändern.
Im angegebenen Beispiel
Age
besteht ein Unterschied zwischen den beiden Datentypen:Person
(die Datenbankentität) benötigt keinAge
, aberPersonDTO
(der Frontend-Datentyp) benötigt es.Durch das Trennen der Bedenken (= Erstellen separater Datentypen) von Anfang an ist die Codebasis viel widerstandsfähiger gegenüber Änderungen, die am Datenmodell vorgenommen wurden.
Ich könnte Ihnen weitere Beispiele nennen, aber das Prinzip wird immer dasselbe sein.
Zusammenfassen
Person
) teilenName
. Nur weil sie alle eineName
Eigenschaft haben, heißt das nicht, dass wir sie von einer gemeinsam genutztenEntityWithName
Basisklasse erben lassen sollten . Die verschiedenenName
Eigenschaften haben keine sinnvolle Beziehung.Name
umbenanntTitle
oder eine Person erhält einFirstName
undLastName
), müssen Sie mehr Aufwand betreiben, um die Vererbung rückgängig zu machen, die Sie überhaupt nicht benötigt haben .Als Faustregel, um die Trennung von Bedenken zu berücksichtigen, stellen Sie es sich folgendermaßen vor:
Angenommen, jedes Anliegen (die Benutzeroberfläche, die Datenbank, die Logik) wird von einer anderen Person an einem anderen Ort bearbeitet. Sie können nur per E-Mail kommunizieren.
In einer gut getrennten Codebasis muss eine Änderung an einem bestimmten Unternehmen nur von einer Person vorgenommen werden:
Wenn all diese Entwickler wurden unter Verwendung derselben
Person
Einheit, und eine geringfügige Änderung wurde das Unternehmen gemacht, alle müßten in dem Prozess einbezogen werden.Durch die Verwendung separater Datenklassen für jede Ebene tritt dieses Problem jedoch nicht so häufig auf:
PersonDTO
Objekt zurückgeben kann, ist es dem Geschäfts- und Benutzeroberflächenentwickler egal, wie die Daten gespeichert / abgerufen werden.Die Schlüsselphrase hier ist, da es sie nicht betrifft . Die Umsetzung einer guten Trennung der Anliegen zielt darauf ab, die Beeinträchtigung anderer Parteien auf ein Mindestmaß zu beschränken (und daher die Einbeziehung dieser Parteien erforderlich zu machen).
Natürlich können einige wichtige Änderungen nicht verhindern, dass mehr als eine Person einbezogen wird, z. B. wenn der Datenbank eine völlig neue Entität hinzugefügt wird. Unterschätzen Sie jedoch nicht die Anzahl der geringfügigen Änderungen, die Sie während der Lebensdauer einer Anwendung vornehmen müssen. Hauptänderungen sind eine numerische Minderheit.
quelle