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

Descer Método.

Problema

Um comportamento implementado em uma superclasse é usado por apenas uma (ou algumas) subclasses?

Solução

Mova esse comportamento para as subclasses.

##Exemplo

Antes
class Employee {
  double salesQuota() { return quota; }
}
class Salesman extends Employee {}
class Engineer extends Employee {}
Depois
class Employee {}
class Salesman extends Employee {
  double salesQuota() { return quota; }
}
class Engineer extends Employee {}

##Por que refatorar

No início, um determinado método deveria ser universal para todas as classes, mas, na realidade, é usado em apenas uma subclasse. Essa situação pode ocorrer quando funcionalidades planejadas não se concretizam.

Tais situações também podem ocorrer após a extração (ou remoção) parcial de funcionalidades de uma hierarquia de classes, deixando um método que é usado em apenas uma subclasse.

Se você perceber que um método é necessário em mais de uma subclasse, mas não em todas, pode ser útil criar uma subclasse intermediária e mover o método para ela. Isso permite evitar a duplicação de código que resultaria de descer um método para todas as subclasses.

##Benefícios

  • Melhora a coesão da classe. Um método fica localizado onde você espera vê-lo.

##Como refatorar

  1. Declare o método em uma subclasse e copie seu código da superclasse.

  2. Remova o método da superclasse.

  3. Encontre todos os lugares onde o método é usado e verifique se ele é chamado a partir da subclasse necessária.