Você está na página 1de 71

Refatorar!

Porque ningum gosta de cdigo que cheira mal


@andreitognolo
github.com/elsouza
eliaslsouza@gmail.com
"Um bom desenvolvedor consegue entender
qualquer cdigo.
(Annimo)
"Um bom programador consegue escrever
cdigo que qualquer um entende"
(Outro annimo, mais sbio)
H
u
m
a
n
-
R
e
a
d
a
b
l
e

C
o
d
e
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! So apenas segundos!
Segundos! So apenas segundos!
Voc acha que voc sempre faz um
cdigo bom?
Voc acha que a gente sempre faz um
cdigo bom?
Saca s
Saca s:
/elsouza
if (!StringUtils.isNullOrEmpty(texto)
&& !texto.equals("")) {
//...
}
itemDePauta.adicionaValor(
"campo" +
++posicaoCampoNaTabela,
texto.replaceAll("", "")
.replaceAll("\n", "")
.trim());
O que fazer ento?
Sempre refatorar
?
Parte I
Como 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 refatorao que no 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
refatorao de sua
IDE
sempre que voc modifica
algo em um mtodo, voc
tem que deixar ele melhor
do que encontrou
Moral da histria
Ah, mas e quando tenho que
alterar uma funcionalidade j
existente, como eu fao?
#1
Tem teste?
No...
Escrever teste
Implementar
E quando o cdigo j existe, funciona e
eu quero melhorar?
O que refatorar?
" o processo de modificar
um sistema de software para
melhorar a estrutura interna
do cdigo sem alterar
seu comportamento
externo"
Wikipedia
Alterar cdigo que existe e
funciona?
Se eu tenho cobertura de testes,
eu sou corajoso
Escrever teste
Refatorar
Eu comeo a refatorar pelo mesmo caminho
que eu comeo 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 refatoraes a cada momento
No existem refatoraes
monstruosas sem pequenos passos
Passos consistentes
Parte II
Tcnicas de refatorao
O que refatorar?
Code Smells
Cdigo duplicado
Cdigo 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
Cenrio
M

t
o
d
o

l
o
n
g
o
C
o
m
p
l
e
x
i
d
a
d
e

c
o
n
d
i
c
i
o
n
a
l
M

t
o
d
o

l
o
n
g
o
C
o
m
p
l
e
x
i
d
a
d
e

c
o
n
d
i
c
i
o
n
a
l
Princpio da
responsabilidade
nica (Classe enorme)
M

t
o
d
o

l
o
n
g
o
(clique para ver o vdeo)
1. Criar classe VendaAPrazo e VendaAVista
2. Introduce Factory (roda teste)
3. Alterar o mtodo 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 vdeo)
Resumo
Ser responsvel de verdade pelo seu cdigo
Voc no vai ter tempo/dinheiro para uma refatorao grande
Pequenos passos, passos consistentes
Refatorando continuamente
Saber identificar os smells o primeiro passo
Conhecer as tcnicas de refatorao essencial
Onde saber mais?

Você também pode gostar