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 find
et 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) MyEntity
délègue les responsabilités A_resp
et B_resp
aux objets a
et b
, respectivement.
Même si la plupart A_resp
et le B_resp
travail se fait par a
et b
cas, les clients sont toujours servis A_resp
et B_resp
par MyEntity
, ce qui signifie que du point de vue du client les deux responsabilités appartiennent MyEntity
. Ainsi, ne pas que cela veut dire MyEntity
aussi a A_resp
et B_resp
responsabilités et en tant que telle ne respecte pas SRP ?
b) Même si nous supposons que A_resp
et B_resp
n'appartiennent pas MyEntity
, a MyEntity
toujours la responsabilité AB_resp
de coordonner les opérations des objets a
et b
. Donc, ne MyEntity
viole 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 Age
propriété est chargée paresseusement, alors nous pouvons l'appeler un comportement, même si sémantiquement Age
n'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 Age
dans un objet différent, le contexte ne serait pas perdu si nous déplacions une DateOfBirth
proprié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 Address
dans un autre objet, mais pas DateOfBirth
? Parce que DateOfBirth
c'est plus intrinsèque à l' Person
entité 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 MyEntity
a aussi A_resp
et B_resp
responsabilités et pourquoi MyEntity
aussi avoir AB_resp
n'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 Dog
entité, 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 MyEntity
comprend également, entre autres:
une. A_resp
+ B_resp
+ AB_resp
( AB_resp
coordonne les objets a
et b
)
ou
b. AB_resp
+ délégation A_resp
et B_resp
aux objets ( a
et 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.Address
de 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 Customer
contient 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 Customer
n'appartiennent qu'à ce particulier Customer
, je dirais que ces numéros de téléphone sont associés à l' identité autant que lorsqu'ils Customer
n'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 Customer
un trop grand nombre de comportements (car nous inclurions probablement aussi dans Customer
les comportements qui modifier ces attributs supplémentaires ) et donc en violation de SRP?
Merci