SlideShare uma empresa Scribd logo
1 de 164
Baixar para ler offline
Refatorando
TUDO!
@marcosbrizeno
@marcosbrizeno
A única maneira
de ir rápido
é ter qualidade
https://pt.wikipedia.org/wiki/Procrastinação
tempo
esforço
prazo
tempo
esforço
tempo
esforço
O Scrum resolve
esse problema!
tempo
esforço
...
Iteração 1 Iteração 2 Iteração n...
...
tempo
esforço
You can't ship process
A única maneira
de ir rápido
é ter qualidade
https://www.youtube.com/watch?v=hG4LH6P8Syk
Mão na massa: Renomear um método
Mão na massa: Renomear um método
Renomear um método é simples!
Renomear um método é simples!
- Muda o nome do método
Renomear um método é simples!
- Muda o nome do método
- Procura onde é chamado e atualiza
Renomear um método é simples!
- Muda o nome do método
- Procura onde é chamado e atualiza
- Roda os testes
Renomear um método é simples!
Renomear um método é simples?
- Quem chama o método vai quebrar? (conflitos de nomes)
Renomear um método é simples?
- Quem chama o método vai quebrar? (conflitos de nomes)
- Mudar o nome do método não vai quebrar outro ponto? (metaprogramação)
Renomear um método é simples?
- Quem chama o método vai quebrar? (conflitos de nomes)
- Mudar o nome do método não vai quebrar outro ponto? (metaprogramação)
- Tudo ou nada!
Refactoring vs Rehacktoring
REFACTORING
- Testes passam a cada mudança
REHACKTORING
- Testes talvez passem
Refactoring vs Rehacktoring
REFACTORING
- Testes passam a cada mudança
- Mantém comportamento externo
REHACKTORING
- Testes talvez passem
- Talvez mantém o comportamento
Refactoring vs Rehacktoring
REFACTORING
- Testes passam a cada mudança
- Mantém comportamento externo
- Uma mudança por vez
REHACKTORING
- Testes talvez passem
- Talvez mantém o comportamento
- Várias mudanças
Refactoring vs Rehacktoring
REFACTORING
- Testes passam a cada mudança
- Mantém comportamento externo
- Uma mudança por vez
- Visão clara do objetivo final
REHACKTORING
- Testes talvez passem
- Talvez mantém o comportamento
- Várias mudanças
- Objetivo final incerto
Refatoração: Renomear método
1. Declare um método com o novo nome
Refatoração: Renomear método
1. Declare um método com o novo nome
a. Rode os testes
Refatoração: Renomear método
1. Declare um método com o novo nome
a. Rode os testes
2. Copie o código do método antigo para o novo (adaptando os parâmetros)
a. Rode os testes
Refatoração: Renomear método
1. Declare um método com o novo nome
a. Rode os testes
2. Copie o código do método antigo para o novo (adaptando os parâmetros)
a. Rode os testes
3. Faça o método antigo chamar o novo
a. Rode os testes
Refatoração: Renomear método
1. Declare um método com o novo nome
a. Rode os testes
2. Copie o código do método antigo para o novo (adaptando os parâmetros)
a. Rode os testes
3. Faça o método antigo chamar o novo
a. Rode os testes
4. Troque o método novo pelo método antigo (um por vez)
a. Rode os teste
Sério?Sério
Falta de feedback
Problemas ao
refatorar
Falta de feedback
Ciclo longo
Problemas ao
refatorar
Falta de feedback
Ciclo longo
Visão técnica
Problemas ao
refatorar
Mão na massa: Revisar um Pull Request
Julia Carlos
Mão na massa: Revisar um Pull Request
Mão na massa: Revisar um Pull Request
Mão na massa: Revisar um Pull Request
Mão na massa: Revisar um Pull Request
Mão na massa: Revisar um Pull Request
- Outras classes vão ter preços
- Também vão precisar retornar uma string com o preço cotado
- Será necessário ter mais operações envolvendo dinheiro
- Somar, subtrair, etc.
Seu código está "ruim".
Mas por quê?
Code Smells
Code Smells
Name five
Code Smells.
Code Smells
https://martinfowler.com/bliki/CodeSmell.html
Code Smells
Code Smells
http://mikamantyla.eu/BadCodeSmellsTaxonomy.html
Long Method
Large Class
Primitive obsession
Long Parameter List
Data Clump
Switch statements
Temporary field
Refused Bequest
Alternative classes
with diff interfaces
Divergent Change
Shotgun Surgery
Parallel Inheritance
Lazy Class
Data Class
Duplicated Code
Dead Code
Speculative Generality
Feature envy
Inappropriate Intimacy
Message Chains
Middle Man
Bloaters
http://mikamantyla.eu/BadCodeSmellsTaxonomy.html
Long Method
Large Class
Primitive obsession
Long Parameter List
Data Clump
Switch statements
Temporary field
Refused Bequest
Alternative classes
with diff interfaces
Divergent Change
Shotgun Surgery
Parallel Inheritance
Lazy Class
Data Class
Duplicated Code
Dead Code
Speculative Generality
Feature envy
Inappropriate Intimacy
Message Chains
Middle Man
Object Orientation Abusers
http://mikamantyla.eu/BadCodeSmellsTaxonomy.html
Long Method
Large Class
Primitive obsession
Long Parameter List
Data Clump
Switch statements
Temporary field
Refused Bequest
Alternative classes
with diff interfaces
Divergent Change
Shotgun Surgery
Parallel Inheritance
Lazy Class
Data Class
Duplicated Code
Dead Code
Speculative Generality
Feature envy
Inappropriate Intimacy
Message Chains
Middle Man
Change Preventers
http://mikamantyla.eu/BadCodeSmellsTaxonomy.html
Long Method
Large Class
Primitive obsession
Long Parameter List
Data Clump
Switch statements
Temporary field
Refused Bequest
Alternative classes
with diff interfaces
Divergent Change
Shotgun Surgery
Parallel Inheritance
Lazy Class
Data Class
Duplicated Code
Dead Code
Speculative Generality
Feature envy
Inappropriate Intimacy
Message Chains
Middle Man
The Couplers
http://mikamantyla.eu/BadCodeSmellsTaxonomy.html
Long Method
Large Class
Primitive obsession
Long Parameter List
Data Clump
Switch statements
Temporary field
Refused Bequest
Alternative classes
with diff interfaces
Divergent Change
Shotgun Surgery
Parallel Inheritance
Lazy Class
Data Class
Duplicated Code
Dead Code
Speculative Generality
Feature envy
Inappropriate Intimacy
Message Chains
Middle Man
The Dispensables
http://mikamantyla.eu/BadCodeSmellsTaxonomy.html
Long Method
Large Class
Primitive obsession
Long Parameter List
Data Clump
Switch statements
Temporary field
Refused Bequest
Alternative classes
with diff interfaces
Divergent Change
Shotgun Surgery
Parallel Inheritance
Lazy Class
Data Class
Duplicated Code
Dead Code
Speculative Generality
Feature envy
Inappropriate Intimacy
Message Chains
Middle Man
Por onde
começar?
99 Bottles of OOP
https://www.sandimetz.com/99bottles/
Code Smell: Data Clump
https://martinfowler.com/bliki/DataClump.html
Code Smell: Data Clump
lib/series.rb
Code Smell: Data Clump
lib/series.rb
Code Smell: Data Clump
lib/series.rb
Code Smell: Data Clump
lib/series.rb
Code Smell: Data Clump
lib/series.rb
Mão na massa: introduzir Value Class
1. Criar uma Value Class com construtores e getters
a. Deve incluir o valor e a moeda
2. Encapsular atributos ao invés de chamá-las diretamente
3. Instanciar Value Object junto com os atributos
4. Trocar chamada getter por getter da Value Class
5. Apagar atributos não utilizados
Value Class para representar dinheiro
lib/series.rb
Value Class para representar dinheiro
lib/dinheiro.rb
Value Class para representar dinheiro
lib/dinheiro.rb
Value Class para representar dinheiro
lib/dinheiro.rb
Encapsular atributos preco e moeda
lib/serie.rb
Encapsular atributos preco e moeda
lib/serie.rb
Encapsular atributos preco e moeda
lib/serie.rb
Encapsular atributos preco e moeda
lib/serie.rb
Encapsular atributos preco e moeda
lib/serie.rb
Instanciar Value Object junto com atributos
lib/serie.rb
Instanciar Value Object junto com atributos
lib/serie.rb
Instanciar Value Object junto com atributos
lib/serie.rb
Trocar chamada do getter pela value class
lib/serie.rb
Trocar chamada do getter pela value class
lib/serie.rb
Trocar chamada do getter pela value class
lib/serie.rb
Apagar atributos não utilizados
lib/serie.rb
Apagar atributos não utilizados
lib/serie.rb
Apagar atributos não utilizados
lib/serie.rb
Apagar atributos não utilizados
lib/serie.rb
Apagar atributos não utilizados
lib/serie.rb
Apagar atributos não utilizados
lib/serie.rb
Code Smell: Primitive Obsession
http://wiki.c2.com/?PrimitiveObsession
Code Smell: Primitive Obsession
lib/cotacao_util.rb
lib/serie.rb
Code Smell: Primitive Obsession
lib/cotacao_util.rb
lib/serie.rb
Mão na massa: introduzir Parameter Object
1. Criar uma estrutura para agrupar parâmetros (se não existir)
2. Mudar a assinatura do método
a. Criar um método com mesmo corpo e nova assinatura
b. Atualizar referências ao novo parâmetro
3. Chamar o método novo no método antigo
4. Atualizar as referências do métodos antigos
5. Apagar método antigo
Criar uma estrutura para agrupar parâmetros
lib/dinheiro.rb
Mudar a assinatura do método
lib/cotacao_util.rb
Mudar a assinatura do método
lib/cotacao_util.rb
Mudar a assinatura do método
lib/cotacao_util.rb
Mudar a assinatura do método
lib/cotacao_util.rb
Mudar a assinatura do método
lib/cotacao_util.rb
Mudar a assinatura do método
lib/cotacao_util.rb
Atualizar as referências do método antigo
lib/serie.rb
Atualizar as referências do método antigo
lib/serie.rb
Apagar método antigo
Code Smell: Feature Envy
http://wiki.c2.com/?FeatureEnvySmell
Code Smell: Feature Envy
lib/serie.rb
Code Smell: Feature Envy
lib/serie.rb
Code Smell: Feature Envy
lib/serie.rb
Code Smell: Feature Envy
lib/serie.rb
Mão na massa: mover método
1. Identificar e extrair o método que será movido
a. Copiar conteúdo para novo método
b. Converter variáveis locais em parâmetro
2. Copiar método para nova classe
a. trocar parâmetros por atributos (quando possível)
3. Trocar chamadas do método antigo pelo novo método
4. Apagar métodos antigos
Identificar e extrair o método que será movido
lib/serie.rb
Identificar e extrair o método que será movido
lib/serie.rb
Identificar e extrair o método que será movido
lib/serie.rb
Identificar e extrair o método que será movido
lib/serie.rb
Copiar método para nova classe
lib/dinheiro.rb
Copiar método para nova classe
lib/dinheiro.rb
Copiar método para nova classe
lib/dinheiro.rb
Trocar chamadas pelo método novo
lib/serie.rb
Trocar chamadas pelo método novo
lib/serie.rb
Trocar chamadas pelo método novo
lib/serie.rb
Apagar método antigo
Code Smell: Feature Envy
lib/serie.rb
lib/cotacao_util.rb
Code Smell: Feature Envy
lib/serie.rb
lib/cotacao_util.rb
Code Smell: Feature Envy
lib/serie.rb
lib/cotacao_util.rb
Classes Util/Service e Orientação a Objetos
Objetos se comunicam através de
mensagens, visando proteger
e esconder seu estado interno
Pensando orientado a objetos
Dinheiro
valor: int
moeda: String
exibir_moeda
converter_moeda
somar
...
Estados
Mensagens
Pensando orientado a objetos
obj
obj
obj
obj
obj
obj
Code Smell: Data Class
Dinheiro
valor: int
moeda: String
getValor: int
setValor: void
getMoeda: String
setMoeda: void
Estados
Mensagens
DinheiroService
exibir_moeda
converter_moeda
somar
...
Objetos anêmicos
Serviços/Util
Programação Procedural
Proragamação Procedural é ruim?
Usar uma linguagem OO para programar procedural é ruim!
Code Smell: Feature Envy
lib/serie.rb
lib/cotacao_util.rb
Mão na massa: mover método
1. Identificar e extrair o método que será movido
a. Copiar conteúdo para novo método
b. Converter variáveis locais em parâmetro
2. Copiar método para nova classe
a. trocar parâmetros por atributos (quando possível)
3. Trocar chamadas do método antigo pelo novo método
4. Apagar métodos antigos
Identificar e extrair o método que será movido
lib/serie.rb
Identificar e extrair o método que será movido
lib/serie.rb
Identificar e extrair o método que será movido
lib/serie.rb
Copiar método para nova classe
lib/dinheiro.rb
Copiar método para nova classe
lib/dinheiro.rb
Trocar chamadas pelo método novo
lib/serie.rb
Trocar chamadas pelo método novo
lib/serie.rb
Trocar chamadas pelo método novo
lib/serie.rb
Apagar método antigo
Como decidir o que depende do que?
Quantidade de mudanças e acomplamento
https://www.youtube.com/watch?v=v-2yFMzxqwU
Probabilidade de mudanças
Quantidade de mudanças e acomplamento
https://www.youtube.com/watch?v=v-2yFMzxqwU
Probabilidade de mudanças
Cotacao Dinheiro
Extrair os valores da
cotação para um
arquivo de configuração
Quantidade de mudanças e acomplamento
https://www.youtube.com/watch?v=v-2yFMzxqwU
Probabilidade de mudanças
Dependa da direita para a esquerda
Cotacao Dinheiro
Como melhorar seu código efetivamente
1. Entenda como seu programa vai evoluir (Keep it Simple, Stupid)
2. Identifique os Code Smells mais fáceis de resolver
3. Aplique refatorações
4. Repita até que o código esteja aberto a extensão
5. Aplique a mudança
Garantir que os
testes sempre passem
Feedback rápido
Garantir que os
testes sempre passem
Feedback rápido
Fácil de reverter
Garantir que os
testes sempre passem
Feedback rápido
Fácil de reverter
Reduz ansiedade
Code Smell -> Refactoring
https://refactoring.com/catalog/
Code Smell -> Refactoring
industriallogic.com/blog/smells-to-refactorings-cheatsheet/
Code Smell é ruim?
Simplicidade de código
Extreme Programming Explained: embrace change
Todos os testes passam
Sem duplicação
Mostra as intenções
Possui o menor número de classes ou métodos
Mais!
Refactoring
- Martin Fowler
Mais!
99 Bottles of Object
Oriented Programming
- Sandi Metz & Katrina Owen
Mais!
Refatorando com
Padrões de Projeto
- Marcos Brizeno
Mais!
Refatorando com
Padrões de Projeto
- Marcos Brizeno
20% - DIADOPROGRAMADOR_2017X
https://www.casadocodigo.com.br/products/livro-refatoracao-ruby
Valeu!@marcosbrizeno

