Frage

Ich weiß, das ist wahrscheinlich eine uralte Frage, aber was ist die bessere Praxis? Unter Verwendung eines Domain-Modellobjekt in allen Schichten der Anwendung und sogar Werte direkt an sie auf der JSP-Bindung (ich verwende JSF). Oder konvertiert ein Domain-Modell-Objekt in ein DTO in der DAO oder Service-Schicht und eine leichte DTO an die Präsentationsschicht senden.

Ich habe gesagt, dass es keinen Sinn, Verwendung DTOs macht, weil Änderungen an der Datenbank in Änderungen auf alle Ihre DTOs führen wird, während mit Modellobjekte überall werden nur Änderungen erfordern in das betroffene Modellobjekt. Allerdings scheint die einfache Handhabung und die leichte Art von DTOs dass aufzuwiegen.

Ich sollte anmerken, dass meine App nutzt Hibernate Modell-Objekte und verwendet seine eigene individuell erstellten Modell-Objekte (nicht zu einem beliebigen DB-Sitzung gebunden Bedeutung haben, immer freistehend). Ist eine der beiden oben genannten Szenarien günstiger auf ein striktes Modell Object-Muster? Mit Hibernate war eine große PITA in Bezug auf Dinge wie Verzögerte Initialisierung Ausnahmen.

Ich bin die Bearbeitung diese Frage in der Hoffnung Diskussion Förderung (nicht sicher, ob ich das richtig mache):

Das Problem, das ich mit Modellobjekten ist, dass sie überhaupt nicht flexibel ist. Ein Kommentar sagt unten, dass die Anwendung sollte so ausgelegt sein können, dass die Modellobjekte in allen Schichten verwendet werden. Warum? Wenn ein Benutzer ein Stück lächerlich Funktionalität will, soll ich ihnen sagen, ‚gut, dass wird nicht funktionieren mit Modellobjekten‘?

Schlicht und einfach, es gibt einfach Zeiten, in denen Modellobjekte werden nicht funktionieren. Sie können haben:

public class Teacher {
    List<Student> students;
    [tons of other Teacher-related fields]
}
public class Student {
    double gpa;
   [tons of other Student-related fields]
}

aber vielleicht brauchen Sie nicht alle diese Informationen. Sie müssen nur den Nachnamen des Lehrers, die Zahl der Schüler ist sie in diesem Jahr lehren und durchschnittliche GPA für alle kombinierten Studenten. Was würden Sie in diesem Fall tun? Rufen Sie die vollständigen Lehrer Informationen und Schüler-Beziehungen und dann Code wird eine Zählung auf der Liste der Studenten, berechnet dann einen Gesamtdurchschnitt aller GPAs innen? Das scheint wie waaaay mehr Aufwand als nur einen DTO mit ‚String Nachnamen‘ Erstellen ‚int numStudents‘ und ‚Doppel combinedGpa;

Es klingt wie mein Geist auf diese gemacht worden ist, aber ich habe noch Arbeit in einer Anwendung, in Modellobjekte können vollständig in jedem Fall sauber verwendet werden. Regelmäßige reale Anwendungen mit Out-of-the-gewöhnlichen Benutzern Anforderungen stellen nur auf diese Weise nicht funktionieren.

War es hilfreich?

Lösung

Es hängt wirklich von der Komplexität der Anwendung. Mischdomänenobjekte in die View-Ebene hat zwei mögliche Konsequenzen:

  1. Sie werden versucht sein, Ihr Domain-Objekt ändern Dinge, die Sie in der View-Ebene müssen aufzunehmen
  2. wird Ihre View-Schicht zusätzliche Komplexität durch einen Konflikt verursacht enthalten zwischen dem, was Ihre Domain-Objekte bieten und was Ihrer Meinung nach wirklich braucht. Sie könnten nicht in der Lage sein, diese Komplexität zu umgehen, aber es wahrscheinlich nicht, gehört in der View-Ebene.

Wenn Sie Ihre Domain-Objekte sind einfach und Ihre Ansichten sind nur wenige, die DTOs Skipping vielleicht die einfachste Sache sein.

Auf der anderen Seite, wenn Ihr Domain-Modell ist wahrscheinlich komplex zu entwickeln und werden, und wenn Sie Ihre Ansichten wahrscheinlich sein zahlreich und vielfältig sind, schauen Sie spezifische Objekte aufweisen könnten eine gute Idee sein. In der MVC Welt, mit Viewmodels ist weit verbreitet und macht mir sehr viel Sinn.

Andere Tipps

Eine weitere Stimme für Domain-Objekte. Was die Domain Driven Design das Domänenmodell betrifft, ist der König und sollte, wenn möglich verwendet werden. Die Anwendung soll so gestaltet sein, wo die meisten Schichten (bar Infrastrukturschicht) Domänenobjekte verwenden können.

Ich denke an DTOs als nur sinnvoll, wo die Objekte müssen serialisiert werden. Wenn es keine Übertragung über den Draht oder in einer nicht kompatiblen Architektur ist, würde ich sie nicht benutzen. DTO-Muster ist nützlich für die Serialisierung aus dem Domänenobjekt zu halten. Bedenkt man, dass UI / Domain Interaktion Serialisierung nicht brauchte nicht, halten Sie es einfach und verwenden Sie die eigentlichen Objekte.

Ich denke, DTO aufweist, ist im Allgemeinen nicht ein Anti-Muster. Es gibt eine Menge von Menschen und Systemen mit ihnen und dem Nutzen, den Sie erhalten, ist die entkoppelte View-Schicht, die entworfen werden können und unabhängig von dem Domänenmodell modularisiert. Obwohl ich damit einverstanden, dass Sie Domänenobjekte verwenden sollen, wenn möglich, es Szenarien, wo man Probleme bekommen kann, wenn Sie die View-Schicht auf das Domänenmodell direkt binden.

