9. LSP: Princípio da Substituição de Liskov
Subtipos devem ser substituíveis pelos tipos-base.
Resumo
- Barbara Liskov (1988): S é subtipo de T se trocar T por S não altera o comportamento do programa.
- Bom exemplo: License → Personal/Business. Billing não sabe qual usa.
- Clássico erro: Quadrado/Retângulo. Usuário espera setW/setH independentes; quadrado viola.
- LSP vale para interfaces e serviços REST, não só herança.
- Exemplo táxi: uma empresa usa
destem vez dedestination→ if especial polui arquitetura. Isolar com configuração.
Perguntas-chave
responda de cabeça, depois abraPor que Quadrado não deve ser subtipo substituível de Retângulo?
Retângulo permite largura e altura independentes. Quadrado não; código cliente que assume isso quebra.
LSP vale só para herança?
Não. Vale para qualquer interface: classes Java, Ruby duck typing, serviços REST.
Qual o sintoma de violação de LSP na arquitetura?
Ifs especiais por tipo/fornecedor. Mecanismos extras para tratar exceções contaminam o sistema.
Exercícios de fixação
0/5 respondidas1.
Um código cliente faz
r.setW(5); r.setH(2); assert(r.area() == 10). Passar um Quadrado faz o teste falhar. O que isso mostra?2.
Um agregador de táxi integra várias empresas por REST. Uma empresa usa um campo diferente na URI. A pior solução seria:
3.
O LSP se aplica a:
4.
No exemplo License, por que PersonalLicense e BusinessLicense respeitam o LSP?
5.
Quem formulou a definição original de subtipos usada no princípio?