Mais conteúdo relacionado

Semelhante a Refatorando tudo! [Agile brazil 2017]

Semelhante a Refatorando tudo! [Agile brazil 2017] (11)

Python tdc2019
Python tdc2019 Python tdc2019
Python tdc2019
 
Refatoração de código Python
Refatoração de código PythonRefatoração de código Python
Refatoração de código Python
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
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 )
 
Orientação a objetos php
Orientação a objetos   phpOrientação a objetos   php
Orientação a objetos php
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
Java20141219
Java20141219Java20141219
Java20141219
 
Programação OO - Java
Programação OO - JavaProgramação OO - Java
Programação OO - Java
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Code Smells: o que eles dizem sobre seu código?
Code Smells: o que eles dizem sobre seu código?Code Smells: o que eles dizem sobre seu código?
Code Smells: o que eles dizem sobre seu código?
 

Mais de Marcos Brizeno

GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017Marcos Brizeno
 
Developer Experience como diferencial na Transformação Digital
Developer Experience como diferencial na Transformação DigitalDeveloper Experience como diferencial na Transformação Digital
Developer Experience como diferencial na Transformação DigitalMarcos Brizeno
 
Desventuras em série adotando microserviços
Desventuras em série adotando microserviçosDesventuras em série adotando microserviços
Desventuras em série adotando microserviçosMarcos Brizeno
 
