O princípio da Substituição de Liskov leva o nome da sua criadora Barbara Liskov, que introduziu o conceito deste princípio em uma conferência em 1987 e posteriormente, em 1994 no artigo Family Values: A Behavioral Notion of Subtyping com a parceria de Jeannette Wing. Podemos dizer que sua definição original de forma resumida é a seguinte:
Seja q(x) uma propriedade que se pode provar do objeto x do tipo T. Então, q(y) também é possível provar para o objeto y do tipo S, sendo S um subtipo de T.
Sumário
O que isso quer dizer afinal?
Significa dizer que classes derivadas devem poder substituídas por suas classes base e que classes base podem ser substituídas por qualquer uma das suas subclasses. Uma subclasse deve sobrescrever os métodos da superclasse de forma que a funcionalidade do ponto de vista do cliente continue a mesma.
Imaginemos o seguinte exemplo:
Dada a classe abstrata Veiculo:
E suas subclasses Carro e Metro:
Uma classe cliente deve ser capaz de usar qualquer uma das duas implementações, desde que a classe cliente seja capaz de usar a classe Veiculo.
Violando o LSP – Quadrado é um retângulo
Imaginemos as formas geométricas Quadrado e Retângulo, conceitualmente falando um quadrado é um retângulo com lados do mesmo tamanho. Portanto é lógico e intuitivo modelar uma classe Quadrado como sendo derivada da classe Retângulo.
Dessa forma temos Retangulo como a classe base,
e Quadrado como a classe derivada.
A classe cliente entende que r é um retângulo e assume que ele pode definir largura e altura como na classe base Retangulo. Ao executarmos o código o resultado será 100 e não 50 como esperado, isso porque ao sobrescrever os métodos setLargura e setAltura alteramos a funcionalidade para adequarmos à um quadrado.
Conclusão
O princípio da substituição de Liskov nos mostra que devemos tomar cuidado ao fazer uso da herança, devemos verificar se o polimorfismo faz mesmo sentindo, ou seja, se qualquer subclasse pode ser utilizada no lugar da superclasse. Caso não, significa dizer que a herança está sendo utilizada de forma inadequada.
Quer saber mais sobre os princípios SOLID? Clique aqui para saber mais sobre os princípios da responsabilidade única e o princípio aberto/fechado.
Por: Marcos Felipe