Refatorações
Experiência é aquela coisa maravilhosa que permite que
você reconheça um erro tão logo o cometa novamente
F.P. Jones
O 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.
Um catálogo de Refatorações
Tratando Generalizações
Subir atributo na hierarquia
Subir atributo na hierarquia
Duas subclasses têm o mesmo atributo
 Mova o atributo para a superclasse
Subir atributo na hierarquia
Subir método na hierarquia
Subir 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
Exemplo
O método createBill é idêntico para ambas as classes
Exemplo
• 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
Subir código do construtor na hierarquia
Subir 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
Descer Método na Hierarquia
Descer 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
Descer Método na Hierarquia
Extrair Subclasse
Extrair 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.
Extrair Subclasse
Extrair Subclasse
Extrair Superclasse
Extrair 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
Extrair Superclasse
Extrair Superclasse
Extrair Interface
Extrair 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.
Extrair 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.
Extrair Interface
Extrair Interface
Condensar Hierarquia
Condensar Hierarquia
Uma superclasse e uma subclasse não são muito
diferentes.
•
Junte-as.
Criar Método Roteiro
Criar 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.
Criar 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
Criar Método Roteiro
Substituir Herança por Delegação
Substituir 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.
Substituir 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"
Substituir Herança por Delegação
Substituir Herança por Delegação
Substituir Delegação por Herança
Substituir 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.
Motivaçã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.
Substituir Delegação por Herança
Substituir Delegação por Herança
Download

Refatoracoes