2009-07-18 8 views
3

Mit Blick auf DDD, abstrahieren wir die Datenbank in die verschiedenen Modelle, auf denen wir arbeiten, und betrachten es als ein Repository, in dem unsere Modelle leben. Dann fügen wir die Datenebenen und die Service/Business-Schichten darüber hinzu. Meine Frage ist, ob wir durch den Aufbau von Fettmodellen Ineffizienzen bei der Datenübertragung schaffen.Fettdomänenmodelle => Ineffizient?

Zum Beispiel sagen wir haben System, das eine Rechnung für einen Kunden auf dem Bildschirm anzeigt. Denken an es in Bezug auf die OOP, würden wir wahrscheinlich mit einem Objekt am Ende, die ein wenig wie folgt aussieht:

class Invoice { 
    Customer _customer; 
    OrderItems _orderitems; 
    ShippingInfo _shippingInfo; 
} 

class Customer { 
    string name; 
    int customerID; 
    Address customerAddress; 
    AccountingInfo accountingInfo; 
    ShoppingHistory customerHistory; 
} 
    (for the sake of the question/argument, 
    let's say it was determined that the customer class had to 
    implement AccountingInfo and ShoppingHistory) 

Wenn die Rechnung ausschließlich Bedarf an den Kundennamen drucken, warum sollten wir alle tragen anderes Gepäck damit? Bei der Verwendung des Repository-Ansatzes scheinen wir diese komplexen Domänenobjekte zu erstellen, die all diese Ressourcen benötigen (CPU, Speicher, komplexe Query-Joins usw.) UND sie dann über die Röhren an den Client übertragen.

Wenn Sie der Rechnungsklasse einfach eine customerName-Eigenschaft hinzufügen, werden Sie sich von Abstraktionen lösen und es scheint eine schreckliche Praxis zu sein. Auf der dritten Seite scheint die Hälfte des Füllens eines Objekts wie dem Kunden eine sehr schlechte Idee zu sein, da Sie am Ende mehrere Versionen desselben Objekts erstellen könnten (zB eines mit einer Adresse, aber keiner ShoppingHistory und eines mit AccountingInfo, aber nein Adresse, usw., usw.). Was vermisse ich oder verstehe ich nicht?

Antwort

1

Da relationale Mapper eines guten Objekts die Beziehungen faul laden können, würden Sie den Kunden daher für Ihre Rechnung zurückziehen, aber deren Buchhaltungs- und Einkaufsverlauf ignorieren. Sie können Ihre eigenen Rollen verwenden, wenn Sie keinen Ojekt-relationalen Mapper verwenden.

Oft können Sie dies nicht innerhalb Ihres Clients tun, da Sie Ihre Transaktionsgrenze überschritten haben (die Datenbankübertragung wurde beendet) und es liegt an Ihrer Serviceebene, die richtigen Daten zu laden.

Das Testen der richtigen Daten ist (und nicht zu viel davon) in Unit-Tests auf einer Service-Schicht oft sinnvoll.

+0

Guter Punkt. Ich glaube, ich habe das lazy loading>. MunkiPhD

0

Sie sagen "es wurde festgestellt, dass die Kundenklasse AccountingInfo und ShoppingHistory implementieren musste", also ist das Anzeigen einer Rechnung nicht die einzige Aufgabe, die das System ausführt (wie sonst wurde festgestellt, dass Kunden diese anderen Funktionalitäten benötigen) Andernfalls?-).

Sie benötigen also sowieso eine Kundentabelle (für diese anderen Funktionalitäten) - und natürlich muss Ihr Rechnungsdrucker Kundendaten (auch nur den Namen) von dieser einen Tabelle abrufen, die von anderen Funktionen verwendet wird Im System.

Also der "Overhead" ist rein illusorisch - es scheint zu existieren, wenn Sie eine Funktionalität isoliert betrachten, aber nicht existiert, wenn Sie das ganze System als ein integriertes Ganzes betrachten.