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.

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:

SOLI1

E suas subclasses Carro e Metro:

SOLI2

 

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.


SOL-3

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,


SOL-4

e Quadrado como a classe derivada.


SOL-5

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