ConstructiCat Logo
CodeBust.
Browse section ▾

Reemplazar método con objeto-método.

Problem

Tienes un método largo en el que las variables locales están tan entrelazadas que no puedes aplicar Extraer método.

Solution

Transforma el método en una clase separada de modo que las variables locales se conviertan en campos de la clase. Después podrás dividir el método en varios métodos dentro de la misma clase.

##Example

Before
class Order {
  // ...
  public double price() {
    double primaryBasePrice;
    double secondaryBasePrice;
    double tertiaryBasePrice;
    // Realizar el cálculo largo.
  }
}
After
class Order {
  // ...
  public double price() {
    return new PriceCalculator(this).compute();
  }
}

class PriceCalculator {
  private double primaryBasePrice;
  private double secondaryBasePrice;
  private double tertiaryBasePrice;
  
  public PriceCalculator(Order order) {
    // Copiar la información relevante del
    // objeto order.
  }
  
  public double compute() {
    // Realizar el cálculo largo.
  }
}

##Why Refactor

Un método es demasiado largo y no puedes separarlo debido a marañas de variables locales que resultan difíciles de aislar entre sí.

El primer paso es aislar todo el método en una clase separada y convertir sus variables locales en campos de la clase.

En primer lugar, esto permite aislar el problema a nivel de clase. En segundo lugar, allana el camino para dividir un método grande e inmanejable en otros más pequeños que, de todos modos, no encajarían con el propósito de la clase original.

##Benefits

  • Aislar un método largo en su propia clase permite evitar que un método se hinche en tamaño. También permite dividirlo en submétodos dentro de la clase, sin contaminar la clase original con métodos de utilidad.

##How to Refactor

  1. Crea una nueva clase. Nómbrala según el propósito del método que estás refactorizando.

  2. En la nueva clase, crea un campo privado para almacenar una referencia a una instancia de la clase en la que se encontraba antes el método. Podría usarse para obtener de la clase original algunos datos necesarios si hiciera falta.

  3. Crea un campo privado independiente para cada variable local del método.

  4. Crea un constructor que acepte como parámetros los valores de todas las variables locales del método y que además inicialice los campos privados correspondientes.

  5. Declara el método principal y copia en él el código del método original, sustituyendo las variables locales por campos privados.

  6. Sustituye el cuerpo del método original en la clase original creando un objeto-método y llamando a su método principal.