Upload
elias-souza
View
529
Download
0
Embed Size (px)
Citation preview
Refatorar!Porque ninguém gosta de código que cheira mal
@andreitognolo
github.com/[email protected]
"Um bom desenvolvedor consegue entender qualquer código.”
(Anônimo)
"Um bom programador consegue escrever código que qualquer um entende"
(Outro anônimo, mais sábio)
Human-Readable Code
Calendar cal = new Calendar.getInstance();cal.set(Calendar.YEAR, 2012);cal.set(Calendar.MONTH, CALENDAR.NOVEMBER);cal.set(Calendar.DAY, 20);Date data = cal.getTime();
System.out.println(data);
Fonte: Refactoring to Patterns (by Joshua Kerievsky)
Date data = geraData(15, Calendar.DECEMBER, 2013);System.out.println(data);
Segundos! São apenas segundos!Segundos! São apenas segundos!
Você acha que você sempre faz um
código bom?
Você acha que a gente sempre faz um
código bom?
Saca sóSaca só:
/elsouza
if (!StringUtils.isNullOrEmpty(texto)
&& !texto.equals("")) {
//...
}
itemDePauta.adicionaValor(
"campo" +
++posicaoCampoNaTabela,
texto.replaceAll("", "")
.replaceAll("\n", "")
.trim());
O que fazer então?
Sempre refatorar
?
Parte IComo eu consigo tempo para refatorar?
100 joao if (...) {100 joao if (...)100 joao resultado = 1;100 joao if (...)100 joao resultado = 2;150 joaquim if (...)150 joaquim resultado = 3;100 joao }
"The single most important trait of a professional programmer
is personal responsibility [...]. A professional
programmer does not pass that responsibility off on others".
(Uncle Bob)
Tem refatoração que não da problema...
if (!StringUtils.isNullOrEmpty(texto)
&& !texto.equals("")) {
//...
}
if (!StringUtils.isNullOrEmpty(texto)) {
//...
}
itemDePauta.adicionaValor(
"campo" +
++posicaoCampoNaTabela,
texto.replaceAll("", "")
.replaceAll("\n", "")
.trim());
itemDePauta.adicionaValor(
"campo" +
++posicaoCampoNaTabela,
texto.replaceAll("\n", "")
.trim());
E isso é ainda mais verdade
se você utilizar as ferramentas de refatoração de sua IDE
sempre que você modifica algo em um método, você tem que deixar ele melhor do que encontrou
Moral da história
Ah, mas e quando tenho que alterar uma funcionalidade já existente, como eu faço?
#1
Tem teste?
Não...
Escrever teste
Implementar
E quando o código já existe, funciona e eu quero melhorar?
O que é refatorar?
"é o processo de modificar um sistema de software para melhorar a estrutura interna do código sem alterar seu comportamento externo"Wikipedia
Alterar código que existe e funciona?
Se eu tenho cobertura de testes, eu sou corajoso
Escrever teste
Refatorar
Eu começo a refatorar pelo mesmo caminho que eu começo a implementar: o TESTE
Escrever teste
Implementar
Escrever teste
Refatorar
Escrever teste
Implementa nova funcionalidade
Refatora o que acabou de desenvolver
Refatora o que já existe
Pequenas refatorações a cada momento
Não existem refatorações monstruosas sem pequenos passos
Passos consistentes
Parte IITécnicas de refatoração
O que refatorar?
Code Smells
Código duplicadoCódigo duplicado
if (temComplexidadeCondicional){codigo = "Meu deus, como cheira mal";
} else {codigo = "Legal!";
}
● Sistema de vendas
● Cada venda tem itens
● O valor total da venda é a soma dos itens
● Uma venda pode ser parcelada
● Se a venda for parcelada ela pode ter juros
Cenário
Mét
od
o lo
ngo
Co
mp
lexi
dad
e co
ndic
iona
l
Mét
od
o lo
ngo
Co
mp
lexi
dad
e co
ndic
iona
lPrincípio da responsabilidade única (Classe enorme)
Mét
od
o lo
ngo
(clique para ver o vídeo)
1. Criar classe VendaAPrazo e VendaAVista
2. Introduce Factory (roda teste)
3. Alterar o método factory (roda teste)
4. Classe Venda abstract
5. Extract Method calcularJuros (roda teste)
6. CalcularJuros na VendaAVista, retornar 1 (roda teste)
7. CalcularJuros na VendaAPrazo, fazer conta (roda teste)
8. CalcularJuros na Venda como abstract (roda teste)
9. Tirar a factory (?)
Roteiro
(clique para ver o vídeo)
Resumo
● Ser responsável de verdade pelo seu código
● Você não vai ter tempo/dinheiro para uma refatoração grande
● Pequenos passos, passos consistentes
● Refatorando continuamente
● Saber identificar os smells é o primeiro passo
● Conhecer as técnicas de refatoração é essencial
Onde saber mais?