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 finde 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) MyEntitydelega responsabilidades A_respe B_respobjetos ae b, respectivamente.
Mesmo que a maioria dos A_respe B_resptrabalho é feito por ae bcasos, os clientes ainda são servidos A_respe B_respmeio MyEntity, o que significa que a partir da perspectiva do cliente as duas responsabilidades pertencem MyEntity. Assim, isso não significa que MyEntitytambém tem A_respe B_respresponsabilidades e, como tal, está violando o SRP ?
b) Mesmo se assumirmos que A_respe B_respnão pertencem a MyEntity, MyEntityainda tem a responsabilidade AB_respde coordenar as operações de objetos ae b. Portanto, não MyEntityviola 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 Agepropriedade é carregada preguiçosamente, podemos chamá-la de comportamento, mesmo que semanticamente Ageseja 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 Agepara um objeto diferente, o contexto não seria perdido se DateOfBirthmovermos a propriedade para um objeto diferente, mas geralmente não o movemos.
Qual é a principal razão pela qual nos mudaríamos Addresspara outro objeto, mas não DateOfBirth? Porque DateOfBirthé mais intrínseco à Personentidade 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 MyEntitytambém tem A_respe B_respresponsabilidades e por que MyEntitytambém AB_respnã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 Dogentidade, 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_respcoordena objetos ae b)
ou
b. AB_resp + delegar A_respe B_respaos objetos ( ae 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.Addressdo tipo Address, movemos o atributo de endereço para um objeto VO associado (que é do tipo Address) ou diríamos que Customerainda 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 Customerpertencem apenas a esse particular Customer, eu diria que esses números de telefone estão associados à identidade tanto quanto quando Customerapenas 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 Customerter muita comportamento (uma vez que provavelmente também incluir Customernos comportamentos que modificar esses atributos adicionais ) e, portanto, violar o SRP?
obrigado