O documento discute técnicas de refatoração de código, enfatizando a importância de manter os testes automatizados passando durante o processo de refatoração. A refatoração é apresentada como uma forma de melhorar a qualidade e manutenibilidade do código de forma incremental, sem alterar seu comportamento externo. Vários exemplos de code smells e refatorações são apresentados, como a introdução de value objects e parameter objects.
22. Renomear um método é simples?
- Quem chama o método vai quebrar? (conflitos de nomes)
23. 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)
24. 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!
26. Refactoring vs Rehacktoring
REFACTORING
- Testes passam a cada mudança
- Mantém comportamento externo
REHACKTORING
- Testes talvez passem
- Talvez mantém o comportamento
27. 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
28. 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
31. 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
32. 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
33. 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
45. 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.
52. 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
53. 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
54. 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
55. 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
56. 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
57. 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
65. 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
91. 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
108. 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
128. 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
...
134. 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
146. Quantidade de mudanças e acomplamento
https://www.youtube.com/watch?v=v-2yFMzxqwU
Probabilidade de mudanças
147. 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
148. 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
149.
150. 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
157. 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