[MÚSICA] [MÚSICA] Olá a todos. Meu nome é Eduardo Guerra. Esse é o Curso de Desenvolvimento Ágil com Padrões de Projeto. Na aula de hoje a gente vai falar pouquinho sobre quando a Herança não funciona, quando que ela não dá certo. A Herança é muito legal, dá para usar ela para muita coisa mas nem sempre ela é a melhor solução. É aquela coisa assim "você teve prego, o martelo é a solução perfeita mas se você tem parafuso, talvez exista uma ferramenta melhor". Então, a gente vai ver hoje justamente esse caso aí, no que usar a Herança acaba trazendo problemas. Certo? Vamos lá então. Imagina o seguinte: eu tenho ali uma ordem, e essa ordem tem características de entrega e de preço. Tem método que calcula entrega e tem método que calcula o preço, pelo que a entrega pode ser expressa ou normal, e o preço pode ser, por exemplo, o preço de varejo ou de atacado; então, o cálculo desse preço vai estar mudando. Então, eu vou sair daqui para vocês poderem ver o diagrama melhor. Então olha só o quê que vai acontecer se eu usar a herança para especializar cada tipo de ordem. Vou ter ali a minha classe ordem, eu tenho ali o preço, eu tenho, por exemplo, método que calcula o total, que vai chamar o preço e a entrega, usando o conceito do Template Method que a gente aprendeu no módulo anterior. E eu tenho a ordem expressa no atacado, expressa no varejo, normal no atacado e normal no varejo; cada uma especializando o preço e a entrega de acordo com o seu tipo. Quê que acontece? Eu tenho o código duplicado, então, se a gente olhar aí, os métodos que têm a mesma cor estão duplicados. Então, por exemplo, pegar só alguns exemplos aqui. Se eu pegar a ordem expressa no atacado e normal no atacado, o cálculo do preço vai ser igual. Por outro lado, se eu pegar a normal no atacado e a normal no varejo, a entrega é que é duplicada. A gente pode ver que o código está duplicando mas nenhuma classe tem a mesma combinação da outra. Uma das coisas que a gente pode tentar fazer para resolver esse problema é talvez tentar adicionar uma nova camada de abstração, ou seja, vez de eu criar todas as classes concretas, eu vou criar mais uma camada abstrata e vou herdar dessa camada. Será que dá certo? Vamos ver aqui. Então, eu tenho a minha classe ordem e eu primeiro fiz a ordem expressa e a ordem normal. E eu tenho o método entrega que não vai ser duplicado. Mas quando eu fizer a próxima camada eu vou ter ali a duplicação no preço. Então, melhorou pouquinho mais no resolver o meu problema. E se eu for ver a gente está pegando dois tipos de entrega e dois tipos de cálculos de preço. Num sistema real, volta e meia a gente precisa de novas necessidades. Imagina se eu precisasse, por exemplo, de novo tipo de entrega, como por exemplo, uma entrega expressa. Uma entrega local, às vezes na mesma cidade onde está o meu depósito. Eu teria que duplicar mais ainda o preço. Ou seja, a gente vê que realmente é uma solução que não escala. O grande problema nesse caso é que existem dois fatores que podem variar de forma independente, no caso, a entrega e o preço. Quê que a gente faz agora? Nossa amiga aqui está dando uma sugestão. Será que tem algum padrão que use composição que possa ajudar? Xiu, poxa, está dando spoiler da minha próxima aula? Vou acabar aqui para a gente ir logo. Já deu a dica aqui. Então, essa aula aí, vou encerrar, antes que dê mais spoiler da próxima aula, que a gente vai falar dos padrões da composição. A gente viu uma situação que o uso da herança não funciona. E na próxima aula, fique ligado que a gente vai ver como resolver esse problema com padrão que usa composição. Muito obrigado. [MÚSICA] [MÚSICA]