Frage

Lesen Sie einfach fertig diesen Beitrag von Greg Young, wo er spricht Microsoft Muster mit stummen Datentransferobjekte zu empfehlen. Er deutete an, dass in der Java-Community, die Dinge in die andere Richtung tendieren.

Meine Frage ist, wie viel Logik in Ihren Entitätsobjekten sein sollte? Unsere Philosophie, wo ich (C # shop) arbeiten, ist, dass, wenn Sie es nicht serialisiert werden können, tun Sie es nicht in der Einheit.

War es hilfreich?

Lösung

Matt,

Ich würde sagen, dass Ihr Shop prozeduralen Code schreibt. Ich möchte klarstellen, dass es nichts falsch mit, dass viele große Systeme (einschließlich vieler ich gearbeitet habe) wurden mit prozeduralen Code geschrieben. Es gibt eine Zeit und Platz für sie.

Jetzt prozeduralen Code hat keinen Platz in einem Domänenmodell. Wenn Sie einen weiteres Verfahren Stil zu verwenden, die in Ordnung ist, aber es mit so etwas wie einem Tischmodul verwenden oder ein Active Record. Es ist nicht der Mangel an OO, die ich so destruktiv in der Führung, aber die Verwendung eines Domain-Modells mit prozeduralen Logik zu sein, bin am überlegen.

Dieses bewirkt, dass eine große Menge an Ressourcen den Aufbau der Domänenschicht verbringen (Zeit Aggregate Impedance Mismatch, Denkprozess zu bauen, Isolation, allgegenwärtige Sprache usw.), ohne dass die Leistungen zu erhalten, dass die Domain-Schicht (in der Regel Wartbarkeit) würde sonst zur Verfügung stellen. Mit anderen Worten, während können Sie Ihre funktionalen Anforderungen ganz gut treffen Sie am Ende eine große Menge an Ihrem Budget zu verbringen fast ohne Rückkehr.

Oriented im Gegensatz zu einer „Domain Driven Design“ Sicht

Nun zurück zu kommen, was „ist das Verhalten“ würde Ich mag von einem Objekt auf die Frage konzentrieren. Ein Objekt wird in der Regel einige Zustand einzukapseln und einige Verhaltensweisen im Allgemeinen aus.

schnelle Wiederholung: kapseln Zustand aussetzen Verhalten

Also, welche Verhaltensweisen sollte ein Objekt? Einfach gesagt soll es das Verhalten, die von dem Zustand betrieben wird, eingekapselt wird. In einer idealen Verhalten OO Welt würde der Staat nie nur Verhaltensweisen von dem Objekt ausgesetzt werden. Setzen Sie taktisch in Code, wenn wir sehen, wie Code zu starten:

Customer c = GetCustomerFromRepository();
c.Status = CustomerStatuses.Deleted;
c.LastUpdated = DateTime.Now;
c.UpdatedBy = GetCurrentUser();
CustomerRepository.Save(c);

Wir haben eine SRP Verletzung ... Dieser Code ist Code, der ein Verhalten des Kundenobjekts sein sollte, weil die „Verantwortung“ des Kundenobjekts ist.

Zustand über einen Kunden kapselt und Verhaltensweisen aus.

Als solche können wir sehen, dass wir besser dran mit einem Customer.Delete () -Methode wäre. (Ja, das ist ein schlechtes Beispiel ich weiß ...)

Nun möchten wir auch dazu erhalten, indem mit TDD. Es ist viel einfacher für uns in den Tests mit der Naht zu beschäftigen, die das Verhalten als die Nähte bietet, wo alle den Zustand ausgesetzt ist. Der Grund dafür ist, dass ich nicht brauchen, die Logik in meinen Tests zu duplizieren. Der Client-Code nicht Pflege , wie ein Löscharbeiten ... es kümmert sich nur, dass der Kunde macht das Verhalten. Als solche in unseren Tests statt, dass c.State == CustomerStates.Deleted und c.UpdatedBy == GetCurrentUser geltend zu machen () etc etc wir würden einfach behaupten, dass die Löschmethode auf der Kunden Naht unter Verwendung eines Mock genannt wurde.

Nun zum Titel zurück zu kommen. Die Menge an Logik, die in einem Business-Objekt sein sollen, ist die Menge an Logik, die zum Einkapseln seines Zustandes unter ihrer Verantwortung fällt. Manchmal ist dies viel, manchmal ist es nicht. Es gibt Orte, an denen Sie Dienste nutzen als auch ... ein gutes Beispiel für ein bestimmtes Verhalten der Interaktion zwischen vielen Domänenobjekten wäre wollen zu koordinieren, aber auch hier der Dienst aufrufen werden Verhalten auf die Domain-Objekte .

Ist diese Hilfe die Dinge ein wenig zu klären?

Greg

Andere Tipps

Wenn Sie anrufen sie Ihre „Domain-Modell-Objekte“, dann gehe ich davon aus, dass Sie beziehen zu Fowlers Domain Model Mustern. http://martinfowler.com/eaaCatalog/domainModel.html

diese Annahme gegeben, dann ist die Antwort auf Ihre Frage „alle Business-Logik“, da, dass im Wesentlichen die Definition des Musters ist.

Leider scheint der Begriff „Domain-Modell“ wurde vor kurzem haben verwässert nur ohne Verhalten ein Objektmodell Ihrer Daten bedeuten.

Wenn Sie nicht bereits getan haben, möchte ich Sie ermutigen PoEAA zu lesen und entscheiden, wo Sie, dass Domain-Logik denken in Ihrer Situation gehört. Wenn Sie auf einem Domänenmodell entscheiden, dann würde ich Sie ermutigen, Evan DDD Buch und mehr über die Unterschiede zwischen den Entitäten, Wertobjekte und Dienste zu lesen.

Ich hoffe, das hilft!

In letzter Zeit hat mich liebäugelt worden mit der Idee Domain-Modelle zu erstellen, die Struktur haben und nur die Verhaltensweisen, die (dh Verhaltensweisen, die über mehrere verwendet werden können, begrenzt Kontexte) für dieses Modell universell sind mit Erweiterungsmethoden für das Verhalten spezifisch ein beschränkter Kontext. Dies hält die Domain-Modelle der Nähe eines DTO (für diejenigen, die ähnlich) und schränkt die Verwendung dieser Domain-Modell nur die erlaubten Verhaltensweisen innerhalb eines begrenzten Kontext. So, dass könnte eine Option für eine middle-of-the-Road-Antwort sein. :)