Aprenda Elixir em um final de semana
Aprenda Elixir em um final de semanaAprenda Elixir em um final de semana
Aprenda Elixir em um final de semanaMarcos Brizeno
 
5 mitos sobre código bom
5 mitos sobre código bom5 mitos sobre código bom
5 mitos sobre código bomMarcos Brizeno
 
Padrões de projeto superestimados
Padrões de projeto superestimadosPadrões de projeto superestimados
Padrões de projeto superestimadosMarcos Brizeno
 
Abraçando a mudança com Código
Abraçando a mudança com CódigoAbraçando a mudança com Código
Abraçando a mudança com CódigoMarcos Brizeno
 
Práticas Ágeis Distribuidas
Práticas Ágeis DistribuidasPráticas Ágeis Distribuidas
Práticas Ágeis DistribuidasMarcos Brizeno
 
The fine art of slacking
The fine art of slackingThe fine art of slacking
The fine art of slackingMarcos Brizeno
 
Aplicando padrões de projeto em Ruby
Aplicando padrões de projeto em RubyAplicando padrões de projeto em Ruby
Aplicando padrões de projeto em RubyMarcos Brizeno
 
Comunidade e Carreira: Você Ganha Todos Ganham
Comunidade e Carreira: Você Ganha Todos GanhamComunidade e Carreira: Você Ganha Todos Ganham
Comunidade e Carreira: Você Ganha Todos GanhamMarcos Brizeno
 
