Salves beleza os carros na área e o assunto de hoje é polêmico nós vamos falar sobre o tão Popular tão famoso crude a mentalidade do crude pode nos levar a construir sistemas ruins ela corrompe ela corrói a nossa visão para construção de bons softwares levando a construção de softwares engessados difícil de refaturar e caro ao longo do tempo e aí vai causar aquela velha sensação que a solução disso vai ser construir um novo software e aí você vai construir esse novo software pensando que a solução é agregar o Framework com a versão tal com as
libras Tais com a última versão da linguagem de programação quando o desenho do seu software está errado e o crude tem um impacto enorme nisso tá pessoal considere se inscrever no canal ativando o Sininho das notificações isso ajuda a continuar ainda mais o canal fool saiko a gente ultrapassou aí 100 mil inscritos e cada vez mais a gente tá levando a gente quer levar esse conteúdo de qualidade para vocês e também deixa aquele like porque o YouTube expande para mais pessoas Maravilha nós temos também um MBA em arquitetura Full Circle que forma profissionais para poder
arquitetar aplicações de grande porte aplicações sustentáveis dá uma visão de alto nível de como que você entrega soluções de valor para as empresas que tá totalmente relacionado com que a gente vai falar aqui hoje no vídeo Então tem um link aí na descrição se você se interessar só clicar para saber mais informações então roda a vinheta [Música] o termo crudi significa Create read update and The Elite são operações básicas de um sistema de gerenciamento de dados o termo foi popularizado pelo livro manage in the dedeira base de autoria de James Martin neste livro ele descreve
o crude como sendo as operações básicas de um sistema de gerenciamento de dados como grande parte dos sistemas existentes trabalham com banco de dados desenvolvedores framex e linguagens de programação acabaram adotando o termo crude para descrever as operações básicas de um sistema isso pode representar um problema para o software pois ele pode fazer muito mais do que apenas gerenciar armazenamento de dados o domínio as regras de negócio podem ser o que o software mais tem que se preocupar pode ser o que vale ouro para o software o Storage usa o RMS os bancos de dados
gerenciam o armazenamento e a recuperação de dados eu vou te mostrar como que o crude corrompe a nossa visão em desenho de software vamos supor que apareceu uma demanda de um sistema de gerenciamento de projetos e aqui estão os casos de uso então eu vou poder criar um projeto com o nome descrição data de início e data de previsão de conclusão desse projeto se no momento que eu for criar foi passado a data de início que não é obrigatória o projeto vai ser marcado como iniciado que nós vamos controlar o estágio desse projeto mas também
depois de um projeto criado que eu não passei a data de início eu posso informar a data de início também ele vai ser marcado como iniciado vou poder finalizar o projeto com a data de fim ou cancelar esse projeto informando a data de cancelamento dentro do projeto tem as tarefas as testes então eu posso adicionar uma nova teste no projeto passando o ID do projeto nome descrição dessa tese a data de início dela e a data de previsão de fim a mesma coisa do projeto na testa se for passar da data de início na criação
dela ela deve ser marcado como iniciada porque também nós vamos controlar o estágio dela eu posso iniciar uma tese que com a data de início finalizar uma testa com a data de fim ou cancelar uma tesc com a data de cancelamento o nosso objetivo aqui com esse sistema é criar uma API Rust que a gente não está se importando aqui com o frontient Mas nós vamos ter ali uma em qualquer linguagem de programação então a princípio pegando ali as boas práticas do resto a gente teria esse esboço 200 points então para poder criar o projeto
eu posso fazer um barra post passando as informações tem ali o resultado e na hora que eu for iniciar um projeto teria dois verbos candidatos para poder fazer esse início poderia passar um um pet um estaria mais ligado a uma atualização completa ali do recurso Então seria melhor usar o pet porque seria representaria uma atualização parcial Então faça um teste para Barra projetos passando a data de início beleza ele me retorna ali os dados do projeto a única coisa que vai ser atualizada aqui vai ser o start poderia ter um status aqui também Ah vou
finalizar o projeto a mesma coisa utiliza um pet mas aí eu mudo a data passando ali no bar pronto tá finalizado Ah vou cancelar um projeto passo aqui no pet eu criei uma aplicação em node para demonstrar esse cenário aqui da nossa aplicação aplicação muito simples construída com Express GS vai ficar aí na descrição já tá aí na descrição para você poder ter acesso a aplicação Express com type RM que é o RM para poder fazer armazenamento em banco de dados aqui não tô preocupado em usar nenhum tipo de Day também tradicional utilizando-se colar de
memória inclusive Então temos aqui o projeto e a tesc aqui o Type RM sendo inicializado E aí nós vamos ter aqui uma camada de serviços para poder fazer uma separação aqui das rotas do Express para a gente não colocar a regra de negócio diretamente Então aqui estão descritos algumas das operações que nós temos ali posso pegar todos os projetos cadastrar um novo projeto olha aqui ó pegar o projeto tá pegando aqui um find All da nossa camada de serviços que recebe um repositório né repositório aqui do próprio Type RM que ele tem esse conceito lá
dentro então pega todos Ah eu quero criar então do Borel recebo o nome desse scription ou o Ford Casting at que não é obrigatório também e passo aqui para poder fazer a criação e Retorna ali o Jason e aqui está concentrado todas as nossas operações ali de iniciar de finalizar de cancelar e também nós vamos Claro poder mudar as informações ali do projeto às vezes eu cadastrei econômico acrescentar alguma coisa no nome ou na descrição então a gente acabaria Inclusive eu falei ali do Pet então coloquei aqui na verdade aqui é Pet né Inclusive eu
vou até mudar esse ponto aqui dentro dos meus arquivos que agora que eu fui perceber isso pronto então eu posso receber aqui as informações e a gente vai passando essas informações para camada de serviços você começa a ver aqui que nós temos muita coisa concentrada dentro do Pet Porque Nós aprendemos que no rest nós temos um recurso que nesse caso é um barra projects e a gente deve trocar o verbo poder trocar a operação poxa se eu estou querendo finalizar um projeto eu estou querendo finalizar um projeto cancelar ou iniciar não tô querendo dar atualizar
Então já nos remete a ligação Ao Verbo Pet ou se eu tivesse utilizando Pet aqui não ia ter nenhum crime também mas a questão é que a gente acabaria formando dessa forma porque o nosso pensamento não foi na operação de negócio foi exatamente lá no armazenamento com o banco de dados então no restin já teve essa influência de forçar essa sobrecarga em cima do Pet também acaba tendo uma influência na camada de serviços porque se eu estou recebendo todos esses dados então vou fazer um update Então esse serviço que está aqui e vai acabar tendo
um update que vai receber o ID do projeto e todas as propriedades Ah beleza Consultei o meu projeto Vou ver aqui se as informações que não tem muitas regras envolvidas ali que é o nome a descrição e a data de previsão aqui de término as células forem passadas a gente vai acabar fazendo ali o sete no nosso objeto consultado e agora vem o start do projeto ou completar dele ou cancelar passei a data de início tem as minhas regras de negócio envolvidas aqui e o status já estiver ativo do meu projeto então eu não posso
iniciar algo que já tá ativado se ele já tiver finalizado completado não posso também completar se ele já tiver cancelado também eu não posso iniciar verifiquei tudo isso então coloca a data e mudo o status dele a mesma coisa serve para o cancelamento verifique se ele não está finalizado se ele já não está cancelado e se a data de cancelamento for menor que a data de início não pode também caso contrário a gente vai lá faz atribuição da data e coloca o status como cancelado e aqui serve também para a gente poder ver se tem
alguma teste que ativa ou pendente porque a gente vai cancelar essas peças envolvidas né é uma regra de negócio importante também e é para finalizar a mesma história então você vê aqui que no final das contas Aconteceu tudo isso e teve um save a tendência é que esse estágio desse projeto sofra novas necessidades você vai ter que fazer mudanças aqui e olha só a influência do crude porque eu não tô pensando em termos as respostas o segredo a gente desenvolver um bom software já está na própria descrição dele mas aí a gente fica preso exatamente
porque a gente acha que tem que fazer ali o pet não só não posso ter alguma outra coisa eu tenho que ter realmente um pet para poder descrever essas operações é claro que a gente poderia tomar outras providências em termos lá na camada de serviço para poder melhorar mas aqui no pet já é um code Mel imagina na hora que você vai testar né você vai criar aqui um arquivo de testes se é um teste de integração você vai criar assim teste deve iniciar aí você vai ter seu Project serve serve-se da camada de serviços
aqui a gente recebe um repositório mas aí eu vou ter o que aqui update passando o id o Project e a data de início se eu for testar o finalizar que que vai mudar aqui né mas quando a gente começa a olhar para o teste isso que representa uma anemia das regras de negócio e ao longo e a longo prazo você vai começar a ter medo de mexer nesse update que ele vai ter tanta regra você não vai querer mexer mais nele Ele tem muita responsabilidade e não é a questão somente dele e ter muita
responsabilidade mas esse update já é a influência exatamente que você tá pensando lá no update do banco e não em regra de negócio que é o que é mais importante para isso aqui se a gente pensasse em domínio em ter um modelo mais rico as operações estariam Claras estarão mais segmentadas mais fáceis e até mesmo vai acabar tendo uma influência no próprio rest a gente vai ter uma modelagem para permitir que já no rest fique claro as operações que tem que ser feitas em cima desse projeto aqui eu quero mostrar um trecho da tese de
doutorado do royfielding que é o criador desse resto para mostrar como que a nossa visão em termos do resource ela está realmente pautada totalmente influenciada pelo crude aqui nesse capítulo 5.2 ele vai falar dos elementos da arquitetura rest e ele vai falar que a chave aqui do rest é assim qualquer informação pode ser nomeada como recurso um documento uma imagem um serviço temporal qual Como que tá o tempo hoje em Los Angeles uma coleção de outros recursos um objeto não virtual por exemplo uma pessoa entre outras palavras né Qualquer conceito que a gente quer representar
como um recurso tá então essa ideia que a gente tem que eu tenho que ter um recurso Barra projects E aí nós temos que usar os verbos para poder mudar a operação ela não é incorreta O problema é que a gente acaba levando isso ao pé da letra a gente acaba achando que sempre quando eu vou fazer e a gente tá falando aqui principalmente de operações que vão causar mudanças que vão escrever em disco aqui a gente acha que sempre o post e o tem que chamar que o recurso com esse nome se eu colocar
qualquer outra coisa aqui está incorreto e não a gente viu ali que o recurso Ele não precisa ser engessado dessa maneira eu poderia muito bem aqui na criação tá claro que o post representa muito bem essa intenção da nossa regra de negócio mas na hora de fazer aqui no caso Pet né que é toda hora que eu tô usando o se eu quiser fazer um start do projeto porque não colocar um start para representar o início ou o finish para poder indicar que eu vou finalizar esse projeto ou o cancel para poder cancelar isso aqui
representa muito melhor aí eu poderia usar o pet aqui não poderia usar um post não tem problema tá Eu estou falando que eu estou criando ou acessando ação de iniciar o post aqui seria mais semântico mas se você usar o pet aqui não tem problema nenhum a questão é que quando a gente olha para o recurso tá claro que eu estou fazendo uma operação em cima do recurso de Project o que a gente não queria lá atrás era justamente porque algumas pessoas colocavam na verdade assim algumas pessoas não não tinha assim um padrão Aí colocava
assim post e criar post cliente isso aqui é muito redundante que é o verbo já tá indicando a própria operação mas a gente já tá falando aqui de um outro nível de representação dessa informação a gente vai ver agora um novo desenho como que isso vai mudar a nossa história eu vou acabar duplicando essa pastinha aqui com esse inclusive se você quiser testar essa peia que eu coloquei um http extensão muito legal para poder fazer requisições http tá tudo em memória com o node mom inclusive Como que é o scrips que eu coloquei aqui que
é um crude né então se eu fizer um crude aqui dessa forma eu consigo pegar os meus projetos e para mostrar que o vazio eu consigo criar também eu consigo iniciar um projeto que é esse aqui ó passou a data de início ali enfim mas eu não quero tirar isso aqui para a gente sempre lembrar dessa modelagem que tá ali totalmente influenciada pelo crood e aqui vamos colocar uma linguagem rica então aqui eu vou ter esses mesmos arquivos tá então aqui ao invés da gente fazer esse Pet diretamente aí eu poderia deixar esse Pet apenas
para poder passar nome descrição informações mais básicas poderia né então vamos fazer aqui um app Pet passando a nossa operação de start Então vou copiar essa mesma operação daqui a gente pode matar que nem description a data de cancelamento de finalização essa aqui também então a gente só vai passar aqui essa data e esse aqui de cima ficaria apenas a data de previsão nome da descrição e aqui eu Tiraria essas duas Pronto Olha só já deu uma melhorada porque o conceito na representação na intenção de negócio já está bem mais claro agora o que que
eu quero fazer inclusive na hora de uma documentação vai ficar bem melhor e na hora também da gente controlar tratar erros consigo focar aqui somente nos tratamentos de erro em relação ao start E aqui as informações comuns Então a gente vai aplicando para os outros é o que eu tenho o meu finish e que nós vamos ter Infinity at you cancer pronto mesmo ainda que a nossa camada de serviços está com essa ligação com o conceito de crude já demos uma melhorada no software e também isso aqui vai acabar nos beneficiando em questão de testes
quando a gente for testar esse desenho de Points fica muito mais claro até mesmo testar todos os erros que acontecem vamos agora pensar na camada de serviços esse update aqui tá muito ruim também porque ele tá muito concentrado e ele não tem representação ele não tem expressividade ele tá anêmico é update update acontece lá no meu banco de dados Então como que a gente pode melhorar isso aqui Vamos criar as operações de forma separada Então nós vamos ter um start Project vou passar o ID do projeto tal e deu uma sugestão aqui ó compare-te já
sabe como que tem que fazer Qual é a gente que faz né tem o finish e o canson tá então para poder iniciar um projeto vai ser quase isso tudo que a gente tem ali tirando algumas coisinhas na verdade eu tô copiando coisas demais até aqui pronto Então vou copiar essa parte para cá eu não vou ter essa questão aqui de atualização do name the scription e a data de previsão já que eu tenho a White tem que colocar um Aí sim que aqui no final das contas eu tenho que atualizar então meu repositório vai
pegar o meu objeto para poder fazer a atualização lá no banco de dados pronto então aqui eu tirei essa partezinha Deixa eu tirar esse start essa daqui a mesma coisa vai servir para o finish e o cancer vamos ver se o Call Pilot já resolve a nossa vida aqui ó comparativo inteligente porém ele esqueceu da wait como Às vezes eu esqueço também então se eu tiver a data de finalização aqui eu não preciso mais desse IFF na verdade porque eu sei que eu tenho essa data de finalização né então Vamos tornar isso aqui mais simples
tá não tá legal também eu posso ter somente os dois parâmetros né então eu tiro esses dois próprios daqui só que na data de finalização também a mesma coisa esse bolinho aqui também eu sei que eu vou receber ele ou no mínimo a gente teria algum tipo de validação aqui ficou bem mais simples e por último a data de cancelamento Qual o pallet não quer me ajudar Então vamos pegar aqui de cima essa parte que o de cancelar já tem a questão da gente Inclusive acho que o finish ele não colocou eu vou ter que
copiar de novo também que tem a questão de finalizar as testes que estão em aberto então aqui eu tiro essa partezinha onde está a própolis vai sair aqui também eu não posso esquecer de salvar e essa chave aqui não tem mais e aqui no finish eu tenho essa parte que a gente vai copiar Antes aqui e atribuir a data e de mudar o status Então aqui tem o próprio beleza e aqui tem Oi Sync agora que que vai virar esse update nosso update vai ficar somente esse trecho aqui então esse esse aqui vai cair fora
Então olha só agora está muito mais diluído nas operações de negócio e está muito mais ligado ali a representação da linguagem que a gente tem nos casos de uso agora dentro do haste nós vamos fazer a mudança então aqui o update vai continuar mas agora para poder fazer o start aqui vai ser start e vou passar a minha data um segundo parâmetro vai continuar sendo essa operação ternária aqui que no caso a gente agora vai sempre receber essa data não tô trabalhando com validação nada do tipo aqui vai ficar bem mais simples olha como que
fica bem mais expressivo agora aqui também tira essa parte tira um no também e a chave que faltou e a vírgula pronto aqui vai ser finge e por último em selamento e aqui ele tá achando por causa de que eu mudei aqui para quem tá mais representativo a minha camada de serviço tá mais representativa a medida que essas operações forem tendo mais necessidades elas estão diluídas eu tenho mais liberdade para poder fazer tratamento de erro e olha lá testes né porque quando eu vou testar tanto o rest quanto aqui a camada de serviços eu vou
testar a operação direta vou me preocupar necessariamente com ela e não tenho o update que não representa as operações de negócio representa de fato só o armazenamento de dados a gente poderia já se dar por satisfeito nisso aqui já estaria interessante porque as nossas regras de negócio estão protegidas aqui com a nossa camada de serviço ela tá muito mais representativa Mas fácil de refaturar mais fácil de crescer mas também a gente pode fazer uma outra melhoria porque olhando para essa questão aqui já eu vou cancelar um projeto ele não pode estar finalizado não pode estar
cancelado verificações de data isso aqui não seriam regras de negócio cruciais do projeto elas deveriam estar na camada de serviço elas poderiam estar dentro da entidade então eu já tenho aqui esse modelo pronto para a gente poder ganhar um pouquinho mais de tempo olha só o que eu vou fazer aqui agora eu vou pegar a as minhas entidades aqui tá tudo disponível para vocês daí já no código fonte tá e eu vou pegar aqui a minha nova camada de serviço eu vou jogar para cima dela então agora quando a gente vai olhar o cancelar inclusive
aqui até o complete aqui eu vou mudar eu tô usando complete aqui eu vou mandar ele para complete e aqui também que eu recebo a data de finalização quando eu quero iniciar o projeto eu consulto mas aí aquela toda aquela if aquelas verificações ela está dentro da minha entidade depois eu salvo quando eu quero cancelar eu consulto faço a operação de cancelar operação de cancelar pode ficar dentro da entidade também é de completar então repositório no final das contas ele tá servindo apenas para poder pegar esse objeto ali do Type RM e armazenar no banco
de dados que que tem dentro desse start aquela mesma representação ela tá dentro da minha própria identidade eu tenho uma modelagem mais rica utilizando o RM não tem problema nenhum eu tenho uma até uma operação para poder criar é criar não é o criar do banco de dados uma quantidade Você tá armazenando em disco a operação para poder gerar um novo projeto qual que é quais dados que eu preciso Às vezes eu não preciso de todos os dados isso aqui é um método inclusive uma Factory metal me ajuda a criar posso também ter operações para
poder fazer mudança nos dados tá inclusive olha só que interessante essa questão do update que tá aqui agora porque aqui dentro de service a gente vai ter update que eu não sou obrigado a receber o name o description e a data de data de previsão de conclusão eu consulto o projeto então se eu tiver as informações eu faço as minhas alterações mas eu joguei tudo lá para dentro Poxa mas isso aqui é um seter Gourmet não porque aqui nós podemos fazer formatações desse valor que representam ali necessidades de negócio a gente pode trabalhar com algum
tipo de evento e veja que eu não tô trabalhando com nada de DDD é estar usando aí um pouco da arquitetura hexagonal Mas não tem problema nenhum eu posso ter aqui um RM e ter as minhas operações de negócio misturado a gente não tem um modelo turista e olha como que agora o nosso serviço ele só orquestra as regras de negócio também eu acrescentei aqui das testes que está Inclusive eu vou até acrescentar o meu novo rest aqui com as teses também e também um piá e htp para você poder brincar aqui com as testos
beleza que você pode fazer aqui ao início colocando que quando se cria inclusive até para nomear essa requisição aqui para não ficar passando o parâmetro ali do you Haiti Mas eu posso iniciar posso completar Posso cancelar posso atualizar as informações mais básicas Mas eu posso adicionar testes e exceto quando eu olho aqui para o resto ele tá representativo quando olha para as minhas rotas também tá muito representativo e a minha camada de serviço está representativa e a minha camada crucial de negócio também tá representativo então a lição que a gente tira aqui dessa aula pessoal
é justamente a questão de como que o pensamento em criar um disco e armazenar corrompe a nossa visão de regras de negócio de solucionar ali o domínio tá processando uma venda fazendo ali o start você tem mais preocupações do que só armazenar você só se preocupar com isso vai fazer você criar nomes de métodos genéricos sem representatividade a colocar muitas coisas dentro de um método e aí que tá um dos pontos principais que leva a gente a criar softwares ruins que a gente vai querer depois reconstruir do zero né que você deveria na verdade pensar
em Salvar esse software que com certeza vai valer muito mais a pena porque o criar do zero aquela história de formatar minha máquina porque ela tá com vírus às vezes tentar recuperar né fazendo sua analogia para que a gente consolize isso né E essa visão de como que a gente vai criar soluções melhores sustentáveis mais representativas que vão gerar valor a gente tem aí no nosso próprio NBA que eu deixei na descrição para vocês tá espero que vocês tenham gostado não deixe de dar um like no vídeo o código fonte está disponível espero também que
essa discussão aqui tenha aberto a sua cabeça que te levem a criar representar melhor a linguagem das regras de negócio no seu software e deixar o crude ali apenas para os RMS apenas para poder fazer o armazenamento das informações Então pessoal é isso aí e até a próxima a gente se vê no próximo vídeo tchau [Música]