Liskov Substitution Principle
Hacking Evening - SOLID Principles
hello
DEPRECATED PHOTO
Elaine Naomi Watanabe
Desenvolvedora de Software (Plataformatec)
Mestre em Ciência da Computação (USP)
github.com/elainenaomi
twitter.com/elaine_nw
Recapitulando...
Estamos em uma série de talks sobre design de código
envolvendo o conceito
SOLID
Single Responsibility Principle
Open/Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
Single Responsibility Principle
Alta coesão de classes
Isolamento de responsabilidades
Encapsulamento
Single Responsibility Principle
Open/Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
Open/Closed Principle
Redução do acoplamento
Definição de interfaces/abstrações
Polimorfismo
Reúso
Single Responsibility Principle
Open/Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
Liskov??
https://bit.ly/2NRiznt
Hacking Evening - Liskov Substitution Principle
Spoiler: vai ter um pouco de teoria
Aguentem, por favor <3
Barbara Liskov
Institute Professor from MIT
The 2008 Turing Award winner
liskov at csail.mit.edu
Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T. Then φ(y) should be true for objects y
of type S where S is a subtype of T.
Eita!
Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T. Then φ(y) should be true for objects y
of type S where S is a subtype of T.
Liskov Substitution Principle (1987)
Teoria dos Tipos (Type Theory)
Teoria dos Tipos
Como representar caracteres, números inteiros e de ponto
flutuante, booleanos no nível do processador?
Abstrações! E não pensar em bits e bytes!
E cada tipo tem suas restrições/comportamentos
Tipos Abstratos de Dados
Conjunto de comportamentos/operações
Estrutura de dados específica (atributos)
Como representar elementos do domínio de negócio
Tipos Abstratos de Dados
Conjunto de comportamentos/operações
Estrutura de dados específica (atributos)
Como representar elementos do domínio de negócio
CLASSES
Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T.
CLASSE
Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T.
COMPORTAMENTO
Liskov Substitution Principle (1987)
Let φ(x) be a property provable about objects x
of type T. Then φ(y) should be true for objects y
of type S where S is a subtype of T.
"SUBCLASSES"
Liskov Substitution Principle (1987)
Classes vs Subclasses
Interfaces vs Implementações
Liskov Substitution Principle (1987)
Traduzindo:
Preciso garantir que se eu substituir um objeto de uma classe por um
outro objeto de uma subclasse dessa classe, as propriedades que
definem o objeto-pai precisam continuar funcionando.
1987
Herança: herança de comportamentos de
uma super classe
Polimorfismo: definição de uma interface única para
acessar tipos diferentes de objetos
ALERTA!
Cuidado com interpretações equivocadas sobre LSP:
Se uma subclasse altera o comportamento da superclasse,
nem sempre é uma violação desse princípio
Podemos e devemos usar o polimorfismo
(mas com sabedoria)
Design by contract
respeitar os contratos definidos pelo super tipo
Design by contract
respeitar os contratos definidos pela classe base
Pré-condições: dados de entrada
classes derivadas só podem ser mais permissivas
Pós-condições: dados de saída
classes derivadas só podem ser mais restritivas
Não podemos criar comportamentos inesperados ou incorretos!
O comportamento da super classe precisa ser mantido
class CheckingAccount
# ...
def deposit(value)
raise InvalidValueError if value <= 0
self.balance = self.balance + value
end
def compute_bonus
self.balance = self.balance * 1.01
end
end
class PayrollAccount < CheckingAccount
class OperationNotAllowed < StandardError; end
# ...
def compute_bonus
raise OperationNotAllowed
end
end
CheckingAccount.all.each do |account|
account.compute_bonus
end
CheckingAccount.all.each do |account|
begin
account.compute_bonus
rescue PayrollAccount::OperationNotAllowed
false
end
end
CheckingAccount.all.each do |account|
begin
account.compute_bonus
rescue PayrollAccount::OperationNotAllowed
false
end
end contrato quebrado
class PayrollAccount < CheckingAccount
# ...
def deposit(value)
raise InvalidValueError if value <= 100
self.balance = self.balance + value
end
def compute_bonus
self.balance = self.balance * 1.01
end
end
class PayrollAccount < CheckingAccount
# ...
def deposit(value)
raise InvalidValueError if value <= 100
self.balance = self.balance + value
end
def compute_bonus
self.balance = self.balance * 1.01
end
end
contrato quebrado
Deveriam ser classes diferentes
Exemplo clássico:
Retângulo x Quadrado
class Rectangle
attr_reader :width, :height
def initialize(width, height)
@width = width
@height = height
end
def area
width * height
end
end
class Square < Rectangle
attr_reader :width, :height
def initialize(width)
@width = width
@height = width
end
end
contrato quebrado
O que a gente precisa lembrar sobre esse princípio?
Interfaces/Abstração de comportamentos
Polimorfismo
Design by contract
Nem tudo que parece herança deveria ser uma herança
Até a próxima!

