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

Post on 25-Jun-2015

529 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

@andreitognolo

github.com/elsouzaeliaslsouza@gmail.com

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

top related