Die einzige Verantwortung (Grund für eine Änderung) eines Unternehmens sollte darin bestehen, sich eindeutig zu identifizieren, dh seine Verantwortung muss auffindbar sein.
Eric Evans DDD-Buch, pg. 93
Die Hauptaufgabe der Unternehmen besteht darin, Kontinuität herzustellen, damit das Verhalten klar und vorhersehbar ist. Sie tun dies am besten, wenn sie in Reserve gehalten werden. Anstatt sich auf die Attribute oder sogar das Verhalten zu konzentrieren, reduzieren Sie die Definition des Entity-Objekts auf die wesentlichsten Merkmale, insbesondere auf die, die es identifizieren oder üblicherweise zum Finden oder Übereinstimmen verwendet werden. Fügen Sie nur das Verhalten hinzu, das für das Konzept und die Attribute, die für dieses Verhalten erforderlich sind, wesentlich ist.
Darüber hinaus sollten Sie Verhalten und Attribute in anderen Objekten entfernen, die mit der Hauptentität verknüpft sind. Über Identitätsprobleme hinaus erfüllen Entitäten ihre Verantwortlichkeiten in der Regel durch die Koordination der Operationen von Objekten, deren Eigentümer sie sind.
1.
... reduzieren Sie die Definition des ENTITY-Objekts auf die wesentlichsten Merkmale, insbesondere auf diejenigen, die es identifizieren oder üblicherweise zum Finden oder Abgleichen verwendet werden. Füge nur das Verhalten hinzu, das für das Konzept wesentlich ist ...
Sobald einer Entität eine eindeutige ID zugewiesen wurde , wird ihre Identität festgestellt. Daher würde ich davon ausgehen, dass eine solche Entität kein Verhalten benötigt, um ihre Identität beizubehalten oder sich selbst zu identifizieren . Daher verstehe ich nicht, auf welche Art von Verhalten sich der Autor bezieht (abgesehen von find
und match
Operationen ) mit " Verhalten, das für das Konzept wesentlich ist "?
2.
... reduzieren Sie die Definition des ENTITY-Objekts auf die wesentlichsten Merkmale, insbesondere auf diejenigen, die es identifizieren oder üblicherweise zum Finden oder Abgleichen verwendet werden. ... Versuchen Sie darüber hinaus, Verhalten und Attribute in anderen Objekten zu entfernen, die mit dem ENTITY-Kern verknüpft sind.
Jedes Verhalten, das nicht dazu beiträgt, die Entität zu identifizieren, wird dennoch als eigenständiges Merkmal dieser Entität charakterisiert (dh das Bellen ist für Hunde, das Fliegen für Flugzeuge und das Legen von Eiern für Vögel). .), sollte in andere Objekte eingefügt werden, die dieser Entität zugeordnet sind (Beispiel: Wir sollten ein Objekt, das einer Entität mit Hund zugeordnet ist, mit Bellen versehen)?
3.
Versuchen Sie darüber hinaus, Verhalten und Attribute in anderen Objekten zu entfernen, die der ENTITY zugeordnet sind.
a) MyEntity
Delegierten Verantwortung A_resp
und B_resp
auf Objekte a
und b
sind.
Obwohl die meisten von A_resp
und B_resp
Arbeit getan ist a
und b
Fällen werden Kunden noch bedient A_resp
und B_resp
durch MyEntity
, was bedeutet , dass aus der Sicht des Kunden die beiden Aufgaben gehören MyEntity
. So nicht , dass Mittel MyEntity
auch hat A_resp
und B_resp
Verantwortlichkeiten und als solche verletzt SRP ?
b) Auch wenn wir davon ausgehen, dass A_resp
und B_resp
gehören nicht MyEntity
, MyEntity
hat die AB_resp
Koordinierung der Operationen von Objekten a
und b
. Verstößt es also nicht MyEntity
gegen SRP, da es mindestens zwei Verantwortlichkeiten hat - sich selbst und auch eindeutig zu identifizieren AB_resp
?
class MyEntity
{
private A a = ...
private B b = ...
public A GetA()
{ ... }
public B GetB()
{ ... }
/* coordinates operations of objects a and b */
public int AworkB()
{ ... }
}
/* A encapsulates a single responsibility resp_A*/
/* A is value object */
class A
{ ... }
/* B encapsulates a single responsibility resp_B*/
/* B is value object */
class B
{ ... }
AKTUALISIEREN:
1.
Verhalten bezieht sich in diesem Zusammenhang auf semantisches Verhalten. Beispielsweise hat eine Eigenschaft für eine Klasse (dh ein Attribut für ein Domänenobjekt), mit der sie eindeutig identifiziert wird, ein Verhalten. Dies wird zwar nicht direkt im Code dargestellt. Das erwartete Verhalten besteht darin, dass für diese Eigenschaft keine doppelten Werte vorhanden sind.
Im Code müssten wir also so gut wie nie ein Verhalten (dh eine Operation) implementieren, das die Identität der Entität aufrechterhält, da ein solches Verhalten, wie Sie erklärt haben, nur als Konzept in einem Domänenmodell vorhanden ist (in Form eines ID-Attributs von eine Entität), aber wenn wir dieses ID-Attribut in Code übersetzen, geht ein Teil seiner Semantik verloren (dh der Teil, der implizit sicherstellt, dass der ID-Wert eindeutig ist, geht verloren)?
2.
Darüber hinaus hat eine Eigenschaft wie Age keinen Kontext außerhalb einer Personenentität und als solche macht es keinen Sinn, sich in ein anderes Objekt zu bewegen ... Diese Informationen könnten jedoch leicht an einem anderen Ort gespeichert werden, an dem die eindeutige Kennung, also die verwirrender Verweis auf das Verhalten. Alter könnte ein faul geladener Wert sein.
a) Wenn die Age
Eigenschaft faul geladen ist, können wir es ein Verhalten nennen, obwohl semantisch Age
nur ein Attribut ist?
3.
Sie können leicht spezifische Vorgänge für die Adresse ausführen, z. B. die Überprüfung, ob es sich um eine gültige Adresse handelt. Vielleicht wissen Sie das zur Entwurfszeit nicht, aber dieses ganze Konzept besteht darin, Objekte in ihre kleinsten Teile zu zerlegen
Ich stimme zwar zu, dass wir durch einen Umzug den Kontext verlieren würden Age
in ein anderes Objekt den Kontext würden, aber der Kontext würde nicht verloren gehen, wenn wir die DateOfBirth
Eigenschaft in ein anderes Objekt verschieben würden, aber normalerweise verschieben wir sie nicht.
Was ist der Hauptgrund, warum wir Address
in ein anderes Objekt ziehen würden, aber nicht DateOfBirth
? Da DateOfBirth
ist mehr intrinsisch zuPerson
Entität oder weil es weniger Chancen gibt, dass wir irgendwo in der Zukunft Operationen definieren müssen, die spezifisch für die Entität sind DateOfBirth
?
4. Ich muss sagen , ich weiß noch nicht , ob MyEntity
auch hat A_resp
und B_resp
Verantwortlichkeiten und warum MyEntity
auch haben AB_resp
nicht eine Verletzung angesehen wird SRP
EULERFX
1)
Die Verhaltensweisen, auf die sich der Autor bezieht, sind Verhaltensweisen, die der Entität zugeordnet sind. Dies sind die Verhaltensweisen, die den Status der Entität ändern
a) Wenn ich Sie richtig verstehe, sagen Sie, dass eine Entität nur solche Verhaltensweisen enthalten sollte, die ihre Attribute (dh ihre Zustand ) ?
b) Und was ist mit den Verhaltensweisen , die nicht notwendigerweise den ändern Zustand des Unternehmens , sind aber nach wie vor als eine betrachtet intrinsische Eigenschaft dieses Unternehmens (Beispiel: Bellen wären intrinsische Charakteristik einer Dog
Einheit, auch wenn es nicht ändern Hundezustand )? Sollten wir diese Verhaltensweisen in eine Entität einbeziehen oder sollten sie auf andere Objekte verschoben werden?
2)
In Bezug auf das Verschieben von Verhalten auf andere Objekte bezieht sich der Autor speziell auf Wertobjekte.
Obwohl mein Zitat es nicht enthält, erwähnt der Autor im selben Absatz, dass in einigen Fällen Verhalten (und Attribute ) auch in andere Entitäten verschoben werden (obwohl ich die Vorteile des Verschiebens von Verhalten in VOs verstehe).
3) Unter der Annahme, dass MyEntity
(siehe Frage 3 in meinem ursprünglichen Beitrag) SRP nicht verletzt, würden wir sagen, dass eine Verantwortung von MyEntity
unter anderem auch besteht aus:
ein. A_resp
+ B_resp
+ AB_resp
( AB_resp
koordiniert Objekte a
und b
)
oder
b. AB_resp
+ Delegieren von A_resp
und B_resp
an Objekte ( a
und b
), die mit verknüpft sindMyEntity
?
4) Eric Evans DDD-Buch, pg. 94
Die Kunden-ID ist die einzige Kennung der ENTITÄT des Kunden (Abbildung 5.5). Die Telefonnummer und die Adresse werden jedoch häufig verwendet, um einen Kunden zu finden oder zu finden. Der Name definiert nicht die Identität einer Person, wird jedoch häufig als Teil der Mittel zur Bestimmung dieser Identität verwendet.
In diesem Beispiel wurden die Telefon- und Adressattribute in "Kunde" verschoben. Bei einem realen Projekt hängt diese Auswahl jedoch davon ab, wie die Kunden der Domain normalerweise abgeglichen oder unterschieden werden. Wenn ein Kunde beispielsweise viele Kontakttelefonnummern für verschiedene Zwecke hat, ist die Telefonnummer nicht mit der Identität verknüpft und sollte beim Vertriebskontakt verbleiben.
ein)
Die Kunden-ID ist die einzige Kennung der ENTITÄT des Kunden (Abbildung 5.5). Die Telefonnummer und die Adresse werden jedoch häufig verwendet, um einen Kunden zu finden oder zu finden. Der Name definiert nicht die Identität einer Person, wird jedoch häufig als Teil der Mittel zur Bestimmung dieser Identität verwendet.
Das Anführungszeichen gibt an, dass nur mit der Identität verknüpfte Attribute in einer Entität verbleiben sollen . Ich gehe davon aus, dass author bedeutet, dass die Entität nur die Attribute enthalten soll , die häufig zum Finden oder Abgleichen dieser Entität verwendet werden , während ALLE anderen Attribute verschoben werden sollen.
b) Aber wie / wo sollen andere Attribute verschoben werden? Zum Beispiel (hier wird davon ausgegangen, dass das Adressattribut nicht zum Finden oder Übereinstimmen verwendet wird Customer
und daher das Adressattribut verschoben werden soll Customer
):
Wenn wir anstelle von Customer.Address
(vom Typ string
) eine Eigenschaft Customer.Address
vom Typ erstellen Address
, haben wir das Adressattribut in ein zugehöriges VO-Objekt verschoben (das vom Typ ist Address
), oder würden wir sagen, dass dieses Customer
noch das Adressattribut enthält ?
c)
In diesem Beispiel wurden die Telefon- und Adressattribute in "Kunde" verschoben. Bei einem realen Projekt hängt diese Auswahl jedoch davon ab, wie die Kunden der Domain normalerweise abgeglichen oder unterschieden werden. Wenn ein Kunde beispielsweise viele Kontakttelefonnummern für verschiedene Zwecke hat, ist die Telefonnummer nicht mit der Identität verknüpft und sollte beim Vertriebskontakt verbleiben.
Ist der Autor hier nicht falsch, denn wenn wir jede der vielen Kontakttelefonnummern annehmen , Customer
die nur zu dieser bestimmten gehören Customer
, dann würde ich sagen, dass diese Telefonnummern genauso mit der Identität assoziiert sind, wie wenn sie Customer
nur eine Telefonnummer hatten ?
5)
Der Grund, warum der Autor vorschlägt, die Entität zu reduzieren, ist, dass beim erstmaligen Erstellen einer Customer-Entität die Tendenz besteht, sie mit allen Attributen zu füllen, von denen man annimmt, dass sie einem Kunden zugeordnet sind. Dies ist ein datenzentrierter Ansatz, der Verhaltensweisen übersieht, die letztendlich zu einem anämischen Domänenmodell führen.
Ich dachte jedoch, ein anämisches Domänenmodell resultiert aus dem Verschieben von Verhalten aus einer Entität heraus , während Ihr Beispiel eine Entität mit vielen Attributen auffüllt , was Customer
zu zu viel Verhalten führen würde (da wir wahrscheinlich auch in Customer
die Verhaltensweisen welche einbeziehen würden) diese zusätzlichen Attribute modifizieren ) und damit SRP verletzen?
Vielen Dank