Salve, Deus, beleza? Continuamos a saga aqui no Domain Dreaming Design. Vamos falar agora sobre agregados. Talvez é um conceito um pouco difícil de entender a princípio, mas o que eu quero fazer aqui é facilitar o seu entendimento de forma bem análoga. A gente vai fazer analogias com os nossos eventos. com os nossos eventos. Lá em cima nós criamos aqui a nossa entidade de eventos. Temos aqui o evento em si. A primeira coisa que a gente pode falar de um agregado é que sempre, sempre, um agregado vai ser uma entidade. A primeira coisa que você tem que saber. Então, todo aquele conhecimento que a gente já tem em entidade, a gente move para cá. Mas por que de agregados? Vamos pensar que, no caso do evento, eu tenho aqui um ID, que vai ser gerado lá pelo banco de dados, a data do evento, e os spots, que são os lugares, e as operações. Então eu posso criar um evento, reservar spot, cancelar reserva, bloquear. Mas pensando aqui por um lado sobre a questão dos assentos, a gente vai ter que também armazenar algumas informações dos acentos, não vai? inclusive acento vai ter que ter uma identidade própria bom que ele não está deixando eu copiar deixa eu duplicar que ele deixa eu vou copiar eu vou duplicar que ele deixa então eu tenho aqui vou tirar esse rico aqui que a gente já sabe que essa modelagem que a gente está fazendo é uma modelagem rica que tem expressão e aqui nós temos o evento Spot o que eu tenho no Spot? Eu tenho o número dele. E se ele está reservado, vou colocar assim, em português para ficar mais fácil, está reservado, para deixar mais claro o entendimento. Então, no spot também, obviamente, eu tenho que criar, que eu tenho que gerar a instância do meu objeto, e tenho que fazer a reserva aqui, e para fazer a reserva olhando da perspectiva do próprio spot, eu não tenho que passar id, porque estou querendo reservar aquele. Mas eu posso também cancelar a reserva, bloquear até que não. Pronto, aqui eu tenho as minhas três operações que eu tenho que fazer em cima de Spot. Pensando no nível operacional, quando eu for criar o meu evento, eu já poderia passar o número de lugares, ou seja, vou passar aqui o número, lugares. Porque aí ele já geraria para mim Vou passar aqui o número. Lugares. Porque aí ele já geraria para mim. Poderia ser até de forma automática ali. Depois o usuário poderia fazer essa edição. Se tivesse outras informações aqui, chegaria lá em cada lugar e posicionaria essas informações. Se tivesse outras informações aqui, chegaria lá em cada lugar e posicionaria essas informações. Mas perceba que eu tenho uma relação de intimidade entre essas duas entidades aqui. E pensando num nível gerencial, a iniciativa de fazer as coisas, na verdade, está partindo de quem? De evento. Evento está fazendo as operações que acaba utilizando a outra entidade, que é o spot. Inclusive, até para poder falar também sobre o ID, o número do spot poderia ser o próprio id também. Poderia ser o próprio id. Vamos até deixar isso aqui. Tirar o id fora. Vamos supor que eu tivesse dessa forma aqui. Então, eu tenho aqui o número. vamos supor que eu tivesse dessa forma aqui então eu tenho aqui o número então pensando agora no sentido de a gente salvar o estado dessa essas regras de negócio que vão acontecendo, porque quando eu vou criar o número de spots lá dentro desse método eu vou acessar aqui o criar do spot em si, passando alguns dados e etc eu vou acessar aqui o criar do spot em si, passando alguns dados e etc. Eu vou ter que salvar o evento e o número de spots que foram criados. Imagina que o meu evento tem 20 mil lugares, eu passei aqui 20 mil, ele vai criar 20 mil objetos, vai criar 20 mil registros, vai acabar criando 20 mil registros lá no banco de dados e aí para que a gente não tenha inconsistência, ou seja, que essa operação aqui ela não reflita em dados que não condizem com o que a gente quer seria interessante que toda a operação em cima dos spots tenha que ser passada antes pelo evento em si, porque eu tenho que verificar algumas coisas no evento ou algo assim. Então acaba que esse evento aqui, ele está sendo a fachada, ele está sendo o líder do spot. Então, a gente chama esse carinha aqui de agregado. Ele é uma entidade comum, de qualquer forma. Mas a gente chama ele de agregado. Ou raiz do agregado, ou raiz do agregado, porque um agregado nada mais é do que um conjunto de entidades e objetos de valores e outros valores. É como se fosse um cluster de entidades. Mas aí quando a gente olha para esse cluster lá, eu posso ter várias entidades, quem que é a raiz? Por onde, quem que é a raiz? Por onde? Quem que é o cara que administra isso? Ah, é aquele cara ali. Então, a gente chama esse cara aqui de agregado, aggregate root, você vai ouvir muito isso por aí, ou até olhar no meio do código. Então, nesse agregado de evento, eu tenho uma subentidade, ou uma entidade filha, um child, ente, que eu posso chamar aqui do spot. O evento spot também poderia ter outras entidades filhas. Eu posso ter esse agregado aqui do tamanho que eu quiser. Mas aí, claro, que o tamanho desse agregado vai depender do que é conveniente, do que faz sentido. Porque o agregado protege duas coisas. Está grave isso. A gente vai ver isso na prática. Na prática vai fazer bem sentido e nós vamos lembrar. Transacional. Transacional. E. Protege e controla. As invarianças. Esse termo aqui nos livros. tanto azul quanto vermelho, essa palavra é muito falada. As variâncias são as regras de negócio, os motivos para a mudança que a gente tem dentro das entidades. Porque se eu tiver um agregado, na hora que eu for salvar, Eu tenho que salvar esse negócio inteiro Não posso salvar pela metade Salvei o evento E alguns spots não foram persistidos lá Ou eu salvo tudo Ou eu não salvo Então eu tenho um limite transacional A gente vai ter que abrir uma transação Lá no banco de dados E fazer os insetos, fazer os updates Aquele troço tudo tem que acontecer Senão a minha operação Não vai ser válida e fazer os inserts, fazer os updates, aquele troço, tudo tem que acontecer, senão a minha operação não vai ser válida. Mas isso é a preocupação de uma outra camada do nosso software. Mas se a gente olhar, o evento está protegendo todos os filhos, todos os objetos que ele controla. Então, vamos colocar aqui. controla. Então, vamos colocar aqui. Agregados protegem. Limite transnacional. Vou deixar protege e controla as invarianças repetido, mas para dar essa ênfase, que ele vai controlar as invarianças, porque se eu quiser fazer uma operaçãozinha no spot, eu não posso fazer direto. O evento é o guardião das invarianças. Então tem que passar por ele. Tem que passar por ele, para a gente poder controlar esse fluxo. Além disso, eu posso ter objetos de valores. Eu não falei aqui, mas é essa mistura também. Então, imagina que aqui no caso da data, eu tenha um tipo data aqui, que é o meu objeto de valor, que define o valor da minha data. Então, essa mistura não tem limite, não tem limite mesmo. Eu posso ter essa raiz do agregado de eventos com profundos níveis ali, que evento se relaciona com spot, spot se relaciona com outra coisa, outra coisa se relaciona com outra coisa. Então outra coisa, se relaciona com outra coisa Então aqui em spots O que eu teria? Eu teria um Evento spot array Eu teria uma coleção Dessa entidade aqui A gente tem total controle Sobre esses dados, eu não tenho aqui Apenas os IDs. Eu tenho a classe completa. A gente sabe que o criador desse evento aqui vai ser o nosso parceiro. E saber qual é o parceiro do evento é importante um parceiro pode criar vários eventos e aí que vem a questão é criar uma relação diretamente com o parceiro seria interessante? Vamos estabelecer aqui uma outra dúvida. Inclusive, olha, todas aquelas que eu criei, eu estava criando aqui embaixo. Que safadinho. Vamos apagar. Vamos supor que eu tenha parceiro. Aqui. Vamos supor que eu tenha parceiro Aqui Fica até melhor colocar que o agregado é esse Que aí a gente pode Falar que aquilo tudo ali é um agregado Fica bem mais fácil posso fazer aqui um desenho Isso aqui é o nosso agregado de evento. Eu tenho o evento como raiz do agregado. Então, esse cara aqui é o nosso agregado. E agora vem a nossa relação com parceiro. Na hora que nós vamos lidar aqui com as regras de negócio, eu preciso lidar com as informações de um parceiro. inclusive ele criou aqui o spot embaixo eu preciso lidar com as informações também ali, alguma coisa para poder fazer algum processamento de dados do parceiro ou eu só preciso saber quem é o parceiro, e aí a gente define essa nossa relação. Quando nós temos essa relação aqui de evento com evento spot, toda relação entre as entidades no agregado, elas são uma relação forte, uma relação de acoplamento forte. Isso é óbvio. relação de acoplamento forte. Isso é óbvio. Porque mudanças aqui, tanto em uma quanto na outra, tanto em qualquer entidade que eu tiver aqui, vai causar mudanças no agregado inteiro. Eu preciso de alguma informação? Aqui eu tenho o nome do parceiro. Poderia ter outras informações lá. Tem um ID qualquer e as operações eu não tenho ideia. Eu preciso de alguma coisa? Desse cara? Seria até estranho Incluir ele aqui Não pense Ah, eu preciso do nome do parceiro Para poder mostrar essa informação Isso é uma preocupação De visualização desses dados De você consultar Não é uma preocupação de regra de negócio Se a gente faz esse parceiro Ficar dentro desse agregado aqui, a gente torna esse acoplamento muito forte, mas parceiro pode ter outras relações também, mas não seria interessante ter esse acoplamento forte. A gente quer que ele seja fraco. Essa relação aqui tem que ser fraca. Para ela ser fraca, então aqui dentro... O WinCrist ColorDraw aqui não permite que eu... Vamos ver se eu consigo adicionar aqui. Eu tenho que adicionar um... parceiro ID aqui. Vou até deixar ele aqui. Na verdade, é essa relação bem direta para cá que faz com que eu saiba que o evento tem aquele parceiro ID ali. Se parceiro mudar nome, mudar outras informações, isso não afeta o meu evento. Se o evento mudar outras informações, não afeta o meu parceiro, mas ele tem uma relação ali por conta da identidade. Por isso que é interessante a gente saber qual é a identidade da nossa entidade. Então, esse cara aqui também, ele acaba se tornando um agregado. Porque ele é independente. Mesmo que ele seja um agregado que contém apenas um componente ali dentro. A gente vai ver muito disso na prática também. Então, agregado a gente cria para poder controlar todo esse limite e se ele se relaciona com outros agregado a gente cria para poder controlar todo esse limite e se ele se relaciona com outros agregados é apenas pelo ID. Se eu colocar o parceiro aqui dentro, colocar a instância do parceiro aqui, esse cara não é mais um agregado. Ele não tem mais a independência de proteger as suas próprias regras de negócio. Se eu coloco ele aqui, então quem é o agregado dessa turma é evento, se eu quisesse fazer qualquer mudança no parceiro, olha como que não faz sentido. Se eu quisesse fazer qualquer mudança no parceiro, teria que passar pelo evento. Não, o parceiro é algo que a gente quer independente aqui, que pode fazer outras coisas. Eu posso ter operações de negócio aqui, executadas diretamente nessa entidade. Então, ele é um agregado separado. Essas visões, elas são libertadoras para a nossa cabeça. Eu até peço para você poder fazer um exercício com alguma coisa que você tem aí na sua empresa. Pegue alguma coisa e tente fazer um mapeamento dos agregados e a relação entre eles para você poder ver. Ah, esse aqui é um agregado que vai ter vários objetos. Esse aqui vai ser um outro agregado que vai se relacionar com isso. Maravilha, pessoal. Então, vamos seguir a nossa saga. É isso aí. E até a próxima.