Frage

Ein Mentor Ich respektiere schlägt vor, dass eine einfache Bohne ist eine Verschwendung von Zeit - das Wertobjekte ‚Muss‘ enthalten einige Business-Logik nützlich zu sein.

, sagt ein anderer solcher Code ist schwierig zu erhalten und dass alle Business-Logik externalisiert werden müssen.

Ich weiß, diese Frage ist subjektiv. Vorstellung sowieso -. Will wissen, Antworten von mehr Perspektiven

War es hilfreich?

Lösung

Sie sollten besser nennen sie Transferobjekte oder Datentransferobjekte (DTO) .

Zu Beginn dieses gleiche j2ee Muster wurde ‚Wertobjekt‘ genannt, aber sie änderten die Namen, weil es mit diesem verwechselt

http://dddcommunity.org/discussion/messageboardarchive/ValueObjects.html

Um Ihre Frage zu beantworten, ich nur eine minimale Logik meiner DTOs setzen würde, eine Logik, die für die Anzeige Gründen erforderlich ist.

Noch besser ist, wenn wir über eine Datenbank-basierte Web-Anwendung sprechen, würde ich über den Kern j2ee Muster gehen und benutzen überwintern oder Java Persistence API ein Domänen-Modell zu erstellen, die ein träges Laden unterstützt von Beziehungen und nutzen diese in der Ansicht.

Sehen Sie die Öffnen Sitzung im Hinblick .

Auf diese Weise müssen Sie nicht einen Satz von DTOs zu programmieren und Sie haben alle die Business-Logik zur Verfügung usw. in Ihren Ansichten / Controller verwenden.

Andere Tipps

Die Idee von Daten und Geschäftslogik zusammenzusetzen ist Verkapselung zu fördern und so wenig inneren Zustand wie möglich auf andere Objekte zu belichten. Auf diese Weise können Kunden auf eine Schnittstelle verlassen und nicht auf eine Implementierung. Siehe "Sagen Sie, Do not Ask" Prinzip und die Gesetz von Demeter . Encapsulation macht es einfacher, die Zustände Daten zu verstehen, in sein können, einfaches Code zu lesen, einfache Klassen zu entkoppeln und in der Regel einfacher zu Unit-Test.

Business-Logik Externalisierende (in der Regel in „Service“ oder „Manager“ Klassen) macht Fragen wie „wo verwendet diese Daten?“ und „Was Zustände kann es in sein?“ viel schwieriger zu beantworten. Es ist auch eine Verfahrensdenkweise, in einem Objekt gewickelt. href="http://www.martinfowler.com/bliki/AnemicDomainModel.html" rel="noreferrer"> anämischen Domänenmodell Dies kann zu einer

Externalisierende Verhalten ist nicht immer schlecht. Zum Beispiel orchestrieren könnte eine Service-Layer-Domain-Objekte, sondern über ihren Zustand manipulierenden Verantwortlichkeiten, ohne dabei. Oder, wenn Sie meistens tun, liest / schreibt auf einen DB, die gut zu Eingabeformulare Karte, vielleicht brauchen Sie keinen Domain-Modell - oder die schmerzliche Object / Relational Mapping Kopf sie mit sich bringt -. Haupt

Transfer Objekte dienen oft architektonische Schichten voneinander zu entkoppeln (oder von einem externen System) durch die minimalen Zustandsinformationen des anrufende Schicht Bedarf, etwa ohne jede Geschäftslogik ausgesetzt wird.

Dies kann nützlich sein, wenn beispielsweise Informationen für die Ansicht der Vorbereitung: Allein schon die Aussicht geben die Informationen, die er braucht, und sonst nichts, so dass sie sich auf das konzentrieren können wie , um die Informationen anzuzeigen, eher als was Informationen angezeigt werden. Zum Beispiel könnte die TO eine Zusammenfassung mehrerer Datenquellen sein.

Ein Vorteil ist, dass Ihre Ansichten und Ihre Domain-Objekte entkoppelt sind. Verwenden Sie Ihre Domain-Objekte in JSPs können Ihre Domain härter Refactoring und fördert den willkürlichen Einsatz von Getter und Setter (daher brechen Kapselung).

machen

Allerdings gibt es auch ein Overhead, der mit viel Transfer Objects mit und oft eine Menge Doppelarbeit auch. Einige Projekte, die ich am Ende bin mit TO herauf, dass spiegeln grundsätzlich andere Domain-Objekte (die ich ein Anti-Muster betrachten).

Es hängt davon ab.

oops, habe ich herausplatzen nur ein Klischee?

Die Grundfrage für die Gestaltung eines Objekts zu fragen ist: wird die Logik das Objekt die Daten regeln sein andere oder das gleiche , wenn verwendet, / von anderen Objekten verbraucht

Wenn unterschiedliche Einsatzbereiche erfordern verschiedene Logik, es externalisieren. Wenn es gleich, egal, wo das Objekt bewegt, legen Sie es zusammen mit der Klasse.

Meine persönliche Präferenz ist es, all Business-Logik in dem Domänenmodell setzen selbst, die in den „wahren“ Domain-Objekten ist. Also, wenn Datenübertragung Objekte erstellt werden, sind sie meist nur eine (unveränderlich) Zustandsdarstellung von Domänenobjekten und somit enthalten keine Geschäftslogik. Sie können Methoden enthalten, die für das Klonen und den Vergleich zwar, aber das Fleisch von dem Business-Logik-Code bleibt in den Domänenobjekten.

Was Korros sagte.

Wert Objekt:. = Ein kleines einfaches Objekt, wie Geld oder einen Datumsbereich, deren Gleichheit auf Identität basiert nicht

DTO:. = Ein Objekt, das Daten zwischen Prozessen, um führt, die Anzahl der Methodenaufrufe zu reduzieren

Dies sind die defintions von Martin Fowler vorgeschlagen, und ich möchte sie popularisieren.

Ich bin mit Panagiotis: die offene Sitzung im Hinblick auf Muster ist viel besser als DTOs verwenden. Anders ausgedrückt: Ich habe festgestellt, dass eine Anwendung ist viel viel einfacher, wenn Sie den Verkehr in Ihren Domain-Objekten (oder ein Verbund davon) aus Ihrer Sicht Schicht des ganzen Weg hinunter.

Das heißt, es ist schwer zu ziehen aus, weil Sie Ihre machen müssen Http gleichzeitig mit Ihrer Persistenz-Schicht der Arbeitseinheit. Dann müssen Sie sicherstellen, dass alle Datenbankänderungen (d erstellen, Aktualisierungen und Löschungen) sind beabsichtigt. Mit anderen Worten, Sie wollen es nicht der Fall sein, dass die View-Schicht ein Domänenobjekt hat, wird ein Feld geändert und die Änderung wird, ohne dass der Anwendungscode beharrt absichtlich die Änderungen zu speichern. Ein weiteres Problem, das mit wichtigen umgehen ist, um sicherzustellen, dass Ihre Transaktionssemantik zufriedenstellend ist. Normalerweise Abrufen und Modifizieren von einem Domain-Objekt in einem Transaktionskontext stattfinden wird, und es ist nicht schwer zu Ihrer ORM-Schicht zu machen erfordert eine neue Transaktion. Was ist eine Herausforderung ist eine verschachtelte Transaktion ist, wo Sie innerhalb der ersten öffnete einen zweiten Transaktionskontext enthalten sein sollen.

Wenn Sie nichts dagegen haben untersucht, wie ein Nicht-Java-API diese Probleme behandelt, es lohnt sich auf Rails' Active Record suchen, die Ruby-Server-Seiten ermöglicht, mit dem Domänenmodell direkt zu arbeiten und ihre Verbände durchqueren.

scroll top