Entrega Contínua - E Eu Com Isso?
Entrega Contínua - E Eu Com Isso?Entrega Contínua - E Eu Com Isso?
Entrega Contínua - E Eu Com Isso?Marcos Brizeno
 
The fine art of slacking
The fine art of slackingThe fine art of slacking
The fine art of slackingMarcos Brizeno
 
Programar #COMOFAS ? - Rails Girls Fortaleza
Programar #COMOFAS ? - Rails Girls FortalezaProgramar #COMOFAS ? - Rails Girls Fortaleza
Programar #COMOFAS ? - Rails Girls FortalezaMarcos Brizeno
 
Metaprogramação Ruby
Metaprogramação RubyMetaprogramação Ruby
Metaprogramação RubyMarcos Brizeno
 

Mais de Marcos Brizeno (18)

GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017GraphQL ou APIs RESTful - DevDay 2017
GraphQL ou APIs RESTful - DevDay 2017
 
Developer Experience como diferencial na Transformação Digital
Developer Experience como diferencial na Transformação DigitalDeveloper Experience como diferencial na Transformação Digital
Developer Experience como diferencial na Transformação Digital
 
Desventuras em série adotando microserviços
Desventuras em série adotando microserviçosDesventuras em série adotando microserviços
Desventuras em série adotando microserviços
 
