O que são e como identificar agregados em DDD? – orientação-a-objetos ddd

Pergunta:


Em DDD existe a noção de agregado. Uma definição que já vi por aí é a seguinte

Compostos de Entidades ou Objetos de Valores que são encapsulados numa única classe. O Agregado serve para manter a integridade do modelo. Elegemos uma classe para servir de raiz do Agregado. Quando algum cliente quiser manipular dados de uma das classes que compõem o Agregado, essa manipulação só poderá ser feita através da raiz.

Então basicamente a ideia de agregados em DDD é equivalente a ideia de composição em orientação a objetos? A relação de composição entre dois objetos é basicamente quando um atua como parte e o outro atua como todo. Desse jeito, quando fazemos uma composição está fazendo um agregado, sendo que o “todo” é o agregado? E nesse caso o que é a raiz?

O que realmente são agregados? Além disso, como identificamos agregados ao fazer o modelo de domínio?

Autor da pergunta Leonardo

Laerte

Então basicamente a ideia de agregação em DDD é equivalente a ideia de composição em orientação a objetos?

Não. É muito comum tentar entender os design patterns do DDD confundindo-os com design patterns de orientação a objetos; e isto geralmente leva a enganos.

Apesar de que na prática o que mais vemos é DDD sendo implementando usando orientação a objetos (mentira, na prática quase não vemos DDD), a rigor a orientação a objetos sequer é um requisito – DDD pode ser implementado utilizando-se outros paradigmas.

O que realmente são agregações?

Em DDD, agregação é a estruturação de entidades e objetos de valor de forma coesa a fim de garantir a expressividade do domínio e a integridade destes objetos, uma vez que o acesso a eles só pode ser feito a partir da entide raiz.

Como identificamos agregações ao fazer o modelo de domínio?

Vamos dar uma olhada na estrutura básica de uma agregação:

-> Entidade Raiz
    -> Entidade agregada
        -> Objetos de valor
    -> Entidade agregada
        -> Objetos de valor
    -> Objetos de valor
  • Objetos de valor: eles não possuem nenhuma identidade, de modo que eles sempre serão parte de uma entidade. Eles farão parte de uma agregação no momento que a sua entidade for a raiz desta agregação ou sua entidade fizer parte desta agregação.

  • Entidades: elas possuem identidade global no domínio (ou global no contexto no caso de um domínio com mais de um modelo – ver bounded context). Ou seja, você é capaz de diferenciar um objeto do outro pela sua identidade e não apenas por suas características.

  • Entidades que fazem parte de uma agregação: elas possuem identidade, mas não global. Para fazer sentido no domínio, a identidade delas precisa ser precedida da identidade de uma outra entidade (uma “entidade pai”, por assim dizer).

  • Entidades raiz: uma entidade com identidade global será a raiz de uma agregação se ela depender de outras entidades (que não possuam identidade global) para ajudar a descrevê-la. Essas outras entidades então serão agregadas a esta entidade raiz – e daí temos uma agregação.

O domínio determina quais objetos possuem identidade e quais possuem identidade global. Os que possuem identidade global podem constituir a raiz de uma agregação e aqueles cuja identidade é dependente desta entidade raiz, serão agregados a ela. Os objetos de valor, por sua vez, estão sempre juntos da sua entidade.

Exemplo de agregação

Um exemplo em um certo domínio ou modelo poderia ser:

-> Livro (entidade raiz)
    -> Reviews de clientes (entidades agregadas)
    -> Reviews editoriais (entidades agregadas)
    -> Formatos disponíveis - papel, kindle, pdf (objetos de valor)

Neste caso, o livro tem uma identidade global no domínio ou no modelo. Sua identidade é o seu nome mais o nome do seu autor.

Os reviews também têm identidade, que é o nome do cliente ou da entidade editorial, e eventualmente a data de publicação. Mas veja que a identidade de um review só faz sentido se precedida pela identidade do próprio livro – embora seja importante identificar cada review de um livro (quem escreveu o review e quando), ele não serve para mais do que um livro e não existirá sem um livro.

Já os formatos disponíveis não possuem nenhuma identidade – um livro simplesmente está disponível em alguns dos formatos existentes.

Pelo que pude entender do conceito, o agregado é muito similar à composição em POO.

Vamos supor um carro, que tem motor, portas e rodas.

Nisso, temos o agregado carro, com as outras três, motor, portas e rodas sendo classes agregadas à classe carro.

Um objeto carro tem portas, motor e rodas, e essas partes não têm vida própria fora do objeto, isto é, estão subordinadas ao objeto carro.

Se um cliente quiser manipular uma porta ou um motor, ele terá de fazer isso usando o objeto carro, mas não poderá ao usar a porta ou motor selecionado.

Respondendo às outras perguntas…

Um agregado seria um conjunto de classes provindas de uma relação de agregação. Como a composição é uma agregação mais restrita (na agregação, as partes têm vida fora do todo, na composição, náo)

Você pode identificar um agregado no modelo do domínio levando em conta o banco de dados, por exemplo, se você vai armazenar tipos diferentes de portas, rodas e motores no sistema, e os carros podem fazer uso de diferentes combinações dessas partes, você pode fazer uso desse agregado que citei, um carro com portas, motores e pneus.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *