450 likes | 521 Views
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?.
E N D
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 • Duas subclasses têm o mesmo atributo • Mova o atributo para a superclasse
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 • 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 • 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
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 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 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.
Condensar Hierarquia • Uma superclasse e uma subclasse não são muito diferentes. • Junte-as.
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
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 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.