Salve, beleza? Continuamos essa saga aqui no Domain Dreaming Design. Agora vamos falar sobre objetos de valores. Vocês lembram lá atrás que, nos quesitos do design tático, eu tinha até esquecido o item objetos de valor, acrescentei depois. Eu fiquei, poxa, faltou aqui objetos de valores. E não foi proposital é justamente o que o Valgvernon fala no Redbook, ele começa abrindo o capítulo de objetos de valores, falando, isso eu nunca esqueci que objetos de valores é o ponto mais subestimado do DDD as pessoas menosprezam acham que ele não tem o seu devido valor. Mas se a gente desse mais atenção para objetos de valores, a nossa modelagem com o DDD seria melhor. Vamos pegar aqui o caso da própria pessoa. Pessoa seria um bom caso para que a gente pudesse olhar aqui o objeto de valor. Dentro de pessoa, nós definimos que CPF é a identidade dele ali. E pensando em termos de linguagem de programação, qual seria a primeira coisa que a gente chega lá no CPF? no cpf. Qual seria a primeira situação que a gente faria em termos de tipar esse cpf aqui? Chegaria lá e falaria assim, estou usando aqui um pouco a anotação do TypeScript, falaria que ele é uma string. Beleza, então aqui eu falei que para criar essa pessoa eu tenho que passar um cpf que também é uma string. E o bom que ele não me deixa clicar aqui então eu tenho que passar uma string aqui a princípio não está ok mas vamos pensar que string define de fato o valor cpf ele define de fato o valor CPF, ele define de forma muito pobre. Justamente, depois que eu olhei também, eu coloquei pessoa rica, virou aqui um meio que... um trocadilho. Ele define de forma muito pobre, porque o CPF vai muito mais além do que só uma string em si. Ele vai envolver ali que a gente faça a validação dos dígitos verificadores, tem também outras validações que precisam ser feitas, porque o CPF não pode ter todos os números iguais, não pode ser tudo zerado, não pode ser tudo 1 e etc. Então, tem certas coisas que a gente teria que fazer. Então, nesse caso, quando eu atribuiria esse CPF a essa pessoa aqui, dentro desse método criar, eu teria que validar isso dentro da pessoa. E pensando em reuso desse CPF em outros lugares, eu teria que replicar essa validação. Não que às vezes eu duplicasse e poderia colocar em uma classe, mas isso vai sendo contaminado, sendo que nós não abstraímos desse valor. E se, na verdade, ao invés de a gente ter essa string, o CPF não fosse um novo objeto. Então eu tenho lá uma sequência de nove números apenas simbólicos. Então esse aqui é o meu objeto de valor que para poder criar esse objeto eu faria ali todas as validações, então ele poderia ser uma classe independente na minha aplicação, inclusive sendo usada para poder estabelecer a identidade do meu CPF. Uma classe pessoa. Poderia ser usada em outros lugares também. Na hora de criar essa pessoa, posso receber string e crio ali o objeto. Eu sei que se acontecer qualquer erro, simplesmente, se eu tiver um erro, ele vai lançar uma exceção. Lançar erro. Sim. O CPF foi inválido. Eu abstraí o comportamento desse valor. Ele não é uma entidade, ele não é algo que eu queira ver a mutação ao longo do tempo. Ele é apenas um valor, mas um valor mais complexo. Então, na hora que a pessoa vai criar esse CPF, ela criou lá e sabe que se tiver qualquer problema, vai lançar um erro, vai quebrar o processamento. Ou, de qualquer forma, se não for lançar um erro, a gente teria como identificar se o CPF está inválido ou não. Eu posso reusar esse objeto de valor em outros lugares. É claro que nessa entidade aqui, a gente não trocaria a identidade que é o próprio CPF, que o CPF é a própria ID. Mas quando eu tenho um objeto de valor, pode ser o peso, imagina que eu tenho ali o peso. Pensando também da mesma forma, peso, um número ponto flutuante poderia ser suficiente. Talvez um número inteiro, a gente não quer trabalhar com ponto flutuante, mas eu teria que verificar se ele é maior do que zero, poderia fazer outras verificações também. Aí quando eu precisasse mudar esse peso, vai que eu tenho lá uma operação de mudar peso da pessoa. Então eu posso receber aqui o peso de mudar peso da pessoa. Então, eu posso receber aqui o peso, que já é do tipo peso. Então, eu não chego aqui e faço assim, ó. Despeso ponto valor, porque acaba sendo um objeto, é igual ao peso.valor. Não. Eu só chego aqui e falo que o despeso é igual ao peso. Quando eu altero um objeto de valor, eu não altero as informações que podem ter dentro dele. Se uma pessoa tem um endereço, esse endereço pode ser também um objeto de valor, só que seria um objeto de valor, se eu quero que o endereço seja um objeto de valor, ele vai ser um pouco mais complexo, porque eu tenho o logradouro. Além disso, sei lá, bairro, cidade, enfim, eu tenho várias dessas informações aqui. Então, dentro da pessoa, eu tenho o endereço, que é do tipo endereço. E aí não existe essa situação de eu estou trocando o bairro ou a cidade. Não, você está trocando o endereço inteiro. Então, quando a gente vai mudar esse endereço, também é a mesma história. A gente vai mudar o endereço. Você vai receber aqui a instância de endereço. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Um objeto de valor é imutável. Então, se eu for mudar um endereço, eu não pego aquele endereço que já está armazenado aqui e fico mudando. Não. É um novo objeto que vai substituir aquele antigo. Por quê? Porque um objeto de valor é igual ao outro se todas as informações que estão dentro desse objeto de valor forem iguais a do outro. Então, esse endereço aqui é igual a do outro somente se logador, bairro e cidade forem iguais. o outro somente se logador, bairro e cidade forem iguais. Então, aqui nesse mudar endereço, eu estou recebendo esse novo endereço aqui, eu posso fazer uma comparação. Não, espera aí. Estou tentando mudar o endereço ali, mas é igual. Então, não vou mudar esse valor. Por objeto de valor ser imutável, ou seja, se você criou ele, está criado, e se vai mudar, você gera um novo objeto de valor, essa imutabilidade nos faz livrar daqueles efeitos colaterais que uma entidade normalmente tem. Por quê? Uma entidade vai sofrer alterações aqui nas suas informações que vão causar efeitos que são um pouco nefastos no sistema, ou são difíceis de testar, vai causar mudança de comportamento. O objeto de valor não muda, então é fácil de testar, é fácil de fazer a validação. Ah, mas e se por algum acaso eu estiver no mesmo bairro, na mesma cidade, mas mudou somente o logradouro? Você pode ter um método estático lá dentro do seu objeto de valor, que é mudar logradouro, não tem problema nenhum. Aí você vai receber aqui a rua. Então, isso aqui devolve um novo objeto. Você reúsa os valores que são iguais. Recebeu rua, então ele vai fazer lá. rua, então ele vai fazer lá um new endereço passando a rua o de cidade e o de bairro. Tá? É assim que a gente faz. Eu não tenho efeito colateral acontecendo dentro daquele objeto, ele não tem transformação mais. Toda mudança que eu quiser fazer em entidades que têm objetos de valores são novos valores. Então eles são bons porque eles livram desses efeitos colaterais, eles são fáceis de testar e abstraem também essa validação. Então eu posso sair colocando objeto de valor para tudo que eu quiser no meu sistema. Posso. Para data de nascimento, para endereço, posso fazer para tudo. A dosagem vai de acordo com o risco que você tem em tratar aquela informação. Imagina que lidar com o nome, você está tendo muito dessa informação usada através das suas entidades. Então, se a gente tiver um objeto de valor nome, fica fácil para poder abstrair aquele comportamento, controlar aquela situação, evitar que eu tenha diluído determinadas regrinhas para poder lidar com esse nome através das minhas entidades. Pronto, eu abstraí ali no meu objeto de valor. Muitas vezes não é só o reuso. Às vezes você tem uma entidade com alguns campos, um pouco mais complexa, e aí você fica colocando muitas regrinhas dentro da sua entidade e aí você tira essa responsabilidade de lidar com aquele valor e joga ela para o objeto de valor e a entidade só reúsa aquilo. Então, se você cuidar muito bem de objetos de valores e criar os objetos de valores necessários, principalmente para as informações mais complexas, às vezes um pedaço da sua entidade pode virar esse objeto de valor, você consegue separar mais responsabilidades e tornar mais enxuta a sua entidade. Maravilha, pessoal. Então, vamos seguir na nossa saga. É isso aí. E até a próxima.