Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Agregados

Fala mestre, beleza? Gostaria de uma palavra de sabedoria...

Estou criando uma pequena aplicação de cunho didático para fixar conceitos relacionados ao DDD visto no curso e me deparo com a seguinte situação (irei simplificar ao máximo):

Tenho duas entidades que identifiquei como raizes agregadas: O Associado e a Mensalidade. No Associado tenho os dados relativos a pessoa e na Mensalidade tenho o cpf do associado e uma lista de Pagamentos ( a mensalidade pode ser paga fatiada em vários pagamentos, apesar de estranho é assim que o domínio funciona nesse caso).

Aqui está o "problema" : Esse Associado pode estar adimplente ou inadimplente, isso depende se ele tiver alguma mensalidade em atraso. Ou seja, para mudar o status do associado eu dependo de outra raiz agregada. Utilizando um serviço eu poderia alterar o status do Associado recuperando do repositório de mensalidades as respectivas mensalidades desse associado e fazer a verificação se tem alguma em atraso.

É normal esse tipo de operação entre raizes agregadas acontecer ou é sinal que tem algo de errado no meu modelo? De inicio até pensei que mensalidade fosse parte da raiz agregada de associado, mas acho que está correto dividindo em duas raizes por que, por exemplo, se fossem apenas uma, ao excluir um associado eu perderia o registro das mensalidades pagas por ele, entre outras questões...

3 respostas

É exatamente pra cenários mais complexos assim que existem os Domain Services. Quando temos operações que não cabem em uma única entidade, nós abstraímos a operação em uma classe só pra ela.

Fala mestre, então..

Eu resolvi o problema dessa maneira com os domain services. Um questionamento que ficou martelando a minha cabeça era se fazia sentido o Associado e Mensalidade serem um agregado só, sendo o Associado o root? Por que existem uma relação direta entre eles. O associado possui um estado de inadimplência que para estar consistente depende diretamente de sua lista de mensalidades, sendo que, separando mensalidade e associado em agregados distintos dependo de rodar um domain service para deixar esse status consistente e se fossem ambos um único agregado não dependeria do domain service . Existe alguma métrica para saber em qual ponto devo separar agregados mesmo que haja esse tipo de relação entre eles?

Eu separei por que nas minhas pesquisas eu sempre via o exemplo do cliente e ordem de pedido(praticamente em todo lugar na internet esse exemplo). Para saber quando são agregados diferentes uma dica seria que eles devam possuir repositórios diferentes? Não sei se consegui explanar de maneira clara...

solução!

Existe alguma métrica para saber em qual ponto devo separar agregados mesmo que haja esse tipo de relação entre eles?

Cara, é bastante subjetivo, mas se um agregado em algum momento pode existir sem o outro, pode ser interessante separar. Mas analisando bem, Mensalidade não existe sem Associado, certo? Sempre que você acessa algo da mensalidade, é referente a algum associado. Então acredito que faça sentido manter o associado como root sim.

Você ainda pode ter um repo específico pra mensalidade que o seu repo de associado usa, pra separar melhor o código. Não precisa unir tudo num lugar só não.