beljug2010

75
Boas práticas e refatoração: Longevidade para o seu código Gustavo Pinto @gustavopinto www.gustavopinto.net

Upload: gustavo-pinto

Post on 10-Jul-2015

782 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Beljug2010

Boas práticas e refatoração:

Longevidade para o seu

código

Gustavo Pinto

@gustavopinto

www.gustavopinto.net

Page 2: Beljug2010

Antes de qualquer coisa...

.. não estou falando mal do seu código!

Page 3: Beljug2010

Agenda – Parte I

• Interfaces

• Herança

• Strings

Page 4: Beljug2010

Agenda – Parte I

• Interfaces

• Herança

• Strings

Page 5: Beljug2010

Interfaces

?

Page 6: Beljug2010

Interfaces

?

Page 7: Beljug2010

Interfaces

Page 8: Beljug2010

Interfaces

Page 9: Beljug2010

Interfaces

implements

Page 10: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Page 11: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Carro carro = new Gol();

Carro carro = new Bwm();

Carro carro = new Fusca();

Page 12: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Carro carro = new Gol();

Carro carro = new Bwm();

Carro carro = new Fusca();

Page 13: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Carro carro = CarroFactory.getCarro(Gol.clas

s);

Page 14: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Carro carro = CarroFactory.getCarro(Gol.cla

ss);

Page 15: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Carro carro = CarroFactory.getCarro(Gol.cla

ss);

Page 16: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Fabricante fab = Fabricante.getInstance(Volkswagen.

class );

Carro carro = Fabricante.getCarro(Gol.class);

Page 17: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Fabricante fab = Fabricante.getInstance(Volkswagen.

class );

Carro carro = Fabricante.getCarro(Gol.class);

Page 18: Beljug2010

Interfaces

Independência e desacoplamento

da implementação

Fabricante fab = Fabricante.getInstance(Volkswagen.

class );

Carro carro = Fabricante.getCarro(Gol.class);

Page 19: Beljug2010

Dica

Livro GoF

Page 20: Beljug2010

Agenda – Parte I

• Interfaces

• Herança

• Strings

Page 21: Beljug2010

ter um vs ser um

Herança

Gerente Funcionário

Page 22: Beljug2010

ter um vs ser um

Herança

Gerente FuncionárioFábrica

Page 23: Beljug2010

Herança é uma técnica excelente, mas

muitas vezes, não é exatamente o que você

quer.

Herança

Page 24: Beljug2010

Herança é uma técnica excelente, mas

muitas vezes, não é exatamente o que você

quer.

Descobrimos que precisamos de muito pouco

da superclasse.

Herança

Page 25: Beljug2010

Herança é uma técnica excelente, mas

muitas vezes, não é exatamente o que você

quer.

Descobrimos que precisamos de muito pouco

da superclasse.

Muitas das operações da superclasse não se

aplicam à subclasse.

Herança

Page 26: Beljug2010

Herança

Page 27: Beljug2010

Herança

Transtornos?

Page 28: Beljug2010

Cuidado! Você ganha mais do que

gostaria..

Herança

Page 29: Beljug2010

Cuidado! Você ganha mais do que

gostaria..

Não use herança por:

• „reuso‟ de código!

• polimorfismo!

Herança

Page 30: Beljug2010

Cuidado! Você ganha mais do que

gostaria..

Não use herança por:

• „reuso‟ de código!

• polimorfismo!

• preguiça!

Herança

Page 31: Beljug2010

Cuidado! Você ganha mais do que

gostaria..

Não use herança por:

• „reuso‟ de código!

• polimorfismo!

• preguiça!

Herança

Faça

composição!

Page 32: Beljug2010

Agenda – Parte I

• Interfaces

• Herança

• Strings

Page 33: Beljug2010

O problema: Concatenação!

Strings

Page 34: Beljug2010

O problema: Concatenação!

Strings

String numeros = "";

for (int i = 0; i<30000; i++) {

numeros = new StringBuilder()

.append(numeros).append(i).toStri

ng();

}

System.out.println(numeros.length());

Page 35: Beljug2010

O problema: Concatenação!

Strings

String numeros = "";

for (int i = 0; i<30000; i++) {

numeros = new StringBuilder()

.append(numeros).append(i).toStri

ng();

}

System.out.println(numeros.length());

Page 36: Beljug2010

O problema: Concatenação!

StringBuilder?

StringBuffer?

String.concat?

Strings

Page 37: Beljug2010

Strings

String numeros = new StringBuilder();

for (int i = 0; i<30000; i++) {

numeros.append(numeros)

.append(i).toString();

}

System.out.println(numeros.length());

Page 38: Beljug2010

"Premature optimization is

the root of all evil (or at least

most of it) in programming".

Lembre-se

Page 39: Beljug2010

• Bad Smell?

Agenda – Parte II

Page 40: Beljug2010

• Bad Smell?

• Código Duplicado

Agenda – Parte II

Page 41: Beljug2010

• Bad Smell?

• Código Duplicado

• Classe Grande

Agenda – Parte II

Page 42: Beljug2010

• Bad Smell?

• Código Duplicado

• Classe Grande

• Método Longo

Agenda – Parte II

Page 43: Beljug2010

• Bad Smell?

• Código Duplicado

• Classe Grande

• Método Longo

• Com n parâmetros

Agenda – Parte II

Page 44: Beljug2010

• Bad Smell?

• Código Duplicado

• Classe Grande

• Método Longo

