é bom pessoal voltando aqui pra gente continuar nosso estudo de Solid agora a gente vai falar do discovery substitution principle ou descobre substitutivo principle é e a ideia aqui é a gente mostrar o conceito que fala um pouco sobre a herança né e o quanto a herança pode afetar o nosso código já deve ter ouvido eu falar ele durante o curso aí em algum lugar Talvez um discord' eu isso é lá em alguma alguma webconf sobre o quanto a herança pode ser prejudicial para nós código quando ela é utilizado de maneira inadequada né Nem sempre a herança é a melhor solução E para isso né a gente eu trouxe aqui esse código né que é bem inofensivo no primeiro momento onde a gente ia aplicar a herança e depois a gente vai ver o quanto ela pode influenciar no comportamento do nosso código de maneira negativa tá então a primeira vou explicar para vocês o código aqui né esse aqui é o código que não tem Solid ainda então basicamente nós temos uma conta e você conta bancária é uma classe Super Simples né Tem um saldo e nós temos aqui um gato é para o saldo que a gente quer ver o saldo temos o método depositar método sacar e o método render beleza e a conta normal ela rende 5 porcento Ok até aqui tudo perfeito e aí nós temos uma uma variação na conta né Nós temos a conta premium Oi e a única diferença entre a conta normal para conta premium é que a conta premium rende 10 porcento Beleza então a gente tem uma mudança aqui uma uma um polimorfismo do método render Tudo tranquilo até aqui certo nós temos um código então que queria duas contas né uma conta normal não conta premium depositamos em Reais nós duas queremos uma lista de contas e depois nós fazemos uma string faz um pique para render a conta e depois a gente mostra o saldo da conta vou ver se o que funcionando beleza então conta normal conta premium r$ 5 r$ 10 5 por 110 por cento beleza tudo certo tudo perfeito tudo funcionando até aqui nossa herança atendeu super bem as expectativas nós temos aqui uma conta premium baseado na conter damos os comportamentos Pará tudo lindo tudo maravilhoso conforme manda a os livros né acontece que nós temos um problema aqui eu imaginei né se a gente precisa criar um novo tipo de conta falar assim tem problema nenhum né porque tipo de conta ele vai estender né as socialidades da da conta comum será mesmo que que será que pode acontecer de ruim bom para isso a gente vai lá para o nosso código consolide então eu vim aqui com os códigos consolide e a gente começar meu problema a beleza Tô aqui no nosso código consolide só fazer um verde aqui porque eu acho que alterei algumas coisas de lá Já fechou Oi tá aqui nós código então o que que vai acontecer se eu criar uma nova conta vamos ver vamos dizer que o gerente do banco lá falou o seguinte galera vamos criar agora uma conta Universe da área e Universitário né a gente sabe é tudo uns ferrado né no rende gosta e umas nossas contas é tudo tudo na ralé ali né então quando era Universitário vai levar o que eu abrir a conta né hoje já tem as contas Universitária lá que até legalzinha na minha época não tinha nada disso ele vai estar e ferrada mesmo Então creia que uma conta universitária e a minha conta universitária ela não rende certo mas a gente tem um problema porque porque a conta por si só ela rende elas vão falar assim Putz eu herdei aqui ó eu fiz uma herança né herdei todos esses comportamentos aqui só que a minha conta aniversário ela não rende Então veja só se eu vim aqui e criar mais uma e aqui olha lá conta universitário depositar r$ 100 nela Oi tá bem e adicionar ela aqui e como conta três que que vai acontecer e veja só o rapaz sempre esquece de ser que a gente o Olá rendeu a primeira conta que é uma conta normal entendeu a segunda conta que é uma conta premium e rendeu a terceira conta que ela conta universitária mas a minha conta aniversário ela não deveria render por quê Porque ela não consegue berçário vai estar não tem ganhar dinheiro de graça e vai estar tem que se ferrar E aí que a gente tem que fazer e aqui obviamente né sobre a escrever método Render i i no lugarde fazer algo aqui né O que que seria correto seria lançar mais rápido né E aí E aí e o Prefeito Antônio cobra ó a beleza que que vai acontecer até aqui tudo beleza então você minha conta aniversário ela não Pode render né eu também não posso deixar o método ali vazio porque senão ia ficar um negócio meio bizarro né deixar ali uma uma uma implementação vazia Esse é o que que eu teria que fazer então nosso mais é frio faz sentido né porque se eu chamar o mestre do render da minha conta universitária que não rende E eu simplesmente retornar o método fazer não fazer nada né não faz sentido é um código que escolhe na consisa ele não é coeso né que que vai acontecer mano vai ser pior para deixar claro que a minha conta universitária não rende até aqui perfeito a lógica tá excelente o que acontece é o seguinte e Imaginem agora que a gente tem uma lista de contas do banco e a minha conta três aqui foi a primeira da lista veja só e executei pow aí liga o Stitch réptil conta universitária não rende Ixi e as outras O que aconteceu com as outras também não renderam vejam que eu quebrei a minha implementação porque a minha plantação simplesmente não funciona mais Ah eu usei herança mas eu usei herança de uma forma que a minha implementação se quebrou Porque a partir do momento que eu precisar ter muitos comportamentos diferentes para minha para minha implementação de para minha conta né vai acontecer que eu posso ter situações aonde alguém desavisadamente vai lançar o meu Exception isso vai quebrar a execução como um todo por isso que a herança é perigosa por isso que era só tem que ser utilizada com muito com muita sabedoria porque quando você era algo de alguém você necessariamente tá dizendo que eu quero largar todos os comportamentos daquela classe Ases ou seja como eles são então que eu te falo de comportamento gente não tá falando que tá dentro do método a gente tá o método em si Então seja qual que é o comportamento da conta é o depositar é o sacar e o render então quando eu herdo esses comportamentos eu simplesmente vou usar esses comportamentos da maneira como eles devem ser utilizados beleza até aqui ok a gente tem um problema agora e a perguntar como que eu vou resolver esse problema né Por que que vai acontecer E se eu olhar para o conceito de LSB ele me diz o seguinte que as implementações filhas né devem poder ser substituídas pela implementação base que é a conta então a implantação base e a conta e ela deveriam ser poder ser substituídas pela implementação base é o que eu tô fazendo aqui então eu tenho uma conta é mas se você tiver fazendo aqui ó Ah entendeu então isso aqui eu tô fazendo o que eu tô pegando a implantação a implementação a implementação né e substituindo ela pela implantação base que a conta então até aqui tudo certo consigo fazer isso mas no momento do comportamento momento que eu vou executar o comportamento isso não acontece porque porque eu quebro a minha implementação comportamento do método render para conta um e para contar dois é ok Eles são tipo estão nivelados Porém na conta três eu não estou mais deixe nivelamento de comportamento né o meu comportamento simplesmente quebra então eu não posso fazer isso né eu não posso aumentar as constantes da minha de uma classe filha né eu tenho que estar sempre no mesmo nivelamento do que as outras implementações é de que a implantação base para poder fazer essa substituição entre si E como que eu resolvo isso né aí como que a gente aplicaria o conceito de ISP aqui para poder tornar a essa essa implementação de uma maneira vamos assim a implantação mais decente né A primeira coisa que a gente precisa fazer basicamente remover a herança tô assim a herança na um treco que a gente eu gosto de não usá-lo né mas é óbvio que alguns casos específicos né a herança é muito benéfica porém nesses cenários mais complexos tipo esse aqui a herança é perigosa Então vou manter essa mesma ordem que tá aqui só que daí vai ser utilizar a herança que o que eu vou fazer aqui né observa em que a minha conta ela faz o que ela manipula o saldo Então em vez de usar a herança eu vou usar composição que é o que se eu preciso manipular o saldo Então eu preciso ter uma classe que vai fazer o que me mande por lá e para mim beleza então invés de herdar comportamentos eu vou compor comportamentos E como que eu faço isso eu posso abstrair a parte de manipular o saldo Então vem aqui crie um manipulador de manipulador de saldo e aí aqui dentro eu vou ter o que lambu em saldo é é é E aí é que eu vou ter o método de depositar é para depositar eu vou ter um método de sacar tudo que vou aí de sacar in a Public void é Render tá dando taxa E aí Oi e eu vou ter um gato saldo né gente saldo E aí tranquilo que vai acontecer eu posso então vir aqui e fazer o depositar eu posso copiar lá da minhas contas né então eu tenho quando aquele dia recolhe assim posso fazer assim ó e aqui aí Já copiou esse aqui em E aí I e II E aí às vezes taxa e aí oque é o manipulador de saldo tá aqui tá feito aí o que que eu vou fazer eu vou agora compor o meu manipulador de salto dentro da minha conta então eu vou ter aqui Pra evite bule coador de saldo eu não vou só criar um consultor vazio e os cara que pode ser fainam E aí eu faço aqui ó diz. Manipulador de saldo Comprocard saldo e é diz. Ó manipulador de salto.
Depositar valor e diz. Manipulador de saldo. Sacar valor diz.
o manipulador de saldo. Render E aí qualquer essa aqui isso aqui era conta que vendia 0. 05 bom então vou mudar aqui mas depois de saldo.
Render faixinha aqui de 0. 05 Oi e aí você vem aqui na minha conta premium e o render dela então a diferença é que ele passa o que ele passa até 0. 01 então antes eu acessava o saldo aqui diretamente o que não é uma boa prática também né porque o saldo é um detalhe de implementação da conta eu não posso simplesmente ficar acessando isso por mais sejam classes filhas né então agora não tenho mais esse objeto saldo que eu não preciso mais dele eu posso tirar ele e aí eu tenho um acesso direto do meu manipulador de saldo o ou ainda eu posso fazer o que posso render fazer o seguinte que é melhor ainda super.
Render ah ah tá mas meu vender aqui ele não recebe então vou ter que ainda tinha esquecido desse detalhe né esse cara aqui vai ser protegida é é e É acho que é isso Oi e aí o manipulador de saldo. Render passo a tachinha aqui Oi e a conta premium e passou a tachinha da vida de conta universitária nela não rende então quando eu chamar o render do e se render aqui né a gente quando eu chamar e o render esse cara aqui eu simplesmente eu vou passar 0 o ovo Tipo posso fazer o mesmo tá tranquilo Oi e aí o que que vai acontecer eu tirei a exception O seu dá um Play e pronto a minha conta é de 10 a outra aqui entendeu cinco porcento peça que rendeu dez porcento não quebrei a minha implementação continua conseguindo substituir entre elas né porque a herança continua funcionando porém agora se eu criar novas contas eu quiser tipo ter outras maneiras de render meu corre o meu saldo eu simplesmente a consigo fazer isso através da mudança do comportamento do método render né de uma maneira bem clara bem com cinza né porque agora tem um manipulador de saldo que tem uma uma uma atividade muito específica que é manipular o saldo Arthur mas na prática eu só criei uma classe o e coloquei o objeto do saldo lá dentro o atributo do saldo lá dentro e tipo Beleza sim e se chama composição é diferente de herança né diferente da herança e se eu tô compondo comportamentos dentro da minha classe isso é muito positivo porque porque esse cara aqui virou um ponto de extensão da minha classe então a minha conta ela continua sendo uma coisa única sem outros motivos para a mudança porque porque se eu precisar um dia mudar a manipulação de saldo eu mudo não manipulador de saldo então Relembrando de novo single responsibility principle né e o open closet principle estão muito presentes aqui né então a minha conta agora ela tem uma única funcionalidade né que é Cuidado a conta especificamente Então ela tem por um único motivo para mudar que quando precisa mudar atributos da minha conta em si o e através do Open Close principle Eu estendi né eu abri mais a as possibilidades com relação à manipulação do saldo dessa conta então eu poderia por exemplo até manipuladores de saldos Diferentes né para cada conta então sei lá eu poderia ter receber isso aqui por parâmetro né e tem um manipulador de saldo de conta premium aí eu talvez nem precisasse ter a conta premium entenderam eu posso ter simplesmente um manipulador de saldo que já rende automaticamente o saldo a mais quando eu tenho uma conta premium e É nesse tipo de implantação que a gente gostaria de chegar então por exemplo posso fazer o seguinte ó eu posso excluir esses dois caras aqui e eu tenho na minha conta aqui uma maneira agora de receber uma are pulador de saldo e vejam que legal essa implementação Deixa eu tirar esse negócio aqui aí pronto e aí não render aqui eu não uso mais passar a taxa eu posso fazer meu manipulador de saldo E aí é é é E aí no caso aqui seria Sei lá eu mandei pulador de saldo raiz né Vamos só copiar ele aqui a Copa só edital me buscar aqui o limpador de saldo comum Vamos criar aqui um novo Quem é esse cara que poderia ser por exemplo uma interface e E aí E aí E aí Bom dia G1 e o pacote as estava viajando aqui né coloquei o negócio era tão pode tirar esse produto aqui também beleza aí eu defini aqui o que que precisa ter um manipulador de saldo eu posso implementar aqui ó manipulador de saldo e nesse cara aqui aí essa taxa que eu posso passar sei lá 10. 00.