Essa apresentação fala um pouco sobre o que é, quando e porque aplicar Refatoração em seu código.
Além de mostrar algumas técnicas que Martin Fowler mostra em seu livro.
15. Quando vamos adicionar uma nova funcionalidade
O código que deve ser alterado
está difícil de entender.
O design não ajuda a adicionar
a nova funcionalidade facilmente
16. Quando vamos corrigir um bug
Um bug reportado pode ser um
sinal que o código não estava claro
o bastante para evitá-lo.
17. Quando vamos revisar o código de alguém
O código pode parecer limpo para mim, mas não para
minha equipe.
Sugestões podem ajudar
a melhorar o código.
18. "Decidir quando começar e quando parar
uma refatoração, é tão importante
quanto saber como fazê-la."
19. Quando não refatorar
Muitas aplicações estão totalmente acopladas
ao banco de dados.
Quando um código estiver tão cheio
de bugs ou com um design muito ruim,
é melhor começar do zero.
20. Primeiro passo...
Criar um conjunto de testes sólidos
para garantir que sua refatoração
não quebre o código que está
funcionando.
22. Extract Method
Transformar um trecho de código em um novo método.
O seu nome deve explicar seu propósito.
Muitos problemas vêm de métodos muito
grandes e com muita informação.
23. Remove temp with query
Quando transformamos uma variável temporária usada
para guardar o resultado de uma expressão em um
método.
25. Move method/field
Mover um método/atributo quando é ou será usado em
outras classes além da classe em que está definido.
Métodos: Crie um novo método com o mesmo corpo na classe
mais usada, e apenas delegue a chamada do método antigo para o
novo.
Atributos: Crie um novo atributo em outra classe e use o
encapsulamento para delegar.
26. Extract class
Quando uma classe está fazendo o trabalho de duas.
class Person { class Person {
String name; String name;
String officeAreaCode; ...
String officeNumber; TelephoneNumber officePhone;
... }
}
class TelephoneNumber {
String areaCode;
String number;
}
27. Hide delegate
Remova a dependência de uma classe que possua um
delegate para um atributo de outra classe.
28. class Pessoa { class Pessoa {
Departamento departamento; Departamento departamento;
public Departamento getDepartamento(){ public Pessoa getGerente() {
return departamento; return departamento.getGerente();
} }
} }
class Departamento {
private Pessoa gerente;
public Pessoa getGerente() {
return gerente;
}
}
gerente = joao.getDepartamento().getGerente();
gerente = joao.getGerente();
29. Remove middle man
O contrário do Hide Delegate.
Crie um método para acessar o atributo encapsulado.
Quando há muitos atributos na classe delegate e você precisa
ficar criando novos métodos toda vez.
30. Replace data value with object
Quando um item que precisa de um comportamento adicional
Order
Order
_________________
1
customer: String
Customer
_________________
name: String
31. Encapsulate Collection
Quando somente temos o método para retornar a
collection imutável.
Criamos métodos para adicionar e remover elementos.
Person
Person
_________________
_________________
getCourses():Unmodifiable Set
getCourses():Set
addCourse(:Course)
setCourses(:Set)
removeCourse(:Course)
32. Decompose Conditional
Uma lógica condicional não muito legível aumenta a complexidade.
Pode facilmente nos confundir e alterar o comportamento desejado.
34. Consolidate Duplicate conditional fragments
Quando temos o mesmo trecho de código dentro de
uma lógica condicional.
Mova-o para fora da lógica.
35. Consolidate Duplicate conditional fragments
if (isSpecial()) {
total = price * 0.95;
send();
} else {
total = price * 0.98;
send();
}
if (isSpecial()) {
total = price * 0.95;
} else {
total = price * 0.98;
}
send();
36. Separate query from modifier
Quando o mesmo método retorna um valor e altera o estado de um
objeto.
Separe-o em dois métodos.
Customer
__________________________________
getTotalOutstandingAndSetReadyForSummaries
Customer
_________________
getTotalOutstanding
setReadyForSummaries
37. Parameterize Method
Vários métodos fazem coisas parecidas mas com valores diferentes.
Unifique o método e parametrize o valor.
Employee Employee
_________________ _________________
fivePercentRaise() raise(percentage)
tenPercentRaise()
38. Preserve whole object
Quando usamos vários valores de um objeto para passá-los para outro método.
Passe o objeto inteiro por parametro.
int low = period.getLow();
int high = period.getHigh();
withinPlan = plan.withinRange(low, high);
withinPlan = plan.withinRange(period);