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