Ich habe mit Blick Modell gute Erfahrungen gemacht, dass nur umschlingt die Domain-Objekte und die Delegierten der meisten Operationen zu them.This entkoppelt und Domain-Ebene zu sehen, ermöglicht eine flexible Zusammensetzung von Domänenobjekten und ist noch nicht viel Arbeit zu implementieren da IDEs Delegation Muster unterstützen.

Szenarien, wenn Domain-Objekt problematisch sind die gesendet werden:

  1. Sie benötigen aggregiert Informationen oder andere Arten von ‚berechnete Felder‘ kann (in Beispiel Flex / GWT) an die UI-Ebene gesendet und wollen nicht zu verwirren die Domain Object
  2. Sie können für die Serialisierung zyklische Objektgraph (in Ihrem Beispiel, wenn Schülerliste Beziehung hatte) eine Notwendigkeit begegnen, haben einige Protokolle Probleme mit dem
  3. Hibernate LazyInitializationException wenn sie mit dem Rahmen Serializer (BlazeDS für flex / GWT Serializer)
  4. Umgang

Ich bin nicht sicher, dass es eine eindeutige Antwort in diesem cirumcstances

Meiner Meinung nach gibt es kein Problem mit Verwendung von Domain-Modellobjekten in jeder Schicht. Sie sagten, dass Sie nicht alle Informationen benötigen. Wenn Sie in Ihrer JSPs sind, verwenden Sie nur die Daten, die Sie benötigen. Niemand zwingt Sie jede Eigenschaft zu holen. Sie sagte auch, dass Sie die Eigenschaften des Objekts zu erhalten, um GPA bezogene Berechnungen vornehmen müssen, Anzahl der Studenten, etc. Sie haben drei Möglichkeiten: Erstellen synthetische Eigenschaften in Ihrem Domain-Modell-Objekt, das die richtigen Daten für Sie zurückkommen, verpackt schön und ordentlich; machen die Berechnungen in entweder der Steuerung oder Dienstschicht, und setzen sie durch die entsprechenden Getter; oder sie alle in Ihrem JSP behandeln. Sie müssen zum Abrufen / Kompilierung / wrangle die Daten wie auch immer, warum also mehr Komplexität mit einem DTO hinzuzufügen.

Zusätzlich mit jedem DTO, du bist ein zu schaffen.) Eine zusätzliche Klasse, die Sie jetzt halten müssen, und b.) Mindestens 1 zusätzliches Verfahren irgendwo in irgendeiner Klasse, der Konstrukte und füllt die DTO (DAO, Factory-Methode, etc.). Mehr Wartung = unglücklich Entwickler 6 Monate später.

Es gibt also meine Argumente gegen DTOs. Ich sie verwende, aber nur in bestimmten Szenarien, wie wenn ich zu optimieren für die Geschwindigkeit wirklich benötigen und / oder Speicherverbrauch und die Kosten ein vollständiges Domain-Model-Objekt feuchtigkeitsspendend sind viel zu viel. Web-Service ist ein gutes Beispiel dafür, wenn ich es vorziehen zu Verwendung DTOs.

Das Verhalten einer Klasse oder ihre internen Verfahren nicht auf Schichten betroffen nicht mit ihrem Verhalten ausgesetzt werden. Übertragen von Daten, nicht das Verhalten. Verwenden Sie Domain-Objekte innerhalb der Domäne. Das Web ist nicht eine kontrollierte Domäne und UI-Entwickler müssen nicht mit Domain-Verhalten, nur Daten betroffen sein.

hat die Domäne gekapselt wurde, und Modifikation von jemandem geschützt nicht mit der Gesundheit des betreffenden Bereichs.

Verhalten Undichte ist nicht die beste Gewohnheit.

Wenn es ein kleines Projekt, baute es mit dem richtigen Principes als auch. So können wir immer im Auge behalten, warum wir tun, was tun wir, und das nicht nur, wie.

Ich denke, was wir hier in erster Linie beachten sollen, sind die Kosten für neue Ebene einzuführen. Nehmen Sie DTO zum Beispiel - zu tun, dass wir eine Abbildung benötigen. Als jemand sagte, ist Übersetzung Übel und sollte möglichst vermieden werden.

Auf der anderen Seite denke ich, gibt es sehr wenige Dinge, die Sie in der Regel nicht tun sollen. Diejenigen, die sagen alle DTOs sind böse sind falsch - es ist immer abhängig vom Anwendungsfall! Sind sie wirklich gerechtfertigt?

Und schließlich, ich persönlich glaube, die Domain-Objekte in die Ansicht selbst losgelassen werden sollen. Stellen Sie sich vor, was die Wicket Integration ist dann wie. Aber nehmen Sie Spring MVC zum Beispiel - Domäne bleiben würde dann in der Anwendungsschicht wahrscheinlich ...

DTO ist weithin ein Anti-Muster heute betrachtet, und der Rat ist in der Regel „vermeiden sie um jeden Preis“.

Einer der wichtigsten Vorteile eines ORM-Framework wie Hibernate, ist, dass Sie Domain-Objekte auf allen Ebenen verwenden können und nicht wirklich brauchen DTOs. Der Nachteil ist natürlich, ist, dass man irgendwann zu widmen hat auf diese Beziehungen zu DENKEN:., Wenn lazy fetching zu verwenden, wenn eifrig zu verwenden, etc.

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