Liskov substitution principle (LSP) – Principio da substituição de liskov

Salve, salve, galera, continuando nosso papo sobre os princípios SOLID, hoje vamos falar do princípio que tem o nome mais “exótico”. O principio da substituição de Liskov (quem quiser saber da historia pode ver aqui) diz que:

Se q(x) é uma propriedade demonstrável dos objetos x de tipo T. Então q(y) deve ser verdadeiro para objetos y de tipo S onde S é um subtipo de T.

O que foi isso ????

Vamos falar em termos gerais:  devemos poder trocar uma classe derivada pela sua base (simples assim).

Cade o exemplo ???

Vou tomar aqui um exemplo muito comum , imaginem que temos a seguinte estrutura de classes (que diga-se de passagem viola esse principio);


public class Pessoa
{
    //Implementações
}

public class PessoaFisica : Pessoa
{
   public void SalvarPessoaFisica(string nome)
   {
      //regras
   }
}

public class PessoaJuridica : Pessoa
{
   public void SalvarPessoaJuridica(string nome)
   {
      //regras
   }
}

public class PessoaOutroTipo : Pessoa
{
   public void SalvarPessoaOutroTipo(string nome)
   {
      //regras
   }
}

Aqui temos N classes herdando uma principal , e com certeza utilizando algum membro comum dessa ( por exemplo o atributo Nome). Porem cada uma implementa o seu método Salvar. Observem que aqui não conseguiremos substituir as especializações pela classe base quando quisermos salvar, uma vez que temos N implementações. Aqui temos um problema comum, que em muitos casos seria resolvido assim:

public void SalvarPessoas(IList<Pessoa> pessoas)
{
   foreach (var pessoa in pessoas)
   {
      if (pessoa is PessoaFisica)
          ((PessoaFisica)pessoa).SalvarPessoaFisica();
      else if (pessoa is PessoaJuridica)
           ((PessoaJuridica)pessoa).SalvarPessoaJuridica();
   }
}

Percebam a complexidade de se manter esse código.

Como solução para esse problema devemos garantir que possamos trocar nossas classes derivadas sempre que necessário pela classe Base (sobrescrevendo um método comum a elas). Esse principio esta muita alinhado com o principio OCP. Podemos dizer que são extensões.

Att.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s