Liscov Substitution Principle
Em qualquer local onde seja requerido um objeto de uma classe T, pode ser usado um objeto de uma subclasse de T.
Outline do texto “A Behavioral Notion of Subtyping” de Barbara H. Liskov e Jeanette M. Wing:
- Introdução
- Uso da hierarquia em design orientado a objetos.
- Necessidade de compreender a relação entre subtipos e supertipos.
- A relação deve garantir que qualquer propriedade comprovada sobre objetos de supertipo também se aplique a objetos de subtipo.
- Apresentação de duas maneiras de definir a relação de subtipo.
- Motivação
- Discussão sobre o que significa um tipo ser um subtipo de outro.
- Considerações sobre a tipagem forte em linguagens orientadas a objetos.
- Necessidade de uma exigência mais forte que restrinja o comportamento dos subtipos.
- Introdução ao Requisito de Subtipo.
- Modelo de Computação
- Assunção de um conjunto de todos os objetos potencialmente existentes.
- Definição de um tipo como um triplo: objetos, valores e métodos.
- Discussão sobre a imutabilidade dos objetos e tipos.
- Especificações
- Descrição das informações incluídas em uma especificação de tipo.
- Uso de especificações formais no estilo Larch.
- Distinção entre um objeto e seu valor.
- Exemplo de uma especificação de tipo para “bags”.
O texto discute a noção de subtipagem em programação orientada a objetos, focando na relação entre subtipos e supertipos e na importância de garantir que as propriedades de um supertipo se apliquem também a seus subtipos. Através de exemplos e discussões teóricas, os autores exploram diferentes abordagens para definir e entender essa relação.
Está relacionado com pré-condições e pós-condições das subclasses.
As subclasses não podem implementar pré-condições mais fortes, apenas mais fracas.
Exemplo: se a classe mãe exige que o valor do parâmetro seja maior que 50, a sub-classe não pode exigir que o valor seja maior que 100. Isso porque há um intervalo que cabe a condição da classe mãe, mas não cabe a condição da sub-classe. Isso pode fazer com que o código quebre em alguns lugares, uma vez que se um método aceita a classe mãe, também deve aceitar a sub-classe.
No entanto, a sub-classe pode implementar como pré-condição que o valor mínimo seja mais fraca. Por exemplo, pode exigir que o valor mínimo seja 150. Nesse caso sempre serão observadas as condições da classe mãe e da subclasse.
O mesmo raciocínio se aplica às pós-condições, que são os critérios para o retorno.
Em síntese, os valores de entrada e saída devem ser coerentes na classe mãe e nas subclasses.
A ideia é nunca quebrar o cliente do código.
Referências
- Liskov, B. H. & Wing, J. M. A behavioral notion of subtyping. ACM Trans. Program. Lang. Syst. 16, 1811–1841 (1994).
- Dev Eficiente (Diretor). (2020, julho 16). SOLID #3: Princípio de substituição de Liskov. https://www.youtube.com/watch?v=MiV_tI3fNPQ
- Dev Eficiente (Diretor). (2022, outubro 7). Curso de SOLID: Entendendo de uma vez por todas o princípio de Liskov. https://www.youtube.com/watch?v=tIcfvP9jf9k