[MÚSICA] [MÚSICA] Olá. Bem vindo ao curso de Desenvolvimento Ágil com Padrões de Projetos. Eu sou Clovis Fernandes e na aula de hoje iremos mostrar para vocês como fazer uso apropriado de herança. Na aula anterior, nós mostramos que herança por construção não é uma coisa boa, dá problema, deve ser evitado o máximo possível. E na aula de hoje, após o término da aula de hoje você terá aprendido, ou relembrado, como fazer uso apropriado de herança. Isto vai ser importante para a criação de alguns padrões. Outros, não vai ser suficiente e teremos que usar técnicas como composição para fazer reuso. Mas nesse momento, vamos mostrar isto para vocês. Relembrando então, nós mostramos na aula passada que reuso, usando herança por construção não é uma coisa apropriada, não deve ser usado. O certo é fazer uma abstração que capture as coisas comuns entre as classes. A ideia é você olhar essas classes, no nosso caso seriam a grilo e a aranha, e fazer uma generalização. Essa generalização significa que eu vou criar uma superclasse que o grilo e a aranha sejam subclasses. Então começamos mostrando as duas classes. Eu ampliei, coloquei método a mais, respirar. Pelas duas classes eu estou supondo que essa responsabilidade de respirar é comum, respirar é sempre igual tanto no grilo quanto na aranha. Primeira ideia que eu tenho de uma abstração é inseto. Então eu crio uma classe inseto e coloco grilo e aranha como subclasses. O primeiro critério que eu tenha que avaliar para verificar se essa abstração que eu criei é apropriada, que eu estou chamando de número o relacionamento é. Ou seja, eu vou pegar a classe grilo e vou perguntar: faz sentido que grilo seja uma subclasse de inseto? Grilo é uma subclasse de inseto? Opa. Faz sentido. Agora, faz sentido que aranha é uma subclasse de inseto? Não faz sentido. Aranha não é inseto. Aranha é aracnídeo, é outra coisa. Então, essa abstração que eu fiz colocando a superclasse inseto não foi aprovada. Não faz sentido eu ter esta classe, porque já falhou no primeiro critério para uso adequado de herança, que é o relacionamento é. Vamos fazer então essa segunda tentativa. Vez de usar inseto, eu vou usar uma abstração chamando animal pequeno. E agora vou examinar de novo usando o critério relacionamento é. Grilo é animal pequeno? Opa. É. Aranha é animal pequeno? Opa. É também. Então, a classe, essa generalização inicial que eu fiz colocando a superclasse animal pequeno parece que é boa. Vamos examinar agora segundo critério. Nós vamos mover para a superclasse todos os métodos que são comuns das duas subclasses grilo e aranha. Os dois métodos comuns é o mover e o respirar. O pular é específico do grilo e o fazer teia é específico da aranha. Então o que eu fiz aí? Agora eu estou fazendo uma suposição diferente da que eu fiz na aula passada. Na aula anterior, do uso não apropriado de herança, eu tinha suposto que o mover de grilo era equivalente ao mover de aranha, e eu estava querendo reusar. Agora eu estou fazendo uma outra suposição. O respirar é comum para grilo e aranha. E o mover, o grilo se move de uma maneira, a aranha se move de outra maneira. Então, ao fazer essa diferenciação não faz sentido eu ter método mover que seja comum para as duas. Embora eu pudesse ter método comum que servisse para as duas, e no caso da aranha, por exemplo, eu poderia, ou do grilo, tanto faz, eu poderia fazer mover específico. Mas no caso, eu estou escolhendo usar método mover abstrato. Então eu estou colocando método mover abstrato. Respirar como coisas comuns. Obviamente, quando eu movi, quando eu coloquei os métodos comuns na superclasse animal pequeno, o mover da classe grilo ele tem uma maneira específica de como ele vai se mover. Eu mantenho lá agora método mover, que vai implementar a abstração mover que está lá na superclasse. E na classe aranha a mesma coisa, ela vai implementar a abstração que está lá na superclasse. Ou seja, o que houve aqui? Vamos lembrar que esses métodos correspondem a responsabilidades. Então essas responsabilidades eu estou herdando o significado de mover, só que cada uma se move de uma maneira diferente. Mas houve reuso. O reuso, neste caso, é da abstração do método mover, da responsabilidade mover. Está na superclasse. Já o respirar é reuso direto. Ele é concreto. Eu reuso o respirar no grilo e reuso o respirar na aranha. Com isso, com esses dois critérios mais o conceito usual de polimorfismo, nós mostramos que isso corresponde ao princípio de substituição de Liskov. Que corresponde ao L daquelas técnicas de estruturação, de boas técnicas de codificação, que a gente chamou de SOLID. É o L, corresponde ao L. E o que significa isto? Significa que se eu faço essa estrutura que satisfaz esses dois critérios, mais o polimorfismo, onde tiver objeto, uma variável da superclasse, no caso seria animal pequeno, eu posso colocar objetos tanto de aranha, quanto de grilo e que não vai ter problema. Vocês lembram que na aula anterior ao substituir o objeto grilo por objeto aranha dava problema. Agora não. Por causa desses princípios, o princípio da substituição está me garantindo isto com esta boa formação de herança. Vamos exemplificar aqui código. Seria método comer, que eu passo dois parâmetros. Que no caso o primeiro parâmetro é animal pequeno e o segundo é local. Então se o animal pequeno está no local, está certo? Então eu vou fazer algumas coisas para comer, entre elas eu vou me mover, está certo? Então, ao fazer isto, tanto faz. É por isso que está lá positivo tanto para aranha, quanto para grilo. Porque o movimento para mover vai ser específico para grilo, se for objeto grilo e vai ser específico para aranha se for objeto aranha. Então nós mostramos aqui, que o principal reuso aqui é dessa abstração, desse significado. E a responsabilidade dá e a gente explicita isso através de nome apropriado. Por isso que a gente sempre fala assim: o uso da intenção. Você está usando nome apropriado, trabalhou para que aquele nome apareça. Isso tem significado, dá mais organização, facilita entendimento, manutenção e tudo mais. Obviamente, eu também posso ter o reuso das coisas como mostrei, como o método respirar. Direto, concreto. Eu posso fazer isto. Com isso satisfazendo o princípio da substituição. Esse é o método, é o uso apropriado de herança quando satisfaz o princípio da substituição. Eu posso usar tanto objeto quanto o outro, porque não vai dar problema nenhuma situação. Esta é a coisa boa. E vai facilitar o entendimento, a leitura, a manutenção e o código fica muito melhor. Com isto, esperamos que tenham entendido como fazer uso apropriado de herança. [MÚSICA] [MÚSICA]