Der wichtigste Punkt ist, wie man definiert Logik. Um einige Beispiele zu nennen:

  1. Ich würde nicht eine Funktion getFullName () in einer Person Entität, kategorisieren, das einige Saiten nur verkettet, als Logik.
  2. Geben Sie eine Auftragsposition Wert Berechnung wahrscheinlicher für seine Logik qualifizieren würde.
  3. einige Buchungstransaktionen
  4. Dies würde ich auf jeden Fall sagen, ist logisch.

Punkt 1 und vielleicht 2 für mich in die Einheit gehen würde. Punkt 3 nicht. So definiere ich Logik wie:

  • jede Operation, die jede Persistenz im Zusammenhang Sache tut (Lesen / Schreiben)
  • Jede Operation, die andere beinhaltet (nicht direkt, beispielsweise Master-Detail) Entität

IMO, eine dieser Operationen gehören nicht in Entitäten.

Nun, warum /, wenn ich nicht auch 1 und 2 Typ Operationen zu einer Einheit Punkt setzen würde? Es ist eine eher seltene Situation, aber ich würde es nicht tun, sobald die in der Einheit gespeicherten Daten muss in irgendeiner Weise interpretiert werden, bevor sie von der Anwendung verwendet werden können (zB wenn in Abhängigkeit von aktuellen Benutzer, den Inhalt des Feldes X eine andere Bedeutung hat), dass das Unternehmen die Daten selbst ergibt eine gewisse Logik bedeutet.

Soweit ich es verstehe, alle Business-Logik auf eine Einheit im Zusammenhang sollte in dieser Einheit gehen. Diese besteht aus einer beliebigen Logik, die das Verhalten oder interne Struktur des Unternehmens auf den Geschäftsregeln des Systems basiert definiert. Dies sollte nicht Präsentationslogik oder persistance Logik (die offensichtliche Ausnahme ist mit dem Active Record-Entwurfsmuster) umfassen soll aber Dinge wie Datenvalidierung, Entitätsbeziehungen, Zustandsmaschinen und andere Dinge enthält, die definieren, wie das Unternehmen verhält sich in Bezug auf die Echt Welt, was es ist zu Modell versuchen.

So wie ich es zu betrachten versuchen, ist zu versuchen und meine Modelle wie resuable wie möglich zu machen. Versuchen Sie immer daran zu denken, wie das Modell verwendet werden würde, wenn es in dem auf ein anderes System portiert werden, wo der Client-Code (oder Code an das Unternehmen zu verwenden) unterschiedlich sein können. Wenn die Funktionalität ist nicht Teil des Unternehmens verhalten sie sich noch in der gleichen Art und Weise nach den gleichen Geschäftsregeln? Wenn die Antwort nein, dann ist das die Funktionalität in der Einheit gehen sollte.

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