Title: Refatora
1Refatorações
- Experiência é aquela coisa maravilhosa que
permite que você reconheça um erro tão logo o
cometa novamente - F.P. Jones
2O que é Refatoração?
- Refatoração é o processo de alteração de um
sistema de software de modo que o comportamento
externo do código não mude, mas que sua estrutura
interna seja melhorada. - É uma maneira disciplinada de aperfeiçoar o
código que minimiza a chance de introdução de
falhas. - Em essência, quando você usa refatoração, você
está melhorando o projeto do código após este ter
sido escrito.
3Um catálogo de Refatorações
4Subir atributo na hierarquia
5Subir atributo na hierarquia
- Duas subclasses têm o mesmo atributo
- Mova o atributo para a superclasse
6Subir atributo na hierarquia
7Subir método na hierarquia
8Subir método na hierarquia
- Você tem métodos nas subclasses que produzem
resultados idênticos . - Mova-os para a superclasse.
Motivação Evitar a duplicação de código
9Exemplo
O método createBill é idêntico para ambas as
classes
10Exemplo
- Não posso mover o método createBill na hierarquia
porque o método chargeFor é diferente em cada
subclasse - Solução declarar o método chargeFor como
abstrato na superclasse
11Subir código do construtor na hierarquia
12Subir código do construtor na hierarquia
- Você tem construtores nas subclasses com código
quase idêntico. -
- Crie um construtor para a superclasse chame-o a
partir de métodos das subclasses.
Motivação O código dos construtores é quase
idêntico, mas você não pode usar "subir método na
hierarquia" porque métodos construtores não podem
ser herdados
13Descer Método na Hierarquia
14Descer Método na Hierarquia
- Algum comportamento na superclasse é relevante
apenas para algumas de suas subclasses.
- Mova-o para essas subclasses
Motivação Um código específico faz sentido
apenas em algumas das subclasses
15Descer Método na Hierarquia
16Extrair Subclasse
17Extrair Subclasse
- Uma classe tem características que são usadas
apenas em algumas instâncias.
- Crie uma subclasse para esse subconjunto de
características.
Motivação O principal motivo para usar Extrair
Subclasse é a observação de que uma classe tem
comportamento usado por algumas das instâncias da
classe mas não por outras.
18Extrair Subclasse
19Extrair Subclasse
20Extrair Superclasse
21Extrair Superclasse
- Você tem duas classes com características
semelhantes. -
- Crie uma superclasse e mova as características em
comum para ela. - Motivação Evitar a duplicação de código
22Extrair Superclasse
23Extrair Superclasse
24Extrair Interface
25Extrair Interface
- Diversos clientes usam o mesmo subconjunto da
interface de uma classe ou duas classes tem parte
de suas interfaces em comum. -
-
- Extraia o subconjunto para uma interface.
26Extrair Interface
- Motivação
- Somente parte da interface de uma classe faz
sentido para um grupo de clientes - Uma classe tem de trabalhar com qualquer classe
que trate um grupo de requisições - Interfaces são uma boa solução quando uma classe
tem papéis distintos em diferentes situações.
27Extrair Interface
28Extrair Interface
29Condensar Hierarquia
30Condensar Hierarquia
- Uma superclasse e uma subclasse não são muito
diferentes.
31Criar Método Roteiro
32Criar Método Roteiro
- Você tem dois métodos em subclasses diferentes
que executam passos semelhantes na mesma ordem,
mas esses passos são diferentes.
- Coloque os passos em métodos com a mesma
assinatura, de modo que os métodos originais se
tornem o mesmo. Você poderá então subi-los na
hierarquia.
33Criar Método Roteiro
- Motivação
- Herança é uma ferramenta poderosa para eliminar
comportamento duplicado. Sempre que vemos dois
métodos semelhantes em uma subclasse, queremos
juntá-los em uma superclasse. Mas e se eles não
forem exatamente os mesmos? - Um caso comum é o de dois métodos que parecem ter
passos similares na mesma ordem, porém os passos
não são os mesmos. Neste caso podemos mover a
seqüência para a superclasse e permitir que o
polimorfismo execute seu papel
34Criar Método Roteiro
35(No Transcript)
36Substituir Herança por Delegação
37Substituir Herança por Delegação
- Uma subclasse usa apenas parte da interface de
uma superclasse ou não quer herdar dados.
- Crie um campo para a superclasse, ajuste métodos
para delegarem para a superclasse e remova a
herança. -
38Substituir Herança por Delegação
- Motivação
- A subclasse usa somente parte da interface da
superclasse - Problema conceitual a subclasse não é uma
superclasse - Necessidade de substituir a herança por outra
"mais útil"
39Substituir Herança por Delegação
40Substituir Herança por Delegação
41Substituir Delegação por Herança
42Substituir Delegação por Herança
- Você está usando delegação e está freqüentemente
escrevendo muitas delegações simples para toda a
interface. -
- Torne a classe que delega uma subclasse da classe
delegada.
43Motivação
- Motivação
-
- Este é o reverso de Substituir Herança por
Delegação. Se você se encontrar usando todos os
métodos da classe delegada e estiver farto de
escrever todos esses métodos de delegação
simples, pode voltar para a herança facilmente.
44Substituir Delegação por Herança
45Substituir Delegação por Herança