Herança ou Composição, eis a questão?
Depois mais ou menos dois meses sem postar nada eis que me surge o tempo e a seguinte questão em minha mente:
Herança ou Composição?
Composição e Herança são duas abordagens para reutilização de funcionalidades comuns.
Na Herança uma classe pode herdar os atributos e métodos de sua superclasse. A herança é transitiva, então uma classe pode herdar de outra classe que herda de outra classe, e assim por diante, até uma classe base. Subclasses podem substituir alguns métodos e/ou atributos para alterar o comportamento padrão.
Na Herança decidimos os tipos baseados no que eles são.
Ser humano é um mamífero.
Segue abaixo exemplos de Herança e Composição usando Javascript.
Na composição codificamos pequenos comportamentos padrão e usamos composição para definir comportamentos mais complexos. Com isso podemos alterar a associação entre classes em tempo de execução, assim um objeto pode assumir mais de um comportamento.
Vamos intuitivamente definir composição como quando a classe usa um outro objeto para proporcionar uma parte ou toda a sua funcionalidade.
Na Composição decidimos os tipos baseados no que eles fazem.
O ser humano tem capacidade de amamentar (Lactação).
A HERANÇA É FUNDAMENTAL
Herança é fundamental na programação orientada a objeto. As linguagens de programação podem ter objetos e mensagens, mas sem a herança não há orientação á objetos (apenas “baseada em objetos”, mas ainda polimórfica).
… SENDO ASSIM A COMPOSIÇÃO
Também é fundamental para todas as linguagens. Mesmo se a linguagem não suportar composição o que é raro atualmente, nós seres humanos ainda pensamos em termos de componentes e peças. Seria impossível para quebrar problemas complexos em soluções modulares sem a composição.
COMO ESCOLHER ?
Pensando com Composição é como “ter” um relacionamento. O Ser Humano “tem” a capacidade amamentar, raciocinar e também “tem” pernas e braços e assim por diante.
Ser Humano = capacidade amamentar + braços + pernas
Já pensando com Herança “é” como uma relação. O Ser Humano “é” um Mamífero, um Carro “é” um Veículo, Maçã “é” uma Fruta e etc.
Ser Humano < Mamífero
Como todas essas comparações entre Composição e Herança podem ajudar em nossos projetos? Aqui estão algumas diretrizes que refletem como escolher entre a Composição e Herança.
Certifique-se de modelos de Herança com relacionamentos é a minha principal filosofia de trabalho e que a Herança deve ser usada somente quando uma subclasse é uma superclasse. No exemplo acima, um Ser Humano provavelmente é um mamífero, então eu estaria inclinado a usar a Herança.
Uma questão importante de perguntar a si mesmo é quando você acha que tem uma relação é-um, e tem consciência se essa relação é-um será constante durante todo o tempo de vida da aplicação e com sorte no ciclo de vida do código. Por exemplo, você pode pensar que um Funcionário é-uma Pessoa, quando na verdade Funcionário representa um papel que a Pessoa desempenha uma parte do tempo. E se a Pessoa fica Desempregada? E se a Pessoa é tanto um Funcionário quanto um Supervisor? Tal comportamento é-um geralmente deve ser modelado com uma Composição (tem-um).
Não use a Herança apenas para obter a reutilização de código, se tudo o que você realmente quer é a reutilização de código e não há relação “é-um” visível, use Composição.
Não use a Herança apenas para obter pelo polimorfismo, se tudo o que você realmente é o Polimorfismo, mas não há nenhum relacionamento “é-um”, use Composição.
CONCLUSÃO
Na maioria das vezes a herança deve ser pouco utilizada. Atualmente a composição é considerada bem superior à herança na maioria dos casos pois entre as suas principais vantagens a composição permite mudar a associação entre classes em tempo de execução, os objetos podem assumir mais de um comportamento, as aplicações se tornam mais simples e reutilizáveis, além de descartar os problemas envolvendo a herança como o acoplamento entre as classes e outros problemas.
A composição tem seu uso consolidado pois é utilizada em diversos Padrões de Projetos comprovando assim a sua grande utilidade e uso no desenvolvimento de aplicações melhores e com uma Manutenibilidade maior.
O Problema na Herança é que ela nos encoraja a prever o futuro, fazendo com que pensamos na Herança dos objetos mais bem cedo e que a maioria das vezes cometemos erros ao defini-las, pois o ser humano não tem o poder de prevê o futuro (Mesmo pensando que temos hahaha).
Quando criamos objetos sobre Herança Taxonômicas fica muito difícil de sair delas pois se tornam muito rígidos os relacionamentos com o passar do tempo. Já quando utilizamos Composições desde o começo acabamos tendo um pouco mais de flexibilidade e poder.
Sendo assim escolha o mecanismo que mais se encaixa no seu objetivo de projeto e borá programar.
Bom por hoje é só pessoal. Bons estudos, deixem seus comentários e até a próxima!!!