Cara, não tem como não entender quando você explica!! Meu Deus!!! Mano, já falei e repito, tu é o mais brabo! Vídeo curto, sem enrolação, didática excelente. Me amarro demais assistindo suas aulas mano!!
Hahahah! valeu demais Milton... Pra semana que vem vou estruturar uma comunidade pra gente no discord ou qualquer rede parecida pra gente trocar uma ideia mais de perto!!!
Tua didática é muito boa, a pouco estou mexendo mais com POO e consegui entender a mudança de estados através da passagem do this e a cada step ele foi chamando os outros objetos, massa demais Renato!
Que top que curtiu@@marcusmliima!!! Esse é um dos padrões mais chatos de se aprender por conta do momento das transições através do this e se tu conseguiu entender de boa pode ter certeza que teu nível já tá bem avançado em POO
@@xikaojr eu até cogitei usar o 8.4 mas como muda bastante a sintaxe na parte de getter e setter poderia confundir a cabeça da galera que ainda não manja e principalmente quem tava replicando em outra linguagem mas tá anotada a dica!!!
Conteúdo muito top!! Veio num momento perfeito pra mim, parabéns! Bacana que mesmo com explicações em PHP (que eu não conheço quase nada) da pra entender facilmente o conceito para Node.js por exemplo.
A intenção é exatamente essa, essa playlist eu poderia fazer em outras linguagens inclusive em Node mas optei por utilizar PHP pra que as pessoas vejam o quanto ele evoluiu ao longo do tempo e que o problema nunca foi a linguagem e sim os próprios programadores que fizeram muita besteira no passado!
Existem algumas formas de fazer isso, a primeira é você criar um método dentro de cada estado que retorne o nome dele no formato de string Ex: toString() ou até mesmo um getName() com isso você já consegue inserir no banco sem dificuldades só vai precisar de uma lógicazinha na hora de recuperar os dados do banco e hidratar os objetos, agora se você estiver usando um framework fica simples pq basta você configurar seu ORM mas como cada ORM em cada framework tem configurações específicas fica difícil acertar aqui de cabeça dai te digo que uma rápida pesquisa e tu já consegue desenrolar inclusive eu já fiz essa implementação usando o Doctrine que é o ORM do symfony.. Essa semana agora vou aprontar um grupo pra os inscritos no discord ou telegram aí a gente troca essa ideia mais de perto e fica mais simples de passar esses truques
Excelente conteúdo, mas apareceu uma dúvida: esse padrão pode ser aplicado para um objeto persistente, por exemplo um projeto? Porque me parece fácil persistir ele em uma base de dados mas pra recuperar parece inevitável criar um switch para poder transformar o dado persistido no objeto correspondente ao estado.
@@jfbarkokebas1902 excelente pergunta!!! Se você tiver utilizando algum ORM da pra configurar o ORM pra fazer esse trabalho automático pra ti pelomenos todos os ORMs que ja utilizei com esse pattern fornecem uma forma de configurar! Se nao estiver utilizando um ORM tem algumas formas de fazer isso como por exemplo criar uma propriedade no estado que seja o nome dele mesmo formatado pra string daí você adiciona a primary key da tabela de estados no banco como o nome do próprio estado ao invés do ID, com isso tu já consegue fazer a busca dele no banco pelo próprio nome... existem outras formas, tendo um tempo vou gravar um vídeo sobre isso, talvez um state parte 2, pq vi que tem uma galera que levantou os mesmos questionamentos!!
Fala Gustavo!! Não infringe não, acredito que vc esteja perguntando isso por conta do estado receber o Pedido certo?! Se for isso pode ficar tranquilo, em alguns momentos certos acoplamentos são necessários e outra, todos os patterns em algum momento tem pontos de desvantagens e alguns sim chegam a ferir alguns pontos do SOLID enquanto resolvem outros. Vou trazer conteúdo falando sobre isso também
Uma dúvida, isso não fere o "S" do SOLID? Pois, supondo que eu tenha um outro estado como "Devolução a loja", eu teria que alterar o código nos outros 3 arquivos de estado + criar um novo arquivo pro novo estado? PS: Sua didática é excelente
Fala Wallison, não tem problemas se caso surgir mais um estado e você modificar alguma coisa ou outra, repara que isso afeta somente como o estado de um pedido se comporta então tá tudo bem, no final das contas a gente sempre vai acabar em algum momento ou outro infringindo o SOLID, a sacada tá em saber quando fazer isso ou não... eu vou preparar um conteúdo essa semana falando sobre isso. E valeu pelo feedback posítivo!!
Chain of Responsibility se encaixaria melhor nesse exemplo, não curti muito o fato de cada estado implementar todos os métodos e ficar lançando exceções nos métodos não usáveis. Ótimo vídeo!
Chain Of Responsibility funciona como um middleware pra controlar uma cadeia de fluxo que precisa acontecer e tem uma ordem estabelecida, o State é pra transição dos Estados de um objeto o chain não caberia aqui pois seria muita complexidade pra transitar os estados e o chain só anda pra frente, se eu tivesse um estado CANCELADO por exemplo ja nao seria mais possivel implementar o chain pq qualquer estado poderia pular direto pra CANCELADO nao sendo necessario respeitar a ordem. Quanto aos métodos implementados e lançamento de exceções é simples de resolver, basta trocar a interface por uma classe abstrata e nela já implementar todos os métodos lançando exceções e dai cada estado apenas sobrescreve o método do estado ao qual pode transitar. Essa variação também é aceita no GOF mas preferi seguir o exemplo tradicional msm
@@thevocoder hahaha! Cara que bom que curtiu o vídeo... inclusive se você conseguiu se sentir confortável no vídeo é sinal de que você já está bem avançado!!
@@JhonathasCavalcante infelizmente esse é um dos problemas do state, ele precisa desse método setter, não tem pra onde fugir, até o próprio refactoring guru também força o uso dele. Um ponto que sempre deixo claro é que padrões de projeto também possuem defeitos, existem outras formas de implementar o state como utilizar herança ao invés de interfaces mas ainda assim o método setter permaneceria público
@RenatoAugustoTech sim, talvez uma forma de contornar seria com meta programação usando reflection, mas aí acho que aumentaria a complexidade e dificultaria a explicação. A ideia de classes abstratas também é uma boa, de qualquer modo, parabéns pelo conteúdo
@@JhonathasCavalcante haha!! valeu demais!! Sim quanto a usar reflexão é uma saída inteligente porém tem algumas linguagens que não dão suporte então ficaria sim bem mais complexo de explicar principalmente pra galera que tá iniciando mas tu fez uma pontuação extremamente válida, muito bom mesmo! E vem mais conteúdos por aí fica ligado!!!
basicamente você pode implementar um método getName ou toString em cada estado e retornar o nome de cada um deles formatado pra string, com esse valor você salva no banco inclusive pode até colocar a primary key como o nome do estado na tabela do banco ao invés do ID. Tem várias outras alternativas pra fazer isso e vai depender do cenário Ex: se você estiver usando um framework que dá suporte a entidades e repositórios você consegue com uma simples configuração fazer isso também.
Excelente conteúdo, mas minha dúvida é em como persistir isso no banco de dados? Posso identificar cada estado com integer, utilizando algum tipo de __toString() pra retornar o valor e salvar no banco de dados?
@@WilliamNovasky eu respondi essa mesma pergunta abaixo William mas tu já matou!! É exatamente isso que vc falou, a única coisa que eu faria de diferente é que ao invés de representar cada estado com um integer eu faria com que a chave primária da tabela de estados não fosse o ID e sim o próprio nome do estado... então no tostring eu retornaria o nome do estado formatado pra string e armazenaria no banco, porém é totalmente válido vc usar o integer. Tu foi sagaz na solução hahah!!
@@RenatoAugustoTech Ahh que legal Renato. E nesse caso eu ainda poderia usar os "novos" ENUMS do PHP, correto? Cara, adoraria um vídeo sobre ENUMS pra entender melhor isso, caso vc tenha interesse em explorar melhor isso. Eu costumo usar arrays para controlar States e sempre tem chance de dar muita caquinha
Fala Felipe!! Eu uso o phpstorm, excelente IDE e se você estiver usando qualquer outra linguagem diferente do PHP dá uma olhada no site da jetbrains, eles tem IDE pra qualquer tipo de linguagem
Hoje foi um dia bastante corrido e como já tinha fechado uma semana do último vídeo decidi por postar hoje tarde pra não perder o timing, mas valeu demais pela dica!!
“Vc é doido?” 😂😂😂
Parabéns pelo conteúdo meu querido!
Cara, não tem como não entender quando você explica!! Meu Deus!!! Mano, já falei e repito, tu é o mais brabo! Vídeo curto, sem enrolação, didática excelente. Me amarro demais assistindo suas aulas mano!!
Hahahah! valeu demais Milton... Pra semana que vem vou estruturar uma comunidade pra gente no discord ou qualquer rede parecida pra gente trocar uma ideia mais de perto!!!
Cara seus videos sao simplesmente perfeitos pqp claro e objetivo, parabens mano.
Valeu Ricardo TMJ!!
Parabéns pelo conteúdo, didática absurda, maratonando os videos do canal 😅
Valeu Gabriel!! Tmj e qualquer dúvida larga aí nos comentários!!
Top🎉 simplesmente sensacional 🎉
Valeu Douglas tmj!!
Uma das formas mais simples e didáticas que já vi de apresentar um conceito.
Valeu pelo feedback@@vando2p0 tmj!!
Tua didática é muito boa, a pouco estou mexendo mais com POO e consegui entender a mudança de estados através da passagem do this e a cada step ele foi chamando os outros objetos, massa demais Renato!
Que top que curtiu@@marcusmliima!!! Esse é um dos padrões mais chatos de se aprender por conta do momento das transições através do this e se tu conseguiu entender de boa pode ter certeza que teu nível já tá bem avançado em POO
Fala Renato, achei o seu canal agora.. muito bom ... estou começando agora no mundo da programação. Obrigado pelo vídeo e vida longa ao Canal.
Fala @@nilsonnogueira3817 !! Que top que curtiu os conteúdos!! Fica ligado que essa semana vai sair video pra quem tá iniciando!!
Sua didática é excelente, continue nos ensinando pvf ...
Valeu pelo feedback e deixa comigo!! Já estão vindo mais conteúdos por aí!!
@Renato Augusto, tem que regravar com o php 8.4 já utilizando os novos estados e get,setters. Top!
@@xikaojr eu até cogitei usar o 8.4 mas como muda bastante a sintaxe na parte de getter e setter poderia confundir a cabeça da galera que ainda não manja e principalmente quem tava replicando em outra linguagem mas tá anotada a dica!!!
Conteúdo muito top!! Veio num momento perfeito pra mim, parabéns! Bacana que mesmo com explicações em PHP (que eu não conheço quase nada) da pra entender facilmente o conceito para Node.js por exemplo.
A intenção é exatamente essa, essa playlist eu poderia fazer em outras linguagens inclusive em Node mas optei por utilizar PHP pra que as pessoas vejam o quanto ele evoluiu ao longo do tempo e que o problema nunca foi a linguagem e sim os próprios programadores que fizeram muita besteira no passado!
Excelente conteúdo!!
Muito bommm o vídeo, só fiquei em dúvida sobre implementação do banco de dados, como salvaria e atualizaria cada estado!?
Existem algumas formas de fazer isso, a primeira é você criar um método dentro de cada estado que retorne o nome dele no formato de string Ex: toString() ou até mesmo um getName() com isso você já consegue inserir no banco sem dificuldades só vai precisar de uma lógicazinha na hora de recuperar os dados do banco e hidratar os objetos, agora se você estiver usando um framework fica simples pq basta você configurar seu ORM mas como cada ORM em cada framework tem configurações específicas fica difícil acertar aqui de cabeça dai te digo que uma rápida pesquisa e tu já consegue desenrolar inclusive eu já fiz essa implementação usando o Doctrine que é o ORM do symfony..
Essa semana agora vou aprontar um grupo pra os inscritos no discord ou telegram aí a gente troca essa ideia mais de perto e fica mais simples de passar esses truques
@@RenatoAugustoTech Como faço para entrar no canal e no servidor?
didática incrível. Valeu, monstro
Valeu demais @@dharyelsantoshonorio5890!! tmj
Muito didático! Parabéns e obrigado Renato.
Valeu Rafa, tmj!
Me ajudou bastante sua explicação, muito obrigado irmão.
Tmj Douglas e valeu pelo feedback!!!
Esse padrão é muito bom!!
Excelente conteúdo, mas apareceu uma dúvida: esse padrão pode ser aplicado para um objeto persistente, por exemplo um projeto? Porque me parece fácil persistir ele em uma base de dados mas pra recuperar parece inevitável criar um switch para poder transformar o dado persistido no objeto correspondente ao estado.
@@jfbarkokebas1902 excelente pergunta!!! Se você tiver utilizando algum ORM da pra configurar o ORM pra fazer esse trabalho automático pra ti pelomenos todos os ORMs que ja utilizei com esse pattern fornecem uma forma de configurar! Se nao estiver utilizando um ORM tem algumas formas de fazer isso como por exemplo criar uma propriedade no estado que seja o nome dele mesmo formatado pra string daí você adiciona a primary key da tabela de estados no banco como o nome do próprio estado ao invés do ID, com isso tu já consegue fazer a busca dele no banco pelo próprio nome... existem outras formas, tendo um tempo vou gravar um vídeo sobre isso, talvez um state parte 2, pq vi que tem uma galera que levantou os mesmos questionamentos!!
já conhecia esse padrão, acho super interessante, porém agora assistindo o vídeo e pensando, ele não inflinge o I do SOLID?
Fala Gustavo!! Não infringe não, acredito que vc esteja perguntando isso por conta do estado receber o Pedido certo?! Se for isso pode ficar tranquilo, em alguns momentos certos acoplamentos são necessários e outra, todos os patterns em algum momento tem pontos de desvantagens e alguns sim chegam a ferir alguns pontos do SOLID enquanto resolvem outros. Vou trazer conteúdo falando sobre isso também
Muito bom seus vídeos
Valeu pelo feedback@@arozendojr !!
Uma dúvida, isso não fere o "S" do SOLID? Pois, supondo que eu tenha um outro estado como "Devolução a loja", eu teria que alterar o código nos outros 3 arquivos de estado + criar um novo arquivo pro novo estado?
PS: Sua didática é excelente
Fala Wallison, não tem problemas se caso surgir mais um estado e você modificar alguma coisa ou outra, repara que isso afeta somente como o estado de um pedido se comporta então tá tudo bem, no final das contas a gente sempre vai acabar em algum momento ou outro infringindo o SOLID, a sacada tá em saber quando fazer isso ou não... eu vou preparar um conteúdo essa semana falando sobre isso. E valeu pelo feedback posítivo!!
Top demais!
@@ediponascimento532 prepara que tá vindo mais conteúdos por aí!!!
Chain of Responsibility se encaixaria melhor nesse exemplo, não curti muito o fato de cada estado implementar todos os métodos e ficar lançando exceções nos métodos não usáveis. Ótimo vídeo!
Chain Of Responsibility funciona como um middleware pra controlar uma cadeia de fluxo que precisa acontecer e tem uma ordem estabelecida, o State é pra transição dos Estados de um objeto o chain não caberia aqui pois seria muita complexidade pra transitar os estados e o chain só anda pra frente, se eu tivesse um estado CANCELADO por exemplo ja nao seria mais possivel implementar o chain pq qualquer estado poderia pular direto pra CANCELADO nao sendo necessario respeitar a ordem. Quanto aos métodos implementados e lançamento de exceções é simples de resolver, basta trocar a interface por uma classe abstrata e nela já implementar todos os métodos lançando exceções e dai cada estado apenas sobrescreve o método do estado ao qual pode transitar. Essa variação também é aceita no GOF mas preferi seguir o exemplo tradicional msm
Po, se tu continuar com esses vídeos eu vou a sênior em 2 meses 😅
@@thevocoder hahaha! Cara que bom que curtiu o vídeo... inclusive se você conseguiu se sentir confortável no vídeo é sinal de que você já está bem avançado!!
Top o vídeo, só uma observação, você deixou um método público setEstado, dessa forma, ainda daria pra burlar as regras de negócio
@@JhonathasCavalcante infelizmente esse é um dos problemas do state, ele precisa desse método setter, não tem pra onde fugir, até o próprio refactoring guru também força o uso dele. Um ponto que sempre deixo claro é que padrões de projeto também possuem defeitos, existem outras formas de implementar o state como utilizar herança ao invés de interfaces mas ainda assim o método setter permaneceria público
@RenatoAugustoTech sim, talvez uma forma de contornar seria com meta programação usando reflection, mas aí acho que aumentaria a complexidade e dificultaria a explicação. A ideia de classes abstratas também é uma boa, de qualquer modo, parabéns pelo conteúdo
@@JhonathasCavalcante haha!! valeu demais!! Sim quanto a usar reflexão é uma saída inteligente porém tem algumas linguagens que não dão suporte então ficaria sim bem mais complexo de explicar principalmente pra galera que tá iniciando mas tu fez uma pontuação extremamente válida, muito bom mesmo! E vem mais conteúdos por aí fica ligado!!!
@RenatoAugustoTech tamo junto, já me inscrevi no canal, é nozes
Como seria a recuperação desses estados no banco de dados?
basicamente você pode implementar um método getName ou toString em cada estado e retornar o nome de cada um deles formatado pra string, com esse valor você salva no banco inclusive pode até colocar a primary key como o nome do estado na tabela do banco ao invés do ID. Tem várias outras alternativas pra fazer isso e vai depender do cenário Ex: se você estiver usando um framework que dá suporte a entidades e repositórios você consegue com uma simples configuração fazer isso também.
Excelente conteúdo, mas minha dúvida é em como persistir isso no banco de dados? Posso identificar cada estado com integer, utilizando algum tipo de __toString() pra retornar o valor e salvar no banco de dados?
@@WilliamNovasky eu respondi essa mesma pergunta abaixo William mas tu já matou!! É exatamente isso que vc falou, a única coisa que eu faria de diferente é que ao invés de representar cada estado com um integer eu faria com que a chave primária da tabela de estados não fosse o ID e sim o próprio nome do estado... então no tostring eu retornaria o nome do estado formatado pra string e armazenaria no banco, porém é totalmente válido vc usar o integer. Tu foi sagaz na solução hahah!!
@@RenatoAugustoTech Ahh que legal Renato. E nesse caso eu ainda poderia usar os "novos" ENUMS do PHP, correto? Cara, adoraria um vídeo sobre ENUMS pra entender melhor isso, caso vc tenha interesse em explorar melhor isso. Eu costumo usar arrays para controlar States e sempre tem chance de dar muita caquinha
Qual IDE você usa?
Fala Felipe!! Eu uso o phpstorm, excelente IDE e se você estiver usando qualquer outra linguagem diferente do PHP dá uma olhada no site da jetbrains, eles tem IDE pra qualquer tipo de linguagem
PHP storm
Eu jurava que tinha respondido mas valeeu @bdexterholland !!!
@@RenatoAugustoTech tinha sim, a interface do RUclips no cel que só mostrou que havia resposta depois que eu respondi
Fala meu querido, só uma dica: posta os vídeos em horário 'comercial', fora de horário não é muito interessante...
Hoje foi um dia bastante corrido e como já tinha fechado uma semana do último vídeo decidi por postar hoje tarde pra não perder o timing, mas valeu demais pela dica!!