• Com n parâmetros

• Comentários

Agenda – Parte II

Page 45: Beljug2010

• Bad Smell?

• Código Duplicado

• Classe Grande

• Método Longo

• Com n parâmetros

• Comentários

Agenda – Parte II

Page 46: Beljug2010

Comentários são, na melhor das

hipóteses, um mal necessário.

Comentários

Page 47: Beljug2010

Comentários são, na melhor das

hipóteses, um mal necessário.

Comentários servem para compensar

nossa incapacidade de expressar a

legibilidade de nosso código

Comentários

Page 48: Beljug2010

E ainda...

• Comentários mentem!

Comentários

Page 49: Beljug2010

E ainda...

• Comentários mentem!

• Comentários nem sempre seguem

o fluxo de mudanças no código

Comentários

Page 50: Beljug2010

E ainda...

• Comentários mentem!

• Comentários nem sempre seguem

o fluxo de mudanças no código

• Requerem um esforço de

manutenção

Comentários

Page 51: Beljug2010

E ainda...

• Comentários mentem!

• Comentários nem sempre seguem o fluxo de mudanças no código

• Requerem um esforço de manutenção

• truth can only be found in one place: the code

Comentários

Page 52: Beljug2010

Robert C. Martin, Clean Code

Dica

Page 53: Beljug2010

• Nomes Significativos

• Métodos

• Comentários

Agenda – Parte III

Page 54: Beljug2010

• Nomes Significativos

• Métodos

• Comentários

Agenda – Parte III

Page 55: Beljug2010

Nomes Significativos

Page 56: Beljug2010

Nomes Significativos

Page 57: Beljug2010

Nomes Significativos

Isso realmente importa?

Page 58: Beljug2010

Nomes Significativos

public List<Aluno> getThem() {

List<Aluno> listl = new ArrayList<Aluno>();

for (Aluno aluno : lista)

if(aluno.getTipo() == 4)

list1.add(aluno);

return list1;

}

Page 59: Beljug2010

Nomes Significativos

public List<Aluno> getAlunosPgtoPendente()

{

List<Aluno> listl = new ArrayList<Aluno>();

for (Aluno aluno : lista)

if(aluno.getTipo() == 4)

list1.add(aluno);

return list1;

}

Page 60: Beljug2010

Nomes Significativos

public List<Aluno> getAlunosPgtoPendente() {

List<Aluno> pendentes = new

ArrayList<Aluno>();

for (Aluno aluno : lista)

if(aluno.getTipo() == 4)

pendentes.add(aluno);

return pendentes;

}

Page 61: Beljug2010

Nomes Significativos

public List<Aluno> getAlunosPgtoPendente() {

List<Aluno> pendentes = new

ArrayList<Aluno>();

for (Aluno aluno : alunos)

if(aluno.getTipo() == 4)

pendentes.add(aluno);

return pendentes;

}

Page 62: Beljug2010

Nomes Significativos

public List<Aluno> getAlunosPgtoPendente() {

List<Aluno> pendentes = new

ArrayList<Aluno>();

for (Aluno aluno : alunos)

if(aluno. getSituacaoPagto() == 4)

pendentes.add(aluno);

return pendentes;

}

Page 63: Beljug2010

Nomes Significativos

public List<Aluno> getAlunosPgtoPendente() {

List<Aluno> pendentes = new

ArrayList<Aluno>();

for (Aluno aluno : alunos)

if(aluno. getSituacaoPagto() == PENDENTE)

pendentes.add(aluno);

return pendentes;

}

Page 64: Beljug2010

Nomes Significativos

public List<Aluno> getAlunosPgtoPendente() {

List<Aluno> pendentes = new

ArrayList<Aluno>();

for (Aluno aluno : alunos)

if(aluno. getSituacaoPagto() == PENDENTE)

pendentes.add(aluno);

return pendentes;

}

Isso realmente importa?

Page 65: Beljug2010

• Nomes Significativos

• Métodos

• Comentários

Agenda – Parte III

Page 66: Beljug2010

Métodos

Métodos devem ser pequenos!

Page 67: Beljug2010

Métodos

Métodos devem ser pequenos!

Page 68: Beljug2010

Métodos

Métodos devem ser pequenos!

1. Métodos devem fazer, tão e

somente, uma coisa!

2. E devem fazer isso corretamente

Page 69: Beljug2010

Métodos

Métodos devem ser pequenos!

1. Métodos devem fazer, tão e

somente, uma coisa!

2. E devem fazer isso corretamente

Se não for possível? Quebre o

método!

Page 70: Beljug2010

Métodos

Simplifique seu método:

1. Use nome significativos

2. Minimize o número de argumentos

3. Não use flags

4. Encapsule as condicionais

5. Faça teste de unidade

Page 71: Beljug2010

Lembre-se

Arquiteto Mies van der Rohe: “Less is

More”

~ 1940

Page 72: Beljug2010

• Nomes Significativos

• Métodos

• Comentários ?

Agenda – Parte III

Page 73: Beljug2010

Bons Comentários

• Comentários Informativos: Expressões

regulares!

• Explicação da intenção: Algumas decisões

não são decisões de implementação.

• Amplificação: Explica o quão importante é

aquele elemento

• TODO e Javadocs

Page 74: Beljug2010

Dica

M. Folwer, Refactoring

Page 75: Beljug2010

Boas práticas e refatoração:

Longevidade para o seu

código

Gustavo Pinto

@gustavopinto

www.gustavopinto.net