Mais conteúdo relacionado

PDF
Código Limpo
PPTX
PHP: operadores e variáveis (TGPSI)
PDF
SOLID a 6 mãos
PDF
GURU SP - Design de aplicações orientadas a objeto
PPTX
Interface
PDF
Design de aplicações orientadas a objeto
PDF
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
PPTX
Código Limpo
PHP: operadores e variáveis (TGPSI)
SOLID a 6 mãos
GURU SP - Design de aplicações orientadas a objeto
Interface
Design de aplicações orientadas a objeto
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...

Semelhante a Hacking Evening - Liskov Substitution Principle (20)

PDF
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
PPTX
DevTalk Zoox 04/2016
PPT
Linguagens Poo
PPT
Aop Aspect J 1.5.4
PPTX
Princípios solid
PDF
05 poo-ii
PDF
Refatoração - aquela caprichada no código
PDF
Removendo o cheiro ruim do seu código - SoLiSC 2011
PDF
Workshop React Hooks
PPTX
02 controle de fluxo
PDF
Excel VBA: Aula 8
PDF
Slide_Python.pdf
PDF
Pged 07
PDF
Tipos, literais, operadoes e controle de fluxo
PDF
Tipos, literais, operadoes e controle de fluxo
PDF
Conhecendo o Spring
KEY
Seus testes estão gritando. Você está ouvindo?
PDF
Functional programming feat. Swift (Portuguese)
PPTX
As Novidades Do C# 4.0 - NetPonto
PDF
Curso java script
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
DevTalk Zoox 04/2016
Linguagens Poo
Aop Aspect J 1.5.4
Princípios solid
05 poo-ii
Refatoração - aquela caprichada no código
Removendo o cheiro ruim do seu código - SoLiSC 2011
Workshop React Hooks
02 controle de fluxo
Excel VBA: Aula 8
Slide_Python.pdf
Pged 07
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxo
Conhecendo o Spring
Seus testes estão gritando. Você está ouvindo?
Functional programming feat. Swift (Portuguese)
As Novidades Do C# 4.0 - NetPonto
Curso java script

Mais de Elaine Naomi (15)

PDF
Code Smells: o que eles dizem sobre seu código?
PDF
Guru SP: Decodificando o code review
PDF
Bootcamp de Rails - CaquiCoders Meetup
PDF
TDC SP 2019 - Decodificando o code review
PDF
Além da programação funcional com Elixir e Erlang
PDF
Code review: o que isso diz sobre a cultura dos times de desenvolvimento?
PDF
Explorando o Paralelismo em Workflows Intensivos em Dados com o Uso de Anotaç...
PDF
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...
PDF
Dealing with a search engine in your application - a Solr approach for beginners
PDF
Um Método para Paralelização Automática de Workflows Intensivos em Dados
PDF
O que é BIG DATA e como pode influenciar nossas vidas
PDF
Introdução ao MongoDB
ODP
Workflows científicos
PDF
Algoritmos para economia de energia no escalonamento de workflows em nuvens c...
PDF
Qt Apresentação
Code Smells: o que eles dizem sobre seu código?
Guru SP: Decodificando o code review
Bootcamp de Rails - CaquiCoders Meetup
TDC SP 2019 - Decodificando o code review
Além da programação funcional com Elixir e Erlang
Code review: o que isso diz sobre a cultura dos times de desenvolvimento?
Explorando o Paralelismo em Workflows Intensivos em Dados com o Uso de Anotaç...
Uso de Anotações Semânticas para Exploração de Paralelismo em Workflows Inten...
Dealing with a search engine in your application - a Solr approach for beginners
Um Método para Paralelização Automática de Workflows Intensivos em Dados
O que é BIG DATA e como pode influenciar nossas vidas
Introdução ao MongoDB
Workflows científicos
Algoritmos para economia de energia no escalonamento de workflows em nuvens c...
Qt Apresentação

Último (12)

PDF
Processos no SAP Extended Warehouse Management, EWM100 Col26
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Utilizando code blockes por andre backes
PDF
Jira Software projetos completos com scrum
PPTX
Analise Estatica de Compiladores para criar uma nova LP
PPT
Conceitos básicos de Redes Neurais Artificiais
PPTX
Tipos de servidor em redes de computador.pptx
PPTX
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
Processos no SAP Extended Warehouse Management, EWM100 Col26
Viasol Energia Solar -Soluções para geração e economia de energia
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Manejo integrado de pragas na cultura do algodão
Utilizando code blockes por andre backes
Jira Software projetos completos com scrum
Analise Estatica de Compiladores para criar uma nova LP
Conceitos básicos de Redes Neurais Artificiais
Tipos de servidor em redes de computador.pptx
Aula 9 - Funções em Python (Introdução à Ciência da Computação)

Hacking Evening - Liskov Substitution Principle