☕ 5.6 Herança ou Composição?
🎯 Objetivo: Compreender a diferença estratégica entre o uso de herança de classes e a composição de objetos para garantir um sistema escalável e com baixo acoplamento.
🏗️ O Conceito: A Questão do Acoplamento
Embora a herança seja uma ferramenta poderosa para reutilização de código, seu uso indiscriminado pode levar a sistemas rígidos e frágeis. Sempre que possível, procure favorecer o uso da composição em vez de herança.
- Herança (
is-a): Define que uma classe é um tipo de outra (ex:Gerenteé umFuncionario). - Composição (
has-a): Define que uma classe tem um componente (ex:Carrotem umMotor).
Conselho de Especialista
“Herança expõe a subclasse aos detalhes de implementação da superclasse, forçando o acoplamento. A composição fornece um encapsulamento mais forte.” — Baseado no artigo de James Gosling.
💻 Mão na Massa
Passo 1: Analisando o Problema da Herança
Imagine que você queira criar um sistema de autenticação. Se você usar herança para tudo, um Gerente que deixa de ser gerente mas mantém sua senha pode causar falhas de segurança se a lógica de login estiver “viciada” apenas na hierarquia.
Passo 2: Implementando com Composição
Veja como preferir a composição torna o código mais flexível:
// Em vez de: class Gerente extends Autenticavel
public class Gerente extends Funcionario {
private Autenticador sistemaAutenticacao; // Composição
public Gerente(Autenticador autenticador) {
this.sistemaAutenticacao = autenticador;
}
public boolean efetuarLogin(String senha) {
return this.sistemaAutenticacao.autenticar(senha);
}
}✅ Resultado Esperado
Ao final desta análise, você deve ser capaz de identificar quando uma classe está se tornando complexa demais devido a uma hierarquia de herança profunda e quando deve-se extrair as responsabilidades para classes menores e independentes (Composição).
🚨 Erros Comuns
| Erro | Causa | Solução |
|---|---|---|
| Herança de “Conveniência” | Herdar de uma classe apenas para ganhar alguns métodos. | Se não houver uma relação de tipo (“é um”), use composição. |
| Hierarquias Profundas | Classes herdando de classes que herdam de classes… | Tente manter a hierarquia rasa. Composição é mais modular. |