Salve, Deus, beleza? Continua a nossa saga aqui no Domain Dream Design. Vamos agora fazer algumas operações aqui em cima do nosso agregado de eventos. E agora a gente vai desvacinando de ORMs, que é o que a gente perde a essência da programação, aquilo que a gente aprendeu lá no início. No construtor de eventos, nós podemos passar uma sequência de sessões, ou se não passar nada, inicia ali o set, que é justamente essa linha aqui, e sections não é obrigatório. Então, eu vou ter que ter uma operação de negócio para poder adicionar sessão no meu evento. Isso é inerente. Então, isso aqui vai acabar virando um método na minha classe. Então, a gente vai adicionar um AddSection. Isso aqui é uma regra de negócio. Isso aqui está dentro do nosso modelo rico. A gente sabe o que vai acontecer. E aí tem o comando. Então, é sempre bom colocar um command, porque fica fácil de entender que isso aqui é uma operação de negócio que nós estamos fazendo. Porque, às vezes, eu tenho outros métodos aqui dentro da classe que é para poder retornar eu quero extrair um valor ali, não necessariamente a gente está fazendo alterando o estado do nosso agregado aí como nós vamos ter algumas informações a mais nesse head section, não vale nem a pena colocar ali, porque senão vai ficar muito grande a linha eu prefiro declarar aqui em cima. Então vou ter o meu AddSectionCommand. Em outras linguagens de programação, você até consegue nem precisar de um tipo desse aqui, por exemplo, no Python, você tenha aqueles parâmetros nomeados, que dá para nem precisar fazer isso, mas em outras linguagens você teria que criar uma classe, que é o que eu recomendaria. É por isso que eu falei lá que se vocês deram um feedback muito legal nisso aqui e falaram que a gente quer que crie por outras linguagens de programação, se eu receber muitos feedbacks, a gente vai criar, porque acho que vai ser legal de ter isso em outras linguagens de programação também. Então, para poder adicionar a sessão, eu preciso do nome da sessão, da descrição, que não precisa ser obrigatória, pode ser ali uma string ou nu, mas com a interrogação aqui, ela nem é obrigatória, eu não preciso passar. O total de spots, que na hora que eu vou criar a seção ali, ele vai gerar o número de spots correspondentes, e já o preço. São essas as informações básicas. E aqui embaixo, então, eu tenho o meu comando, Add Section Command. O legal é que se você quiser ter uma consulta, você não precisa ir lá em cima com o mouse na sua IDL, já vai mostrar ali o type, porque o type é bem simples. Então, agora como que vai ser o meu addSection? Eu vou pegar um section.create, a gente não tem lá o create, será que a gente consegue passar o comando? Olha só, o meu add section command é do mesmo tipo do create, ou seja, os dados são os mesmos. Eu preciso passar aqui na minha criação, nome, descrição, total spots e o price. Então, ótimo, beleza. Então, aqui aqui uma vez que eu faço essa criação eu vou guardar numa variável aí eu vou chamar o this section adding eu vou adicionar aqui no meu setting beleza uma vez que eu adicionei essa seção e eu sei que tem um número de spots ali, o que eu tenho que fazer? This total spots mais o total de spots que eu estou adicionando. Olha a regra de negócio aqui. Tudo isso aqui é a regra de negócio, mas olha uma transformação que normalmente a gente fica fazendo em outros lugares. Isso aqui é expressividade. Quando eu olho para isso aqui, faz muito sentido o que eu estou fazendo. Então nós podemos chegar lá no teste para poder avaliar se isso aqui está ok. Se eu estou com 100 novos spots, eu faço aqui agora um edge, então eu uso sempre, eu não modifico as variáveis, a não ser que você esteja no teste e está modificando por algum motivo bem específico, é sempre com as operações. Não preciso disso aqui, então quero verificar se o meu total de spots, posso ver se o size, dá até para ver se é o size mesmo, se ele é igual a 1, vou até rodar aqui, deu certo, e se o total de spots, o total de spots deve ser igual a 100, que a gente iniciou com zero. Pronto, deu certo. Então, eu tenho uma sessão e eu tenho 100 spots. Vou colocar um import aqui em cima que eu não estou utilizando. Deixa ele ali. Agora, eu tenho que chegar aqui no meu create. Então, é uma regra de negócio que toda vez que eu criar uma sessão, ele vai ter que criar os spots também. Isso aqui é interessante. Eu tenho que fazer a geração desses spots após criar essa sessão. Então, eu vou guardar ela numa variável também. E aí eu posso fazer um... Quanto tempo que eu não faço um for? Para cada... É isso aqui mesmo. Para cada i, enquanto ele for menor que o total de spots e mais mais quando a gente aprende um for pela primeira vez então eu vou fazer aqui um section na verdade eu já estou com essa section na mão vou ter que fazer um section add spot AddSpot Depois eu poderia adicionar o Spot também Eu acho que isso aqui cabe até no método privado Para poder ser mais organizado Vou fazer assim, Init Spot Que aí privado para poder ser mais organizado, vou fazer assim, init spots e aí quando eu fizer aqui esse create eu posso chamar isso aqui, isso aqui está dentro do dis, aí eu chamo aqui o meu evento spot.create. Show de bola. Mas aqui eu chamo total spots, eu não estou passando o total de spots, se bem que eu estou passando o total de spots eu tenho esse total de spots aqui? Tenho, né? Está sendo passado aqui, ó. Já no comment que está omitido. Então eu chamo sessão e nip spot. Posso também ter outros métodos auxiliares, esse método é privado, eu não quero que ele fique disponível para ninguém acessar nem nada, e torna a nossa lógica aqui mais legível. Maravilha! E aqui eu tenho que retornar a sessão, porque senão... e que eu tenho que retornar a seção, porque senão... a gente não vai ter o objeto retornado aqui na nossa Factory. Show de bola! Tem mais alguma coisa aqui, a gente criou a seção e etc. Então agora, depois de fazer isso aqui, nós podemos fazer mais alguns testes. Eu quero ver se o total de spots vai ser 100, porque se eu passei 100 aqui, ele vai criar 100. Deixa eu salvar para ver se deu certo. Aqui ele está criando 200. Não estou fazendo mais nada aqui para baixo. porque ele está criando um 200, que é o total de spots, que está sendo passado para cá. Eu vou criar um evento aqui, a seção está sendo passada na verdade aqui tem que ser já vou passar os dados aqui eu estou criando a sessão ainda passando para cá, aí ele está gerando duas vezes eu só tenho que passar os dados aqui passando pra cá, aí ele tá gerando duas vezes. Eu só tenho que passar os dados aqui. Tá vendo como que o agregado controla tudo? Então agora a gente vai pegar aqui, ó, o evento sections. Eu posso pegar aqui de evento ponto sections, aí se eu pegar o values para poder pegar uma posição ele vai me retornar aqui um array pegar a posição 0.spot.size size ali eu poderia pegar aqui os spots ou a seção pegar aqui em cima para poder ficar melhor melhor. Aí aqui embaixo fica mais simples. O melhor aqui é section. Então nós temos 100. Está aprovado aqui pelo nosso teste. Então olha a regra de negócio que a gente criou, adicionar sessão, que vai criar a sessão e criar os spots. Ah, mas é questão de modificação, eu tenho que modificar lá os spots, eu posso adicionar regras de negócio menores. E essas regras de negócio depois vão ser combinadas. Então essas regras de negócio aqui, elas podem não fazer muito sentido, porque a gente está imaginando o todo. Mas regras de negócio não significa que elas vão contemplar justamente, a gente está imaginando o todo. Mas regras de negócio não significa que elas vão contemplar, justamente a gente relaciona muito com a interface de usuário. Eu posso ter essas regras de negócio, como se eu tivesse várias opções de manipular aquele agregado. Eu posso combinar essas regras de negócio numa camada mais exterior para satisfazer as necessidades de usuário. Então, lembre-se dos conceitos do Solid. O método deve fazer uma operação que tenha uma responsabilidade, que faça sentido, que eu não quero fazer o mundo inteiro. A gente vai até falar na próxima aula sobre os outros campos que a gente poderia modificar, inclusive até do próprio partner. Então, é justamente você começar a se vacinar. Imaginar, se eu estou adicionando a sessão ali, eu posso adicionar uma sessão e ter outra operação para poder mudar alguma informação. Quando você tem operações menores, mais concisas, fica mais fácil para poder testar e para poder manter. Se você fica mudando um monte de coisa, quer fazer tudo, até na hora do seu teste fica mais complicado, porque aqui a gente só tem que se preocupar com o tamanho dos sets, de sections e dos spots, e verificar algumas informações só. E aí eu tenho outros métodos lá que vão fazer as modificações específicas. Então, pessoal, vamos continuar nossa saga. É isso aí. E até a próxima.