La responsabilité unique (raison du changement) d'une entité devrait être de s'identifier de manière unique, en d'autres termes, sa responsabilité doit être identifiable.
Livre DDD d'Eric Evan, p. 93:
la responsabilité la plus fondamentale des entités est d'établir une continuité afin que le comportement soit clair et prévisible. Ils le font mieux s'ils sont tenus à l'écart. Plutôt que de se concentrer sur les attributs ou même le comportement, dépouillez la définition de l'objet Entity jusqu'aux caractéristiques les plus intrinsèques, en particulier celles qui l'identifient ou sont couramment utilisées pour le trouver ou le faire correspondre. Ajoutez uniquement les comportements essentiels au concept et aux attributs requis par ce comportement.
Au-delà de cela, cherchez à supprimer le comportement et les attributs dans d'autres objets associés à l'entité de base. Au-delà des problèmes d'identité, les entités ont tendance à assumer leurs responsabilités en coordonnant les opérations des objets qu'elles possèdent.
1.
... dépouille la définition de l'objet ENTITY jusqu'aux caractéristiques les plus intrinsèques, en particulier celles qui l'identifient ou sont couramment utilisées pour le trouver ou le faire correspondre. Ajoutez uniquement les comportements essentiels au concept ...
Une fois qu'une entité se voit attribuer un ID unique , son identité est établie et je suppose donc qu'une telle entité n'a besoin d'aucun comportement pour maintenir son identité ou pour l' aider à s'identifier . Ainsi, je ne comprends pas ce genre de comportement est l' auteur se référant à ( en plus findet match opérations ) avec « un comportement qui est essentiel au concept »?
2.
... dépouille la définition de l'objet ENTITY jusqu'aux caractéristiques les plus intrinsèques, en particulier celles qui l'identifient ou sont couramment utilisées pour le trouver ou le faire correspondre. ... Au-delà de cela, cherchez à supprimer le comportement et les attributs dans d'autres objets associés au noyau ENTITY.
Donc, tout comportement qui n'aide pas à identifier l'entité, mais nous caractériserions toujours ce comportement comme étant une caractéristique intrinsèque de cette entité (c'est-à-dire que les aboiements sont intrinsèques aux chiens, le vol est intrinsèque aux avions, la ponte est intrinsèque aux oiseaux .. .), devrait être placé dans d'autres objets associés à cette entité (exemple: nous devrions mettre le comportement d'aboiement dans un objet associé à une entité chien)?
3.
Au-delà de cela, cherchez à supprimer le comportement et les attributs dans d'autres objets associés au noyau ENTITY.
a) MyEntitydélègue les responsabilités A_respet B_respaux objets aet b, respectivement.
Même si la plupart A_respet le B_resptravail se fait par aet bcas, les clients sont toujours servis A_respet B_resppar MyEntity, ce qui signifie que du point de vue du client les deux responsabilités appartiennent MyEntity. Ainsi, ne pas que cela veut dire MyEntityaussi a A_respet B_respresponsabilités et en tant que telle ne respecte pas SRP ?
b) Même si nous supposons que A_respet B_respn'appartiennent pas MyEntity, a MyEntitytoujours la responsabilité AB_respde coordonner les opérations des objets aet b. Donc, ne MyEntityviole pas la SRP car au moins il a deux responsabilités - s'identifier de manière unique et aussi 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
{ ... }
MISE À JOUR:
1.
Dans ce contexte, le comportement fait référence au comportement sémantique. Par exemple, une propriété sur une classe (c'est-à-dire un attribut sur un objet de domaine) qui est utilisée pour l'identifier de manière unique a un comportement. Bien que cela ne soit pas représenté directement dans le code. Le comportement attendu est qu'il n'y aura pas de valeurs en double pour cette propriété.
Donc, dans le code, nous n'aurions presque jamais besoin de mettre en œuvre un comportement (c'est-à-dire une opération) qui maintiendrait en quelque sorte l'identité de l'entité, car comme vous l'avez expliqué, un tel comportement n'existe que comme concept dans un modèle de domaine (sous la forme d'un attribut ID de une entité), mais lorsque nous traduisons cet attribut ID en code, une partie de sa sémantique est perdue (c'est-à-dire la partie qui s'assure implicitement que la valeur ID est unique est perdue)?
2.
De plus, une propriété telle que Age n'a pas de contexte en dehors d'une entité personne, et en tant que telle, n'a aucun sens de se déplacer vers un autre objet ... Cependant, ces informations pourraient facilement être stockées dans un emplacement séparé que l'identifiant unique, d'où la référence confuse au comportement. L'âge peut être une valeur chargée paresseuse.
a) Si la Agepropriété est chargée paresseusement, alors nous pouvons l'appeler un comportement, même si sémantiquement Agen'est qu'un attribut?
3.
Vous pourriez facilement avoir des opérations spécifiques à l'adresse telles que la vérification qu'il s'agit d'une adresse valide. Vous ne le savez peut-être pas au moment de la conception, mais tout ce concept consiste à décomposer les objets en leurs plus petites parties
Bien que je convienne que nous perdrions le contexte en nous déplaçant Agedans un objet différent, le contexte ne serait pas perdu si nous déplacions une DateOfBirthpropriété dans un objet différent, mais nous ne le déplaçons généralement pas.
Quelle est la principale raison pour laquelle nous irions Addressdans un autre objet, mais pas DateOfBirth? Parce que DateOfBirthc'est plus intrinsèque à l' Personentité ou parce qu'il y a moins de chances que quelque part dans le futur nous ayons besoin de définir des opérations spécifiques à DateOfBirth?
4. Je dois dire que je ne sais pas encore si MyEntitya aussi A_respet B_respresponsabilités et pourquoi MyEntityaussi avoir AB_respn'est pas considéré comme une violation du SRP
EULERFX
1)
Les comportements auxquels l'auteur fait référence sont des comportements associés à l'entité. Ce sont les comportements qui modifient l'état de l'entité
a) Si je vous comprends bien, vous dites que l' entité ne devrait contenir que les comportements qui modifient ses attributs (c'est-à-dire son état )?
b) Et qu'en est-il des comportements qui ne modifient pas nécessairement l' état de l'entité , mais qui sont toujours considérés comme étant une caractéristique intrinsèque de cette entité (exemple: aboyer serait une caractéristique intrinsèque d'une Dogentité, même s'il ne modifiait pas État du chien )? Faut-il inclure ces comportements dans une entité ou les déplacer vers d'autres objets?
2)
En ce qui concerne le déplacement du comportement vers d'autres objets, l'auteur se réfère spécifiquement aux objets de valeur.
Bien que ma citation ne l'inclue pas, mais l'auteur mentionne dans le même paragraphe que, dans certains cas, les comportements (et attributs ) seront également déplacés dans d' autres entités (bien que je comprenne les avantages du déplacement des comportements vers les VO)
3) En supposant que MyEntity(voir la question 3. dans mon message d'origine) ne viole pas la SRP, dirions-nous qu'une responsabilité de MyEntitycomprend également, entre autres:
une. A_resp + B_resp + AB_resp ( AB_respcoordonne les objets aet b)
ou
b. AB_resp + délégation A_respet B_respaux objets ( aet b) associés à MyEntity?
4) Livre DDD d'Eric Evan, p. 94:
CustomerID est le seul et unique identifiant de l'entité client (figure 5.5), mais le numéro de téléphone et l'adresse sont souvent utilisés pour trouver ou faire correspondre un client. Le nom ne définit pas l'identité d'une personne, mais il est souvent utilisé dans le cadre de sa détermination.
Dans cet exemple, les attributs de téléphone et d'adresse ont été transférés dans Client, mais sur un projet réel, ce choix dépendrait de la manière dont les clients du domaine sont généralement mis en correspondance ou distingués. Par exemple, si un client a plusieurs numéros de téléphone de contact à des fins différentes, le numéro de téléphone n'est pas associé à l'identité et doit rester avec le contact commercial.
une)
CustomerID est le seul et unique identifiant de l'entité client (figure 5.5), mais le numéro de téléphone et l'adresse sont souvent utilisés pour trouver ou faire correspondre un client. Le nom ne définit pas l'identité d'une personne, mais il est souvent utilisé dans le cadre de sa détermination.
La citation indique que seuls les attributs associés à l' identité doivent rester dans une entité . Je suppose que l'auteur signifie que l' entité ne doit contenir que les attributs qui sont souvent utilisés pour rechercher ou faire correspondre cette entité , alors que TOUS les autres attributs doivent être déplacés?
b) Mais comment / où déplacer les autres attributs ? Par exemple (l'hypothèse ici est que l' attribut d'adresse n'est pas utilisé pour rechercher ou faire correspondre Customer et donc nous voulons retirer l' attribut d'adresseCustomer ):
si au lieu d'avoir Customer.Address(de type string) nous créons une propriété Customer.Addressde type Address, avons-nous déplacé l' attribut d'adresse dans un objet VO associé (qui est de type Address) ou dirions-nous qu'il Customercontient toujours un attribut d'adresse ?
c)
Dans cet exemple, les attributs de téléphone et d'adresse ont été transférés dans Client, mais sur un projet réel, ce choix dépendrait de la manière dont les clients du domaine sont généralement mis en correspondance ou distingués. Par exemple, si un client a plusieurs numéros de téléphone de contact à des fins différentes, le numéro de téléphone n'est pas associé à l'identité et doit rester avec le contact commercial.
Ce n'est pas l'auteur qui a tort ici, car si nous supposons que chacun des nombreux numéros de téléphone de contact qui Customern'appartiennent qu'à ce particulier Customer, je dirais que ces numéros de téléphone sont associés à l' identité autant que lorsqu'ils Customern'avaient qu'un seul numéro de téléphone. ?
5)
La raison pour laquelle l'auteur suggère de supprimer l'entité est que lorsque l'on crée initialement une entité Client, il y a une tendance à la remplir avec n'importe quel attribut que l'on peut penser être associé à un client. Il s'agit d'une approche centrée sur les données qui néglige les comportements conduisant finalement à un modèle de domaine anémique.
Hors sujet, mais je pensais que le modèle de domaine anémique résulte du déplacement d'un comportement hors d'une entité , tandis que votre exemple remplit une entité avec beaucoup d' attributs , ce qui entraînerait Customerun trop grand nombre de comportements (car nous inclurions probablement aussi dans Customerles comportements qui modifier ces attributs supplémentaires ) et donc en violation de SRP?
Merci