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.
Diagrama UML da Herança utilizada no código abaixo.

Segue abaixo exemplos de Herança e Composição usando Javascript.

Herança em 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).
Diagrama UML da Composição utilizada no código abaixo.
Composição em Javascript.

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!!!

FONTES E CONTEÚDOS RELACIONADOS

Show your support

Clapping shows how much you appreciated Pedro Augusto de Barros’s story.