devcamp 2013 - refatorar! porque ninguém gosta de código que cheira mal

71
Refatorar! Porque ninguém gosta de código que cheira mal

Upload: elias-souza

Post on 25-Jun-2015

529 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Refatorar!Porque ninguém gosta de código que cheira mal

Page 2: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

@andreitognolo

Page 3: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

github.com/[email protected]

Page 4: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

"Um bom desenvolvedor consegue entender qualquer código.”

(Anônimo)

Page 5: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

"Um bom programador consegue escrever código que qualquer um entende"

(Outro anônimo, mais sábio)

Page 6: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Human-Readable Code

Page 7: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

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)

Page 8: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Date data = geraData(15, Calendar.DECEMBER, 2013);System.out.println(data);

Page 9: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Segundos! São apenas segundos!Segundos! São apenas segundos!

Page 10: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 11: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 12: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Você acha que você sempre faz um

código bom?

Page 13: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Você acha que a gente sempre faz um

código bom?

Page 14: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 15: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Saca sóSaca só:

/elsouza

Page 16: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

if (!StringUtils.isNullOrEmpty(texto)

&& !texto.equals("")) {

//...

}

Page 17: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

itemDePauta.adicionaValor(

"campo" +

++posicaoCampoNaTabela,

texto.replaceAll("", "")

.replaceAll("\n", "")

.trim());

Page 18: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 19: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

O que fazer então?

Page 20: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 21: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 22: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Sempre refatorar

Page 23: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 24: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

?

Page 25: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Parte IComo eu consigo tempo para refatorar?

Page 26: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

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 }

Page 27: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

"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)

Page 28: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Tem refatoração que não da problema...

Page 29: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

if (!StringUtils.isNullOrEmpty(texto)

&& !texto.equals("")) {

//...

}

Page 30: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

if (!StringUtils.isNullOrEmpty(texto)) {

//...

}

Page 31: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

itemDePauta.adicionaValor(

"campo" +

++posicaoCampoNaTabela,

texto.replaceAll("", "")

.replaceAll("\n", "")

.trim());

Page 32: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

itemDePauta.adicionaValor(

"campo" +

++posicaoCampoNaTabela,

texto.replaceAll("\n", "")

.trim());

Page 33: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

E isso é ainda mais verdade

se você utilizar as ferramentas de refatoração de sua IDE

Page 34: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 35: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 36: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

sempre que você modifica algo em um método, você tem que deixar ele melhor do que encontrou

Moral da história

Page 37: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Ah, mas e quando tenho que alterar uma funcionalidade já existente, como eu faço?

Page 38: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

#1

Page 39: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Tem teste?

Page 40: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Não...

Page 41: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Escrever teste

Implementar

Page 42: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

E quando o código já existe, funciona e eu quero melhorar?

Page 43: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

O que é refatorar?

Page 44: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

"é o processo de modificar um sistema de software para melhorar a estrutura interna do código sem alterar seu comportamento externo"Wikipedia

Page 45: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Alterar código que existe e funciona?

Page 46: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 47: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Se eu tenho cobertura de testes, eu sou corajoso

Page 48: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Escrever teste

Refatorar

Page 49: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Eu começo a refatorar pelo mesmo caminho que eu começo a implementar: o TESTE

Page 50: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Escrever teste

Implementar

Escrever teste

Refatorar

Page 51: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Escrever teste

Implementa nova funcionalidade

Refatora o que acabou de desenvolver

Refatora o que já existe

Page 52: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Pequenas refatorações a cada momento

Não existem refatorações monstruosas sem pequenos passos

Passos consistentes

Page 53: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Parte IITécnicas de refatoração

Page 54: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 55: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

O que refatorar?

Page 56: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 57: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 58: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Code Smells

Código duplicadoCódigo duplicado

if (temComplexidadeCondicional){codigo = "Meu deus, como cheira mal";

} else {codigo = "Legal!";

}

Page 59: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

● 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

Page 60: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 61: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 62: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Mét

od

o lo

ngo

Page 63: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Co

mp

lexi

dad

e co

ndic

iona

l

Mét

od

o lo

ngo

Page 64: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Co

mp

lexi

dad

e co

ndic

iona

lPrincípio da responsabilidade única (Classe enorme)

Mét

od

o lo

ngo

Page 65: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

(clique para ver o vídeo)

Page 66: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal
Page 67: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

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

Page 68: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

(clique para ver o vídeo)

Page 69: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

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

Page 70: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal

Onde saber mais?

Page 71: DEVCAMP 2013 - Refatorar! porque ninguém gosta de código que cheira mal