class Cachorro < Animal
end
class Gato < Animal
end
Slide 11
Slide 11 text
No content
Slide 12
Slide 12 text
Pense em uma fruta
Slide 13
Slide 13 text
No content
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
#1. Objetos devem
ser modelados do
ponto de vista de
negócio
Slide 16
Slide 16 text
No content
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
No content
Slide 22
Slide 22 text
#2. Princípio de
substituição de
Liskov
Slide 23
Slide 23 text
O mesmo código que
funciona com um
tipo, deve funcionar
com um subtipo
Slide 24
Slide 24 text
passaros.each do |passaro|
passaro.voar
end
Slide 25
Slide 25 text
passaros.each do |passaro|
passaro.voar
end
=> NotImplementedError: pinguins não voam
Slide 26
Slide 26 text
passaros.each do |passaro|
passaro.voar unless passaro.is_a?(Pinguim)
end
Slide 27
Slide 27 text
Mensagens que
recebe e envia
Slide 28
Slide 28 text
Forte acoplamento
Slide 29
Slide 29 text
#3. Não deve ser
somente para
reutilizar código
Slide 30
Slide 30 text
class TextField
def initialize(name, size, value)
@name, @size, @value = name, size, value
end
def render
...
end
end
Slide 31
Slide 31 text
class TextField
def initialize(name, size, value)
@name, @size, @value = name, size, value
end
def render
...
end
end
Slide 32
Slide 32 text
class DateField < TextField
def initialize(name, size, value)
super(name, size, format_date(value))
end
def format_date(value)
value.strftime("%Y-%m-%d")
end
end
Slide 33
Slide 33 text
class DateField < TextField
def initialize(name, size, value)
super(name, size, format_date(value))
end
def format_date(value)
value.strftime("%Y-%m-%d")
end
end
Slide 34
Slide 34 text
class DateField < TextField
def initialize(name, size, value)
super(name, size, format_date(value))
end
def format_date(value)
value.strftime("%Y-%m-%d")
end
end
Slide 35
Slide 35 text
class TimeField < DateField
def format_date(value)
value.strftime("%T.%L")
end
end
Slide 36
Slide 36 text
class TimeField < DateField
def format_date(value)
value.strftime("%T.%L")
end
end
Slide 37
Slide 37 text
Cuidado com
especializações
pequenas
Slide 38
Slide 38 text
class TimeField < DateField
def format_date(value)
...
end
end
Slide 39
Slide 39 text
Cuidado ao remover
comportamentos
Slide 40
Slide 40 text
class DateField < TextField
def initialize(name, size, value)
super(name, size, format_date(value))
end
def format_date(value)
value.strftime("%Y-%m-%d")
end
end
Slide 41
Slide 41 text
class DateField < TextField
def initialize(name, value)
super(name, nil, format_date(value))
end
def format_date(value)
value.strftime("%Y-%m-%d")
end
end
Slide 42
Slide 42 text
Composição
Slide 43
Slide 43 text
class TextField
def initialize(name, size, value, formatter)
@name, @size = name, size
@value = formatter.format(value)
end
def render
...
end
end
Slide 44
Slide 44 text
class DateFormatter
def self.format(value)
value.strftime("%Y-%m-%d")
end
end
Slide 45
Slide 45 text
Don't repeat
yourself
Slide 46
Slide 46 text
No content
Slide 47
Slide 47 text
Don't repeat
yourself?
Slide 48
Slide 48 text
#4. The Rule of Three
Slide 49
Slide 49 text
Três lugares ao invés
de dois
Slide 50
Slide 50 text
https://martinfowler.com/books/refactoring.html
Slide 51
Slide 51 text
Regra não, guia
Slide 52
Slide 52 text
Duplication is far cheaper
than the wrong abstraction
— Sandi Metz
Slide 53
Slide 53 text
No content
Slide 54
Slide 54 text
Reconsidere a
abordagem
Slide 55
Slide 55 text
Junte seu time e
converse sobre o
domínio
Slide 56
Slide 56 text
Junte seu time e
converse sobre os
casos de uso
Slide 57
Slide 57 text
Deixe as coisas iguais
para achar o que é
diferente
Slide 58
Slide 58 text
A chegada de uma nova
feature que não encaixa na
abstração atual é o melhor
momento para refatorar