UM GUIA DE SOBREVIVÊNCIA
USANDO RUBY
REFATORAÇÃO
RUBYCONF BRASIL
GABRIEL SILVA PEREIRA
▸ Pai da Maria Luiza;
▸ Esposo da Marcella;
▸ Corinthiano;
▸ Consultor e Desenvolvedor de
Software na ThoughtWorks em
Belo Horizonte.
@gabrielpedepera
RUBYCONF BRASIL
https://www.thoughtworks.com/pt/careers/jobs
RUBYCONF BRASIL
O QUE É
REFATORAÇÃO?
MELHORAR O
DESIGN EXISTENTE
APLICAR MUDANÇAS
EM PEQUENOS PASSOS
EVITAR DEIXAR O
SISTEMA QUEBRADO
"A refatoração consiste na mudança do
design de um trecho de código em
pequenas etapas, sem alterar sua
funcionalidade, garantindo que o código
continue a funcionar após cada etapa.”
POR QUE REFATORAR?
ENTROPIA
Entropia: desordem interna de um
sistema, ou ainda, tem a ver com a
irreversibilidade da ordem.
RUBYCONF BRASIL
ENTROPIA EM SISTEMAS COMPUTACIONAIS
▸ Por intervenção:
A cada intervenção, a
entropia do sistema cresce
de maneira
exponencialmente
proporcional à atual entropia
do sistema.
▸ Por potencial:
A entropia do sistema
cresce à medida em que a
diferença entre a ordem
interna e a ordem externa
crescem.
COMO A ENTROPIA AFETA A
EVOLUÇÃO DE UM SISTEMA
COMPUTACIONAL?
RUBYCONF BRASIL
ENTROPIA x RESISTÊNCIA À MUDANÇA
ENTROPIA
RESISTÊNCIA À MUDANÇA
RUBYCONF BRASIL
RUBYCONF BRASIL
A refatoração é a válvula
de escape da entropia do
sistema
QUANDO REFATORAR?
▸ Há equipes que
planejam os esforços de
refatoração como uma
tarefa separada.
RUBYCONF BRASIL
OBJETIVOS DO DESENVOLVEDOR
▸ Entregar funcionalidades;
▸ AGILIDADE: valorizar software
funcionando;
▸ Resolver problemas.
SENDO ASSIM…
RUBYCONF BRASIL
SENDO ASSIM
▸ A refatoração deve ser uma atividade suporte no
desenvolvimento;
RUBYCONF BRASIL
SENDO ASSIM
▸ A refatoração deve ser uma atividade suporte no
desenvolvimento;
▸ Precisa ser dosada e aplicada com efetividade;
RUBYCONF BRASIL
SENDO ASSIM
▸ A refatoração deve ser uma atividade suporte no
desenvolvimento;
▸ Precisa ser dosada e aplicada com efetividade;
▸ Analise o código e se pergunte: Se eu tivesse um minuto
para refatorar, onde eu o utilizaria?
COMO REFATORAR?
PROCURE POR CODE SMELLS
A code smell is a surface
indication that usually
corresponds to a deeper
problem in the system. The term
was first coined by Kent Beck
while helping me with
my Refactoring book.
Martin Fowler
RUBYCONF BRASIL
▸ Long Method
▸ Large Class
▸ Primitive Obsession
▸ Long Parameter List
▸ DataClumps
▸ Switch Statements
▸ Temporary Field
▸ Refused Bequest
▸ Alternative Classes with
Different Interfaces
▸ Divergent Change
▸ Shotgun Surgery 
▸ Parallel Inheritance
Hierarchies
▸ Lazy class
▸ Data class 
▸ Duplicate Code
▸ Dead Code, 
▸ Speculative
Generality
▸ Feature Envy
▸ Inappropriate Intimacy
▸ Message Chains
▸ Middle Man
CODE SMELLShttp://mikamantyla.eu/BadCodeSmellsTaxonomy.html
THE BLOATERS
THE OO ABUSERS
THE CHANGE PREVENTERS
THE DISPENSABLES
THE COUPLERS
DESIGN PATTERNS x
CODE SMELLS
RUBYCONF BRASIL
MÉTODO LONGO (LONG METHOD)
▸ Extração de Método
▸ Introdução de parâmetros
▸ Decomposição de condicional
POSSÍVEIS SOLUÇÕES
▸ Fere o princípio de separação das responsabilidades
▸ Diminui o reaproveitamento e a manutenibilidade
RUBYCONF BRASIL
CLASSES GRANDES (LARGE CLASS)
▸ Extração de Classes
▸ Extração de Subclasses
POSSÍVEIS SOLUÇÕES
▸ Muitos métodos e atributos
RUBYCONF BRASIL
LISTA DE PARÂMETROS LONGA (LONG PARAMETER LIST)
▸ Extração de Classes
▸ Extração de Subclasses
POSSÍVEIS SOLUÇÕES
▸ São difíceis de entender
▸ Se muito utilizado, o método tende a receber muitos parâmetros
vazios
▸ Verificações e variáveis desnecessárias dificultam o entendimento
CODE SMELL
COMENTÁRIOS (DESODORANTE)
RUBYCONF BRASIL
RENOMEAR UM MÉTODO
# method to calculate the final price
def calculate(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
it 'calculate the final price with a modifier of 10%' do
expect(calculate(100, 10)).to eq(110)
end
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES!
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES!
▸ Muda o nome do método
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES!
▸ Muda o nome do método
▸ Procura onde é chamado e atualiza
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES!
▸ Muda o nome do método
▸ Procura onde é chamado e atualiza
▸ Roda os testes
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES?
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES?
▸ Quem chama o método vai quebrar? (conflito de nomes)
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES?
▸ Quem chama o método vai quebrar? (conflito de nomes)
▸ Mudar o nome do método não vai quebrar outro ponto?
(metaprogramação)
RUBYCONF BRASIL
RENOMEAR UM MÉTODO É SIMPLES?
▸ Quem chama o método vai quebrar? (conflito de nomes)
▸ Mudar o nome do método não vai quebrar outro ponto?
(metaprogramação)
▸ Tudo ou nada!
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
# method to calculate the final price
def calculate(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
it 'calculate the final price with a modifier of 10%' do
expect(calculate(100, 10)).to eq(110)
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
1. Declare um método com um novo nome, que chama o
anterior.
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
1. Declare um método com um novo nome, que chama o
anterior.
def final_price(price, percent_modifier)
calculate(price, percent_modifier)
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
1. Declare um método com um novo nome, que chama o
anterior.
• Rode os testes
def final_price(price, percent_modifier)
calculate(price, percent_modifier)
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
1. Declare um método com um novo nome, que chama o
anterior.
• Rode os testes
def final_price(price, percent_modifier)
calculate(price, percent_modifier)
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
2. Agora, podemos atualizar os testes chamando o novo
método.
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
2. Agora, podemos atualizar os testes chamando o novo
método.
it 'calculate the final price with a modifier of 10%' do
expect(final_price(100, 10)).to eq(110)
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
2. Agora, podemos atualizar os testes chamando o novo
método.
• Rode os testes
it 'calculate the final price with a modifier of 10%' do
expect(final_price(100, 10)).to eq(110)
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
2. Agora, podemos atualizar os testes chamando o novo
método.
• Rode os testes
it 'calculate the final price with a modifier of 10%' do
expect(final_price(100, 10)).to eq(110)
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo.
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo.
# method to calculate the final price
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo:
• Rode os testes
# method to calculate the final price
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo:
• Rode os testes
# method to calculate the final price
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
RUBYCONF BRASIL
REFATORAÇÃO: RENOMEAR UM MÉTODO
3. Por fim, atualizamos o nome do método e apagamos o
antigo:
• Rode os testes
def final_price(price, percent_modifier)
if percent_modifier.nil? || percent_modifier < 10
price
else
price * (percent_modifier / 100)
end
end
SÉRIO?
SÉRIO.
A ÚNICA MANEIRA DE IR
RÁPIDO É COM QUALIDADE
RUBYCONF BRASIL
REFATORANDO TUDO!
https://www.slideshare.net/marcosbrizeno/refatorando-tudo-agile-brazil-2017
TIPOS DE ATRITO À
REFATORAÇÃO
RUBYCONF BRASIL
ATRITO CULTURAL
▸ É muito comum equipes tem o
mindset SCP (smallest change
possible ou menor alteração
possível)
RUBYCONF BRASIL
ATRITO ARQUITETURAL
▸ Impacto Desconhecido: Quando
percebo que não sei qual o
impacto que a refatoração tem
sobre o funcionamento do sistema.
▸ Impacto Indesejável: Quando
percebo que a refatoração tem
impacto em algo que eu não quero
ou posso mudar.
RUBYCONF BRASIL
ATRITO SISTÊMICO
▸ O negócio não muda mais, e o
sistema já atende ao negócio de
forma satisfatória.
RUBYCONF BRASIL
ATRITO DE CONHECIMENTO
▸ A equipe não é fluente na
tecnologia em que está
trabalhando.
RUBYCONF BRASIL
APLICAÇÕES QUE EVOLUEM
https://pt.slideshare.net/devcamp/fbio-lima-santos-desenhando-aplicaes-que-evoluem
RUBYCONF BRASIL
REVISANDO…
‣ A refatoração é um processo contínuo para manter e
recuperar a qualidade da nossa aplicação, potencializando
a evolução do software.
‣E deve ser parte constante do processo de
desenvolvimento, pois permite à equipe continuar o
trabalho de evolução com os recursos necessários.
LIVROS
THE MOST
DANGEROUS PHRASE
IN THE LANGUAGE IS
WE'VE ALWAYS
DONE.
Grace Hopper
OBRIGADO.
Gabriel Pereira
@gabrielpedepera
OBRIGADO!
RUBYCONF BRASIL
REFERÊNCIAS
▸ https://pt.slideshare.net/devcamp/fbio-lima-santos-desenhando-aplicaes-que-
evoluem
▸ https://www.slideshare.net/marcosbrizeno/refatorando-tudo-agile-brazil-2017
▸ https://www.casadocodigo.com.br/products/livro-refatoracao-ruby
▸ http://vschettino.com.br/blog/introducao_refatoracao
▸ http://www.industriallogic.com/wp-content/uploads/2005/09/
smellstorefactorings.pdf
▸ https://martinfowler.com/bliki/CodeSmell.html
▸ http://mikamantyla.eu/BadCodeSmellsTaxonomy.html

RubyConf Brasil - 2018