LSP — The Liskov Substitution Principle Elias Rodrigues Gabriela Borges
Introdução <ul><li>O Princípio de Substituição de Liskov (LSP), afirma que se um programa que usa uma referência a uma Sup...
Herança <ul><li>O  princípio LSP é uma extensão do conceito de herança levando em consideração não só a relação  sintática...
Implementação de duas classes <ul><li>Na classe  Retângulo  temos: </li></ul><ul><li>Duas propriedades _largura e _altura ...
Criação da classe  Quadrado <ul><li>A classe  Quadrado  herda da classe Retângulo.  </li></ul><ul><li>O método  setLargura...
<ul><li>Como a classe  Quadrado  herda da classe  Retângulo  ela vai herdar os métodos  setLargura  e  setAltura , o que p...
<ul><li>Ao usar uma instância da classe quadrado que sobrescreveu o método da classe Base Retângulo, para calcular a área ...
<ul><li>Neste caso um quadrado não é um retângulo , e ao aplicarmos o princípio &quot;É Um&quot; da herança de forma autom...
<ul><li>Fazendo isso o resultado fica correto mas mostra que não podemos usar a instância de  Quadrado  como  Retângulo . ...
Classe Retângulo Classe Quadrado
Chamada
Referências <ul><li>http://davidhayden.com/blog/dave/archive/2005/06/10/1226.aspx </li></ul><ul><li>http://www.objectmento...
Próximos SlideShares
Carregando em…5
×

Lsp — the liskov substitution principle

723 visualizações

Publicada em

Publicada em: Tecnologia
1 comentário
1 gostou
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
723
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
4
Comentários
1
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Lsp — the liskov substitution principle

  1. 1. LSP — The Liskov Substitution Principle Elias Rodrigues Gabriela Borges
  2. 2. Introdução <ul><li>O Princípio de Substituição de Liskov (LSP), afirma que se um programa que usa uma referência a uma Superclasse, deve permitir a substituição dessa referência com a Subclasse sem alterar a funcionalidade do programa. </li></ul><ul><li>Assim uma classe base pode ser substituída pela sua classe derivada. O objetivo é ter certeza de que novas classes derivadas estão estendendo das classes base, mas sem alterar seu comportamento. </li></ul>
  3. 3. Herança <ul><li>O princípio LSP é uma extensão do conceito de herança levando em consideração não só a relação sintática entre a Superclasse e as Subclasses mas, essencialmente, sua relação de significado. </li></ul><ul><li>Exemplo: </li></ul><ul><li>Pessoa  - classe Pai, classe Base ou SuperClasse </li></ul><ul><ul><li>PessoaFisica - classe Filha ou sub-classe </li></ul></ul><ul><ul><li>PessoaJuridica - classe Filha ou sub-classe </li></ul></ul><ul><li>A classe  Pessoa  é a classe genérica; </li></ul><ul><li>As classes PessoaJuridica e PessoaFisica </li></ul><ul><li>  são especializações; </li></ul><ul><li>PessoaFisica É uma pessoa; </li></ul><ul><li>PessoaJuridica É uma pessoa; </li></ul>
  4. 4. Implementação de duas classes <ul><li>Na classe  Retângulo  temos: </li></ul><ul><li>Duas propriedades _largura e _altura </li></ul><ul><li>O método  setLargura(double largura) </li></ul><ul><li>O método  setAltura(double altura) </li></ul><ul><li>Na classe  Quadrado  iremos sobre-escrever o método  setLargura (); </li></ul>
  5. 5. Criação da classe  Quadrado <ul><li>A classe  Quadrado  herda da classe Retângulo. </li></ul><ul><li>O método  setLargura () desta classe sobrescreve o método da classe Base (setLargura). </li></ul><ul><li>Use o modificador override para modificar um método, uma propriedade, um indexador, ou um evento. </li></ul><ul><li>Um método de substituição fornece uma nova implementação de um membro herdado de uma classe base. </li></ul><ul><li>O método sobrescrito da classe base deve ser override. </li></ul>
  6. 6. <ul><li>Como a classe  Quadrado  herda da classe Retângulo  ela vai herdar os métodos setLargura e setAltura , o que para um quadrado não faz muito sentido visto que a largura e a altura são iguais. </li></ul><ul><li>É por isso que estamos sobrescrevendo esses dois métodos na classe Quadrado e definindo a largura igual a altura. </li></ul><ul><li>Agora estamos prontos para testar a nossa aplicação e verificar se as definições do nosso projeto estiverem de acordo com o princípio LSP a utilização da classe Quadrado () poderá ser usada sem problema algum no lugar da classe base Retângulo . </li></ul>
  7. 7. <ul><li>Ao usar uma instância da classe quadrado que sobrescreveu o método da classe Base Retângulo, para calcular a área de um retângulo obtivemos um valor incorreto. </li></ul><ul><li>Dessa forma o princípio LSP foi violado pois o resultado deveria ser o correto. </li></ul><ul><li>Estamos criando um novo retângulo definindo a altura de 5 e a largura de 10 para obter a área. </li></ul><ul><li>O resultado deveria ser  50 mas obtemos 100. </li></ul><ul><li>Qual o problema ??? </li></ul><ul><li>Ao definir a largura para 10, acabamos definindo também a altura, deixando a área com valor de 100 e não 50 como era esperado. </li></ul>
  8. 8. <ul><li>Neste caso um quadrado não é um retângulo , e ao aplicarmos o princípio &quot;É Um&quot; da herança de forma automática vimos que ele não funciona para todos os casos. </li></ul><ul><li>A instância da classe  Quadrado  quando usada quebra o código produzindo um resultado errado e isso viola o principio de LisKov onde  uma classe filha (Quadrado) deve poder substituir uma classe base(Retângulo). </li></ul>
  9. 9. <ul><li>Fazendo isso o resultado fica correto mas mostra que não podemos usar a instância de Quadrado como Retângulo . </li></ul><ul><li>Este exemplo mostra uma violação clara do princípio LSP , onde a inclusão da classe  Quadrado  herdando de  Retângulo  mudou o comportamento da classe base, violando assim o princípio  Open-Closed. </li></ul><ul><li>O principio  LSP  é uma extensão do  Princípio Open-Closed  e isso significa que temos que ter certeza de que as novas classes derivadas estão estendendo as classes base, sem alterar seu comportamento. </li></ul>
  10. 10. Classe Retângulo Classe Quadrado
  11. 11. Chamada
  12. 12. Referências <ul><li>http://davidhayden.com/blog/dave/archive/2005/06/10/1226.aspx </li></ul><ul><li>http://www.objectmentor.com/resources/articles/lsp.pdf </li></ul><ul><li>http://www.objectmentor.com/omSolutions/oops_what.html </li></ul><ul><li>http://javaboutique.internet.com/tutorials/JavaOO/ </li></ul><ul><li>http://www.engr.mun.ca/~theo/Courses/ssd/pub/sd-principles-3.pdf </li></ul>

×