Aprenda Elixir em um final de semana
Aprenda Elixir em um final de semanaAprenda Elixir em um final de semana
Aprenda Elixir em um final de semana
 
5 mitos sobre código bom
5 mitos sobre código bom5 mitos sobre código bom
5 mitos sobre código bom
 
Padrões de projeto superestimados
Padrões de projeto superestimadosPadrões de projeto superestimados
Padrões de projeto superestimados
 
Abraçando a mudança com Código
Abraçando a mudança com CódigoAbraçando a mudança com Código
Abraçando a mudança com Código
 
Práticas Ágeis Distribuidas
Práticas Ágeis DistribuidasPráticas Ágeis Distribuidas
Práticas Ágeis Distribuidas
 
The fine art of slacking
The fine art of slackingThe fine art of slacking
The fine art of slacking
 
Aplicando padrões de projeto em Ruby
Aplicando padrões de projeto em RubyAplicando padrões de projeto em Ruby
Aplicando padrões de projeto em Ruby
 
Comunidade e Carreira: Você Ganha Todos Ganham
Comunidade e Carreira: Você Ganha Todos GanhamComunidade e Carreira: Você Ganha Todos Ganham
Comunidade e Carreira: Você Ganha Todos Ganham
 
Dubles de teste
Dubles de testeDubles de teste
Dubles de teste
 
Entrega Contínua - E Eu Com Isso?
Entrega Contínua - E Eu Com Isso?Entrega Contínua - E Eu Com Isso?
Entrega Contínua - E Eu Com Isso?
 
The fine art of slacking
The fine art of slackingThe fine art of slacking
The fine art of slacking
 
Programar #COMOFAS ? - Rails Girls Fortaleza
Programar #COMOFAS ? - Rails Girls FortalezaProgramar #COMOFAS ? - Rails Girls Fortaleza
Programar #COMOFAS ? - Rails Girls Fortaleza
 
Metaprogramação Ruby
Metaprogramação RubyMetaprogramação Ruby
Metaprogramação Ruby
 
Arquitetura Ágil
Arquitetura ÁgilArquitetura Ágil
Arquitetura Ágil
 
Clean code
Clean codeClean code
Clean code
 

Refatorando tudo! [Agile brazil 2017]