SlideShare uma empresa Scribd logo
1 de 78
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados (9)

Curso de Shell Script 10/11
Curso de Shell Script 10/11Curso de Shell Script 10/11
Curso de Shell Script 10/11
 
Estrutura de Dados - Características da linguagem C - 2
Estrutura de Dados - Características da linguagem C - 2Estrutura de Dados - Características da linguagem C - 2
Estrutura de Dados - Características da linguagem C - 2
 
Conceitos e técnicas de programação aula 5
Conceitos e técnicas de programação aula 5Conceitos e técnicas de programação aula 5
Conceitos e técnicas de programação aula 5
 
Lógica de Programação - Estrutura de repetição
Lógica de Programação - Estrutura de repetiçãoLógica de Programação - Estrutura de repetição
Lógica de Programação - Estrutura de repetição
 
Lógica de programação
Lógica de programaçãoLógica de programação
Lógica de programação
 
Estrutura de decisão switch case
Estrutura de decisão switch caseEstrutura de decisão switch case
Estrutura de decisão switch case
 
PHP 5.3 - Estruturas de Controle
PHP 5.3 - Estruturas de ControlePHP 5.3 - Estruturas de Controle
PHP 5.3 - Estruturas de Controle
 
Aula 12 - Começando a programar : repetição
Aula 12 - Começando a programar : repetiçãoAula 12 - Começando a programar : repetição
Aula 12 - Começando a programar : repetição
 
Capítulo 2 - Python
Capítulo 2 - PythonCapítulo 2 - Python
Capítulo 2 - Python
 

Semelhante a RubyConf Brasil - 2018

Semelhante a RubyConf Brasil - 2018 (12)

Introdução a Desenvolvimento Orientado a Testes ( TDD )
Introdução a Desenvolvimento Orientado a Testes ( TDD )Introdução a Desenvolvimento Orientado a Testes ( TDD )
Introdução a Desenvolvimento Orientado a Testes ( TDD )
 
Refatorando tudo! [Agile brazil 2017]
Refatorando tudo! [Agile brazil 2017] Refatorando tudo! [Agile brazil 2017]
Refatorando tudo! [Agile brazil 2017]
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Refactoring
RefactoringRefactoring
Refactoring
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 
Solid
SolidSolid
Solid
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Introdução a programação I
Introdução a programação IIntrodução a programação I
Introdução a programação I
 
Algoritmo recursivo
Algoritmo recursivoAlgoritmo recursivo
Algoritmo recursivo
 

Mais de Gabriel Pereira (7)

Migrando um legado de 30M de Requests/Dia
Migrando um legado de 30M de Requests/DiaMigrando um legado de 30M de Requests/Dia
Migrando um legado de 30M de Requests/Dia
 
Intro - Ruby e Ruby on Rails
Intro - Ruby e Ruby on RailsIntro - Ruby e Ruby on Rails
Intro - Ruby e Ruby on Rails
 
Csm o quê eu aprendi?
Csm   o quê eu aprendi?Csm   o quê eu aprendi?
Csm o quê eu aprendi?
 
Programadores. Quem são eles? Onde vivem? O que comem?
Programadores. Quem são eles? Onde vivem? O que comem?Programadores. Quem são eles? Onde vivem? O que comem?
Programadores. Quem são eles? Onde vivem? O que comem?
 
Coding dojo
Coding dojoCoding dojo
Coding dojo
 
Daily Stand Up Meeting
Daily Stand Up MeetingDaily Stand Up Meeting
Daily Stand Up Meeting
 
Desenvolvimento de Aplicações Sociais com Ruby
Desenvolvimento de Aplicações Sociais com RubyDesenvolvimento de Aplicações Sociais com Ruby
Desenvolvimento de Aplicações Sociais com Ruby
 

Último

Último (8)

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

RubyConf Brasil - 2018