beljug2010
TRANSCRIPT
Boas práticas e refatoração:
Longevidade para o seu
código
Gustavo Pinto
@gustavopinto
www.gustavopinto.net
Antes de qualquer coisa...
.. não estou falando mal do seu código!
Agenda – Parte I
• Interfaces
• Herança
• Strings
Agenda – Parte I
• Interfaces
• Herança
• Strings
Interfaces
?
Interfaces
?
Interfaces
Interfaces
Interfaces
implements
Interfaces
Independência e desacoplamento
da implementação
Interfaces
Independência e desacoplamento
da implementação
Carro carro = new Gol();
Carro carro = new Bwm();
Carro carro = new Fusca();
Interfaces
Independência e desacoplamento
da implementação
Carro carro = new Gol();
Carro carro = new Bwm();
Carro carro = new Fusca();
Interfaces
Independência e desacoplamento
da implementação
Carro carro = CarroFactory.getCarro(Gol.clas
s);
Interfaces
Independência e desacoplamento
da implementação
Carro carro = CarroFactory.getCarro(Gol.cla
ss);
Interfaces
Independência e desacoplamento
da implementação
Carro carro = CarroFactory.getCarro(Gol.cla
ss);
Interfaces
Independência e desacoplamento
da implementação
Fabricante fab = Fabricante.getInstance(Volkswagen.
class );
Carro carro = Fabricante.getCarro(Gol.class);
Interfaces
Independência e desacoplamento
da implementação
Fabricante fab = Fabricante.getInstance(Volkswagen.
class );
Carro carro = Fabricante.getCarro(Gol.class);
Interfaces
Independência e desacoplamento
da implementação
Fabricante fab = Fabricante.getInstance(Volkswagen.
class );
Carro carro = Fabricante.getCarro(Gol.class);
Dica
Livro GoF
Agenda – Parte I
• Interfaces
• Herança
• Strings
ter um vs ser um
Herança
Gerente Funcionário
ter um vs ser um
Herança
Gerente FuncionárioFábrica
Herança é uma técnica excelente, mas
muitas vezes, não é exatamente o que você
quer.
Herança
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
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
Herança
Herança
Transtornos?
Cuidado! Você ganha mais do que
gostaria..
Herança
Cuidado! Você ganha mais do que
gostaria..
Não use herança por:
• „reuso‟ de código!
• polimorfismo!
Herança
Cuidado! Você ganha mais do que
gostaria..
Não use herança por:
• „reuso‟ de código!
• polimorfismo!
• preguiça!
Herança
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!
Agenda – Parte I
• Interfaces
• Herança
• Strings
O problema: Concatenação!
Strings
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());
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());
O problema: Concatenação!
StringBuilder?
StringBuffer?
String.concat?
Strings
Strings
String numeros = new StringBuilder();
for (int i = 0; i<30000; i++) {
numeros.append(numeros)
.append(i).toString();
}
System.out.println(numeros.length());
"Premature optimization is
the root of all evil (or at least
most of it) in programming".
Lembre-se
• Bad Smell?
Agenda – Parte II
• Bad Smell?
• Código Duplicado
Agenda – Parte II
• Bad Smell?
• Código Duplicado
• Classe Grande
Agenda – Parte II
• Bad Smell?
• Código Duplicado
• Classe Grande
• Método Longo
Agenda – Parte II
• Bad Smell?
• Código Duplicado
• Classe Grande
• Método Longo
• Com n parâmetros
Agenda – Parte II
• Bad Smell?
• Código Duplicado
• Classe Grande
• Método Longo
• Com n parâmetros
• Comentários
Agenda – Parte II
• Bad Smell?
• Código Duplicado
• Classe Grande
• Método Longo
• Com n parâmetros
• Comentários
Agenda – Parte II
Comentários são, na melhor das
hipóteses, um mal necessário.
Comentários
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
E ainda...
• Comentários mentem!
Comentários
E ainda...
• Comentários mentem!
• Comentários nem sempre seguem
o fluxo de mudanças no código
Comentários
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
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
Robert C. Martin, Clean Code
Dica
• Nomes Significativos
• Métodos
• Comentários
Agenda – Parte III
• Nomes Significativos
• Métodos
• Comentários
Agenda – Parte III
Nomes Significativos
Nomes Significativos
Nomes Significativos
Isso realmente importa?
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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?
• Nomes Significativos
• Métodos
• Comentários
Agenda – Parte III
Métodos
Métodos devem ser pequenos!
Métodos
Métodos devem ser pequenos!
Métodos
Métodos devem ser pequenos!
1. Métodos devem fazer, tão e
somente, uma coisa!
2. E devem fazer isso corretamente
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!
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
Lembre-se
Arquiteto Mies van der Rohe: “Less is
More”
~ 1940
• Nomes Significativos
• Métodos
• Comentários ?
Agenda – Parte III
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
Dica
M. Folwer, Refactoring
Boas práticas e refatoração:
Longevidade para o seu
código
Gustavo Pinto
@gustavopinto
www.gustavopinto.net