2009-08-24 2 views
5

Nach this definition, Fowler Das Konzept des anämischen Domänenmodell ist:Bedeutet ein anämisches Domänenmodell, dass Sie keine Dienstprogramm-/Supportklassen als "Helfer" für Ihr Domänenmodell verwenden können?

ein Software-Domain-Modell, wo die Business-Logik außerhalb implementiert ist die Domain-Objekte

und

Mit Dieses Muster, Logik ist in der Regel in separaten Klassen implementiert, die transformieren die st aß von der Domäne Objekte. Fowler ruft solche externen Klassentransaktionsskripte auf.

Wenn wir das Beispiel eines Einkaufswagens nehmen, wäre das Einkaufswagenobjekt das Domänenobjekt. Aber um den Einkaufswagen bis zur endgültigen Bestellung und Quittung zu verarbeiten, müssen Sie den Bestellbestand prüfen und die Kreditkartenzahlung abwickeln. Viele dieser Dinge erfordern Utility-Klassen, da alles innerhalb des Cart-Objekts zu tun hätte, dass die Cart-Klasse groß und schwerfällig wäre. Bedeutet das also, dass der Einkaufswagen in diesem Beispiel ein anämisches Domänenmodell wäre und diese Dienstklassen "Transaktionsskripte" gemäß der obigen Definition wären?

Antwort

4

Ein Schlüsselkonzept des domänengesteuerten Designs besteht darin, ein reichhaltiges Design zu erstellen, das den Jargon seiner Domänenexperten (Geschäftsbenutzer) widerspiegelt und widerspiegelt. Dann möchten Sie, dass Ihr Code ein Ausdruck dieses Domänenmodells wird. (Siehe "Ubiquitäre Sprache" und "Modellgetriebenes Design" in der DDD Patterns summaries).

Wenn Sie dies tun, erstellen Sie Namen für Ihre Entitäten (Klassen), die widerspiegeln, wie ein Geschäftsbenutzer sie beschreiben könnte. Außerdem erstellen Sie Methoden für die Klassen, die auch die Domäne widerspiegeln.

In diesem Sinne kann es hilfreich sein zu prüfen, wie Sie über Ihre "Helfer" oder "Dienstprogramm" -Klassen denken. Mit einigen Ihrer Beschreibungen, könnten Sie haben Klassen und Verfahren wie zum Beispiel:

product = GetProduct(data.productId); 
shoppingCart.add(product); 
receipt = customer.Purchase(shoppingCart); 

Ihre Customer.Purchase Methode könnte Dinge wie:

creditCard = this.getCreditCart(creditCardNumber); 
purchaseNumber = creditCard.Charge(shoppingCart.Total); 

Ich weiß, diese Beispiele nicht vollständig sind oder sogar vollständig akkurate , aber ich hoffe, die Idee ist hilfreich.

Als Antwort auf Ihre ursprüngliche Frage - Ja, ist es in Ordnung, Dienstprogramm eine Support-Klassen zu haben. Sie möchten jedoch diese Support-Klassen erstellen und sie echten Domäneneinheiten zuordnen. Nach einiger Arbeit mit Ihren Benutzern werden Sie wahrscheinlich in der Lage sein, aussagekräftige Domain-Entities zu erstellen, die mehr sind als Transaktionsskript-Entities.

Hoffe, das hilft. Viel Glück!

+1

Verzeihen Sie meine Neugier, aber die Frage, wie ich es verstanden habe, war über das _anemic domain model_, die Methoden wie die oben genannten Purchase() in Domain-Klassen vollständig verbietet. Mit dem anämischen Domain-Modell haben die Domain-Klassen nichts mehr als Getter/Setter und Sie würden mit allen (!) Verhalten außerhalb der Domain-Klassen implementiert werden. Also, mit den oben genannten Annahmen, die Annahme der anämischen Domain-Modell wird Sie zwingen, Hilfs-/Utility-Klassen zu verwenden, da Sie keine andere Wahl haben! Warum nicht das Beste aus beiden Welten verwenden: Universelle Algorithmen im Domänenmodell und der Rest außerhalb! Stefan – struppi

+1

@struppi - Warum sagen Sie Methoden wie die oben genannten Purchase() wäre verboten? Diese Methode wäre wahrscheinlich mehr als das Abrufen/Festlegen, da sie Geschäftslogik zum Ausführen des Kaufs enthalten würde. –

1

Wie Chris sagte, es ist in Ordnung, ein Dienstprogramm eine Support-Klassen, wenn diese Support-Klassen zu echten Domain-Entities zugeordnet sind aus der Sprache des Benutzers erkannt. Manchmal sind viele "Hilfsklassen" ein Symptom eines anämischen Modells, wenn sie sich auf Klassen beziehen, die hauptsächlich Setzer & Getter haben (in diesen Szenarien wachsen Helfer aus einem Verhalten, das Domänenobjekten nicht korrekt zugewiesen ist).