A responsabilidade única (motivo da mudança) de uma entidade deve ser identificar-se de forma exclusiva, ou seja, sua responsabilidade deve ser identificável.
Livro DDD de Eric Evan, pág. 93:
A responsabilidade mais básica das Entidades é estabelecer continuidade para que o comportamento possa ser claro e previsível. Eles fazem isso melhor se forem mantidos livres. Em vez de focar nos atributos ou mesmo no comportamento, reduza a definição do objeto Entity às características mais intrínsecas, particularmente aquelas que o identificam ou são comumente usadas para encontrá-lo ou combiná-lo. Adicione apenas comportamentos essenciais ao conceito e aos atributos exigidos por esse comportamento.
Além disso, procure remover comportamentos e atributos em outros objetos associados à Entidade principal. Além dos problemas de identidade, as Entidades tendem a cumprir suas responsabilidades coordenando as operações dos objetos que possuem.
1
... reduza a definição do objeto ENTITY até as características mais intrínsecas, particularmente aquelas que o identificam ou são comumente usadas para encontrá-lo ou combiná-lo. Adicione apenas comportamentos essenciais ao conceito ...
Depois que uma entidade recebe um ID exclusivo , sua identidade é estabelecida e, portanto, eu presumo que essa entidade não precisa de nenhum comportamento para manter sua identidade ou ajudá-la a se identificar . Portanto, não entendo a que tipo de comportamento o autor se refere (além de find
e match
operações ) com " comportamento essencial ao conceito "?
2)
... reduza a definição do objeto ENTITY até as características mais intrínsecas, particularmente aquelas que o identificam ou são comumente usadas para encontrá-lo ou combiná-lo. ... Além disso, procure remover comportamentos e atributos em outros objetos associados à ENTITY principal.
Portanto, qualquer comportamento que não ajude a identificar a entidade, mas ainda assim caracterizá-lo como uma característica intrínseca dessa entidade (por exemplo, latir é intrínseco aos cães, voar é intrínseco aos aviões, pôr ovos é intrínseco aos pássaros .. .), deve ser colocado em outros objetos associados a essa entidade (exemplo: devemos colocar o comportamento de latido em um objeto associado a uma entidade de cachorro)?
3)
Além disso, procure remover comportamentos e atributos em outros objetos associados à ENTITY principal.
a) MyEntity
delega responsabilidades A_resp
e B_resp
objetos a
e b
, respectivamente.
Mesmo que a maioria dos A_resp
e B_resp
trabalho é feito por a
e b
casos, os clientes ainda são servidos A_resp
e B_resp
meio MyEntity
, o que significa que a partir da perspectiva do cliente as duas responsabilidades pertencem MyEntity
. Assim, isso não significa que MyEntity
também tem A_resp
e B_resp
responsabilidades e, como tal, está violando o SRP ?
b) Mesmo se assumirmos que A_resp
e B_resp
não pertencem a MyEntity
, MyEntity
ainda tem a responsabilidade AB_resp
de coordenar as operações de objetos a
e b
. Portanto, não MyEntity
viola o SRP, uma vez que, no mínimo, tem duas responsabilidades - identificar-se exclusivamente e também 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
{ ... }
ATUALIZAR:
1
O comportamento neste contexto refere-se ao comportamento semântico. Por exemplo, uma propriedade em uma classe (ou seja, atributo em um objeto de domínio) que é usada para identificar exclusivamente que ela possui um comportamento. Enquanto isso não é representado no código diretamente. O comportamento esperado é que não haverá valores duplicados para essa propriedade.
Portanto, no código, quase nunca precisaríamos realmente implementar um comportamento (ou seja, uma operação) que de alguma forma manteria a identidade da entidade, pois, como você explicou, esse comportamento só existe como um conceito em um modelo de domínio (na forma de um atributo de ID de uma entidade), mas quando convertemos esse atributo de ID em código, parte de sua semântica é perdida (ou seja, a parte que garante implicitamente que o valor do ID é único é perdida)?
2)
Além disso, uma propriedade como Age não tem contexto fora de uma Entidade da Pessoa e, como tal, não faz sentido mudar para um objeto diferente ... No entanto, essas informações podem ser facilmente armazenadas em um local separado pelo qual o identificador exclusivo, portanto, o referência confusa ao comportamento. A idade pode ser um valor carregado preguiçoso.
a) Se a Age
propriedade é carregada preguiçosamente, podemos chamá-la de comportamento, mesmo que semanticamente Age
seja apenas um atributo?
3)
Você poderia facilmente ter operações específicas para Endereço, como verificação de que é um endereço válido. Você pode não saber disso em tempo de design, mas todo esse conceito é dividir os objetos em suas menores partes
Embora eu concorde que perderíamos o contexto mudando Age
para um objeto diferente, o contexto não seria perdido se DateOfBirth
movermos a propriedade para um objeto diferente, mas geralmente não o movemos.
Qual é a principal razão pela qual nos mudaríamos Address
para outro objeto, mas não DateOfBirth
? Porque DateOfBirth
é mais intrínseco à Person
entidade ou porque há menos chances de que em algum lugar no futuro possamos precisar definir operações específicas DateOfBirth
?
4. Devo dizer que ainda não sei se MyEntity
também tem A_resp
e B_resp
responsabilidades e por que MyEntity
também AB_resp
não é considerado uma violação do SRP
EULERFX
1)
Os comportamentos aos quais o autor está se referindo são comportamentos associados à entidade. Esses são os comportamentos que modificam o estado da entidade
a) Se eu entendi direito, você está dizendo que a entidade deve conter apenas os comportamentos que modificam seus atributos (ou seja, seu estado )?
b) E quanto aos comportamentos que não necessariamente modificam o estado da entidade , mas ainda são considerados uma característica intrínseca dessa entidade (exemplo: latir seria uma característica intrínseca de uma Dog
entidade, mesmo que não modificasse Estado do cão )? Devemos incluir esses comportamentos em uma entidade ou devem ser movidos para outros objetos?
2)
Quanto a mudar o comportamento para outros objetos, o autor está se referindo especificamente a objetos de valor.
Embora minha citação não a inclua, o autor menciona no mesmo parágrafo que, em alguns casos, comportamentos (e atributos ) também serão transferidos para outras entidades (embora eu compreenda os benefícios de mudar comportamentos para VOs)
3) Supondo que MyEntity
(veja a pergunta 3. no meu post original) não viole o SRP, diríamos que uma responsabilidade de MyEntity
é, entre outras coisas, também composta por:
uma. A_resp
+ B_resp
+ AB_resp
( AB_resp
coordena objetos a
e b
)
ou
b. AB_resp
+ delegar A_resp
e B_resp
aos objetos ( a
e b
) associados a MyEntity
?
4) Livro DDD de Eric Evan, pág. 94:
Identificação do cliente é o único identificador da ENTIDADE do cliente (figura 5.5), mas o número e o endereço do telefone costumam ser usados para encontrar ou corresponder a um cliente. O nome não define a identidade de uma pessoa, mas é frequentemente usado como parte dos meios para determiná-la.
Neste exemplo, os atributos de telefone e endereço foram movidos para o Cliente, mas em um projeto real, essa escolha dependeria de como os clientes do domínio normalmente são correspondidos ou distinguidos. Por exemplo, se um Cliente tiver muitos números de telefone para diferentes finalidades, o número de telefone não está associado à identidade e deve permanecer no Contato de Vendas.
a)
Identificação do cliente é o único identificador da ENTIDADE do cliente (figura 5.5), mas o número e o endereço do telefone costumam ser usados para encontrar ou corresponder a um cliente. O nome não define a identidade de uma pessoa, mas é frequentemente usado como parte dos meios para determiná-la.
A citação afirma que apenas os atributos associados à identidade devem permanecer em uma entidade . Suponho que autor significa que a entidade deve conter apenas os atributos que costumam ser usados para encontrar ou corresponder a essa entidade , enquanto TODOS os outros atributos devem ser movidos?
b) Mas como / onde outros atributos devem ser movidos? Por exemplo (suposição aqui é que atributo de endereço não é usado para encontrar ou corresponder Customer
e, portanto, queremos mover atributo de endereço fora do Customer
):
se em vez de ter Customer.Address
(do tipo string
) criamos uma propriedade Customer.Address
do tipo Address
, movemos o atributo de endereço para um objeto VO associado (que é do tipo Address
) ou diríamos que Customer
ainda contém o atributo de endereço ?
c)
Neste exemplo, os atributos de telefone e endereço foram movidos para o Cliente, mas em um projeto real, essa escolha dependeria de como os clientes do domínio normalmente são correspondidos ou distinguidos. Por exemplo, se um Cliente tiver muitos números de telefone para diferentes finalidades, o número de telefone não está associado à identidade e deve permanecer no Contato de Vendas.
O autor não está errado aqui, já que se assumirmos cada um dos muitos números de telefone de contato que Customer
pertencem apenas a esse particular Customer
, eu diria que esses números de telefone estão associados à identidade tanto quanto quando Customer
apenas um número de telefone ?
5)
O motivo pelo qual o autor sugere descartar a entidade é que, quando alguém cria inicialmente uma entidade Cliente, há uma tendência a preenchê-la com qualquer atributo que se possa considerar associado a um cliente. Essa é uma abordagem centrada em dados que negligencia os comportamentos que levam a um modelo de domínio anêmico.
Off topic, mas eu pensei anêmicos modelo de domínio resultados de mover comportamento fora de uma entidade , enquanto que o seu exemplo é preencher uma entidade com muitos atributos , o que resultaria em Customer
ter muita comportamento (uma vez que provavelmente também incluir Customer
nos comportamentos que modificar esses atributos adicionais ) e, portanto, violar o SRP?
obrigado