Вы находитесь на странице: 1из 44

Composição vs.

Herança
Qual escolher?
Mantra que
vocês ainda vão
ouvir falar..
“favor composition
over inheritance"
OO 101
Classe: um conceito nomeado
do domínio, com uma
subclasse opcional, definida
por um conjunto de atributos e
métodos
OO 101

Atributo: uma propriedade


nomeada de algum tipo, que
pode referenciar outro objeto
(composição)
OO 101
Método: uma função/
procedimento nomeada, com
ou sem parâmetros, que
implementa o comportamento
da classe
OO 101
Herança: uma classe pode herdar os
atributos e métodos de sua
superclasse.
É transitivo (uma classe pode herdar
de uma classe que herda de uma
classe…).
Subclasses podem sobrescrever
métodos e atributos herdados
OO 101
Composição: quando um atributo
é do tipo de uma Classe, o atributo
tem uma referência para outro
objeto, criando uma relação de
associação entre eles.
Ou seja, uma classe usa outro
objeto para prover parte de suas
funcionalidades.
OO 101

Encapsulamento: esconder os
detalhes de implementação de
uma classe (métodos e atributos),
através de uma interface pública.
Herança é
fundamental
Herança é
fundamental para
orientação objetos
Composição
também é
Mas então, qual é
a confusão?
Composição vs. Herança

A verdadeira
confusão é pensar
que uma pode
substituir a outra.
Composição vs. Herança

Computação é
exercitar trade-offs
Composição

Fácil de entender (cadeira tem


pernas)
Herança

Conceito simples e complicado.


"Algo que podemos somente
falar não tocar”
Composição vs. Herança

Em muitas situações é simples


de se substituir herança por
composição.

Propósito de composição é
obvio: compor o todo por partes
Composição vs. Herança

Propósito de herança um pouco


mais complexo e pode ser
dividido em duas partes:
Semântica

Herança captura semântica


(sentido) em uma hierarquia de
classificação (taxonomia)
Agrupa conceitos relacionados
em uma estrutura de árvore
Semântica

A semântica de uma classe,


normalmente está relacionada
por sua interface.
(mensagens que eu respondo e
envio)
Semântica

Contudo ao herdar uma classe,


você está aceitando a
responsabilidade por todas as
mensagens que a classe pai
envia/responde.
Semântica

Isto acopla fortemente uma


subclasse a superclasse.
Mecânica

Herdar também captura a


mecânica de uma classe através
da representação dos seus
atributos e métodos, deixando
sua classe disponível para ser
herdada.
De uma vez por
todas!!!
Reuso de código não é o
objetivo principal de herança.

Pensar só em reuso pode


prejudicar seu design.
Pilha, mas herda o get, set add
remove do ArrayList.
Semântico: Stack não é um
ArrayList.
Stack não é um subtipo de
ArrayList.
Mecânico: herdar de ArrayList,
viola encapsulamento, pois usar
ArrayList para manter o estado
da sua pilha é uma decisão de
implementação que deve ser
“escondida" dos consumidores.
Mecânico: erro de domínio, pois
ArrayList é uma coleção de
acesso posicional e Stack é uma
pilha.
Usando herança bem

“Programação Diferencial”

Precisamos de um Widget que é


como o Widget atual, mas com
uma simples diferença.
Usando herança bem

Para agrupar conceitos


relacionados, identificar família
de classes.
Como decidir?

Herança só deve ser usada se….


Herança só deve ser usada se….

1-) Ambas as classes pertencem


ao mesmo domínio
2-) A subclasse é
verdadeiramente um subtipo da
classe pai
3-) A implementação da
superclasse é necessária e/ou
apropriada para a subclasse
Herança só deve ser usada se….

1-) Ambas as classes pertencem


ao mesmo domínio
Herança só deve ser usada se….

2-) A subclasse é
verdadeiramente um subtipo da
classe pai
Herança só deve ser usada se….

3-) A implementação da
superclasse é necessária e/ou
apropriada para a subclasse
Herança só deve ser usada se….

4-) A subclasse está


adicionando comportamento e
não restringindo-o
Normalmente encontradas
em 3 situações

Modelagem de domínio de alto


nível
Normalmente encontradas
em 3 situações

Frameworks e extensões de
frameworks
Normalmente encontradas
em 3 situações

Programação diferencial
Então..

Se você não está fazendo uma


destas três coisas, você
provavelmente não precisa de
herança.
Então..

O “favoreça composição” não


significa que é melhor, é uma
questão do que é mais
apropriado as suas
necessidades.

Вам также может понравиться