Herança ou Composição, eis a questão?

Pedro Barros
Jul 7, 2016 · 5 min read

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

Opensanca

Aqui falamos sobre opensource, inovação, tecnologia e happy hour, faça parte!

Pedro Barros

Written by

undefined

Opensanca

Opensanca

Aqui falamos sobre opensource, inovação, tecnologia e happy hour, faça parte!

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade