Logotipo do ConstructiCat
CodeBust.
Explorar a seção ▾

Subir Método.

Problema

Suas subclasses têm métodos que realizam um trabalho semelhante.

Solução

Torne os métodos idênticos e, em seguida, mova-os para a superclasse relevante.

##Exemplo

Antes
class Employee {
  String name;
}
class Salesman extends Employee {
  String getName() { return name; }
}
class Engineer extends Employee {
  String getName() { return name; }
}
Depois
class Employee {
  String name;
  String getName() { return name; }
}
class Salesman extends Employee {}
class Engineer extends Employee {}

##Por que refatorar

As subclasses cresceram e se desenvolveram independentemente umas das outras, causando campos e métodos idênticos (ou quase idênticos).

##Benefícios

  • Elimina código duplicado. Se você precisa fazer alterações em um método, é melhor fazê-las em um único lugar do que ter que procurar por todas as duplicatas do método nas subclasses.

  • Essa técnica de refatoração também pode ser usada se, por algum motivo, uma subclasse redefine um método da superclasse mas realiza, essencialmente, o mesmo trabalho.

##Como refatorar

  1. Investigue métodos semelhantes nas subclasses. Se não forem idênticos, formate-os para que correspondam uns aos outros.

  2. Se os métodos usam um conjunto diferente de parâmetros, coloque os parâmetros na forma que você quer ver na superclasse.

  3. Copie o método para a superclasse. Aqui você pode descobrir que o código do método usa campos e métodos que existem apenas nas subclasses e que, portanto, não estão disponíveis na superclasse. Para resolver isso, você pode:

    • Para campos: use Subir Campo ou Autoencapsular Campo para criar getters e setters nas subclasses; depois declare esses getters de forma abstrata na superclasse.

    • Para métodos: use Subir Método ou declare métodos abstratos para eles na superclasse (observe que sua classe se tornará abstrata se ainda não for).

  4. Remova os métodos das subclasses.

  5. Verifique os locais em que o método é chamado. Em alguns lugares você pode conseguir substituir o uso de uma subclasse pela superclasse.