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

Referências em agregados

Fala mestre, beleza?

No módulo acadêmico do projeto temos dois agregados: Estudante e Indicação. Na classe Indicação você usou o Estudante para fazer o relacionamento.

Estava lendo alguns materiais sobre DDD e em alguns deles se fala que temos como regra de relacionamento entre agregados fazer referências através de identidade. Fazendo um paralelo com o nosso projeto, deveríamos fazer o uso do Cpf do Estudante em vez do próprio Estudante para fazer os relacionamentos? Gostaria de saber se seria mais correto refatorar o projeto com essa abordagem, ou se teria alguma desvantagem ou dá na mesma, etc?

12 respostas

Opa, Diego.

Através de agregados que nós vamos ter acesso às entidades e VOs relacionados, então não faz muito sentido termos apenas a identidade.

Você consegue me enviar o link de algum desses materiais pra eu entender melhor?

Abraços!

Então mestre,

Relacionar por identidade ao invés de referência funciona, mas meio que quebra a modelagem objeto-relacional, porém de acordo com essa regra temos alguns benefícios.

Eu vi sobre essa tal regra no livro domain driven design distilled:

Rule 3: Reference Other Aggregates by Identity Only

Now that we’ve broken up the large-cluster Product into four smaller Aggregates , how should
each reference the others where needed? Here we follow Rule 3, “Reference other Aggregates by
identity only.” In this example we see that BacklogItem , Release , and Sprint all reference
Product by holding a ProductId . This helps keep Aggregates small and prevents reaching out
to modify multiple Aggregates in the same transaction.

This further helps keep the Aggregate design small and efficient, making for lower memory
requirements and quicker loading from a persistence store. It also helps enforce the rule not to modify
other Aggregate instances within the same transaction. With only identities of other Aggregates ,
there is no easy way to obtain a direct object reference to them.

Another benefit to using reference by identity only is that your Aggregates can be easily stored in
just about any kind of persistence mechanism, such as relational database, document database, keyvalue store, and data grids/fabrics. This means that you have options to use a MySQL relational table, a JSON-based store such as PostgreSQL or MongoDB, GemFire/Geode, Coherence, and GigaSpaces

Um pouco dificil copiar o que tem no livro e a pessoa não pega o contexto também, mas digitando o nome da regra no google tem várias coisas.

Nesse link : https://vaadin.com/learn/tutorials/ddd/tactical_domain_driven_design na sessão Guideline 2: Refer to other aggregates by ID tem essa regra resumidamente explicada também.

Existe a enorme possibilidade de eu estar fazendo confusão também, hoje terei tempo para voltar a praticar um pouco sobre o que tenho lido, e na prática a gente desfaz algumas confusões ou cria a certeza que tal coisa é um problema.

Interessante. Vou ler mais sobre. No livro DDD in PHP ele mostra as vantagens (e o motivo) de termos a relação completa. Dessa forma, através de agregados nós controlamos o acesso às entidades relacionadas.

Inclusive tem um projeto que eles mostram no livro disponível no GitHub: https://github.com/dddinphp/last-wishes

O agregado de usuário controla o acesso aos desejos: https://github.com/dddinphp/last-wishes/blob/master/src/Lw/Domain/Model/User/User.php

Então mestre,

Aparentemente no exemplo dos Wishes ele usou essa regrinha.

Observe que um Wish não tem um Usuário mas sim uma identificação para esse usuário. Tradicionalmente, como aprendi no curso de Doctrine, eu teria modelado o Wish com uma referência para algum Usuário.

Isso afeta o modo de busca: Wish modelado com uma referência eu poderia buscar o Usuário com um método user() no próprio Wish. Já agora, com somente a identificação, posso buscar o Usuário somente com um repositório.

Mas de fato eu não sei se estou interpretando certo os conceitos ou se estou fazendo uma mistura de idéias erradas.

Mas o agregate root é o Usuário. Repara que ele não tem uma referência para wishes. Ele tem todas as instâncias.

Talvez esse vídeo seja uma boa referência também: https://www.youtube.com/watch?v=1AEOcQWQR2o

Então mestre,

Já tinha visto todos os vídeos dessa série, vou rever novamente.

Mas o agregate root é o Usuário. Mas a questão é com o Wish, ele não tem um Usuário e sim um Id do Usuário, isso em ambos os casos: com o Wish como aggregate root dele próprio e depois com a refatoração passando o usuário ser o aggregate root.

Eu reassisti ao vídeo do Elemar, e voltamos ao princípio do que eu falava rsrs. Ele fala sobre essa questão de quando temos uma referência entre agregados devemos usar o ID.

Por exemplo, no treinamento temos Aluno e Indicacao, pelo que entendi o agregado Indicacao deveria ter os ID dos alunos em vez de propriamente os Alunos. Uma coisa que ele não comentou e que tenho dúvida também é quando surge as invariantes: Se um Aluno puder fazer somente duas Indicacoes, eles agora formam um único agregado sendo o Aluno o root? Parece que a resposta é sim (seguindo a abordagem do livro DDD in PHP), o problema é que seguindo esse principio posso ter agregados enormes.

Aahh, acho que agora entendi sua dúvida.

A relação entre agregados diferentes deve sim ser feita através das identidades somente, mas a relação entre o aggregate root e suas entidades e objetos de valor "filhos", a relação é direta.

Se um Aluno puder fazer somente duas Indicacoes, eles agora formam um único agregado sendo o Aluno o root?

É exatamente assim que eu modelaria. :-)

Então a modelagem entre Aluno e Indicação do treinamento está incorreta? Sendo o correto refatorar para a Indicação conter as identidades dos Alunos? Pelo que andei lendo eles continuariam sendo agregados diferentes mesmo com essa regra de negócio, só não sei como manter a consistência das regras de negócios entre agregados diferentes, caso começarmos a unificar agregados diferentes teremos agregados enormes.

solução!

Acabei de ver o curso aqui porque não me lembrava dessa parte. Sim, faz todo sentido retirarmos as referências a alunos, tanto em indicante como em indicado e enviar apenas o CPF, por exemplo.

Inclusive vou deixar um "para saber mais" na sessão de agregados pra que isso fique claro já que eu deixei passar completamente.

Acho que faltou a Indicacao ter uma identificação também, a não ser que ele seja um value object, acho que depende de como você imaginou as regras de negócio.