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

Mover Método.

Problema

Um método é usado mais em outra classe do que na sua própria classe.

Solução

Crie um novo método na classe que mais usa o método e, em seguida, mova o código do método antigo para lá. Transforme o código do método original em uma referência ao novo método na outra classe ou então remova-o por completo.

##Exemplo

Antes
class Account {
  double overdraftCharge() {
    if (type.isPremium()) {
      double result = 10;
      if (daysOverdrawn > 7) result += (daysOverdrawn - 7) * 0.85;
      return result;
    }
    return daysOverdrawn * 1.75;
  }
}
Depois
class Account {
  double overdraftCharge() {
    return type.overdraftCharge(daysOverdrawn);
  }
}
class AccountType {
  double overdraftCharge(int daysOverdrawn) {
    if (isPremium()) {
      double result = 10;
      if (daysOverdrawn > 7) result += (daysOverdrawn - 7) * 0.85;
      return result;
    }
    return daysOverdrawn * 1.75;
  }
}

##Por que refatorar

  1. Você quer mover um método para uma classe que contém a maior parte dos dados usados pelo método. Isso torna as classes mais coerentes internamente.

  2. Você quer mover um método para reduzir ou eliminar a dependência da classe que chama o método em relação à classe onde ele está localizado. Isso pode ser útil se a classe chamadora já depende da classe para a qual você planeja mover o método. Isso reduz a dependência entre as classes.

##Como refatorar

  1. Verifique todas as funcionalidades usadas pelo método antigo em sua classe. Pode ser uma boa ideia movê-las também. Como regra, se uma funcionalidade é usada apenas pelo método em questão, você certamente deve mover a funcionalidade junto com ele. Se a funcionalidade também for usada por outros métodos, você deve mover esses métodos também. Às vezes é muito mais fácil mover um grande número de métodos do que estabelecer relações entre eles em classes diferentes.

  2. Certifique-se de que o método não esteja declarado em superclasses e subclasses. Se for o caso, você terá que se abster de movê-lo ou então implementar uma espécie de polimorfismo na classe destinatária para garantir a funcionalidade variável de um método dividido entre as classes doadoras.

  3. Declare o novo método na classe destinatária. Talvez você queira dar ao método um novo nome que seja mais apropriado para ele na nova classe.

  4. Decida como você vai referenciar a classe destinatária. Você pode já ter um campo ou método que retorne um objeto apropriado, mas, se não, será preciso escrever um novo método ou campo para armazenar o objeto da classe destinatária.

    Agora você tem uma forma de referenciar o objeto destinatário e um novo método em sua classe. Com tudo isso em mãos, você pode transformar o método antigo em uma referência ao novo método.

  5. Observe: você consegue excluir o método antigo por completo? Se sim, coloque uma referência ao novo método em todos os lugares que usam o antigo.