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