Logotipo de ConstructiCat
CodeBust.
Explorar la sección ▾

Introducir objeto nulo.

Problema

Como algunos métodos devuelven null en lugar de objetos reales, tienes muchas comprobaciones de null en tu código.

Solución

En lugar de null, devuelve un objeto nulo que muestre el comportamiento por defecto.

##Ejemplo

Antes
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}
Después
class NullCustomer extends Customer {
  boolean isNull() {
    return true;
  }
  Plan getPlan() {
    return BillingPlan.basic();
  }
  // Resto del comportamiento del objeto nulo.
}

// Reemplaza los valores null por el objeto nulo.
customer = (order.customer != null) ?
  order.customer : new NullCustomer();

// Usa el objeto nulo como si fuera una subclase normal.
plan = customer.getPlan();

##Por qué refactorizar

Docenas de comprobaciones de null hacen que tu código sea más largo y feo.

##Cómo refactorizar

  1. A partir de la clase en cuestión, crea una subclase que desempeñará el papel de objeto nulo.

  2. En ambas clases, crea el método isNull(), que devolverá true para un objeto nulo y false para una clase real.

  3. Encuentra todos los lugares donde el código pueda devolver null en lugar de un objeto real. Cambia el código para que devuelva un objeto nulo.

  4. Encuentra todos los lugares donde las variables de la clase real se comparan con null. Reemplaza estas comprobaciones por una llamada a isNull().

  5. Después, simplifica los propios condicionales:

    • Si en estos condicionales se ejecutan métodos de la clase original cuando un valor no es igual a null, redefine estos métodos en la clase nula e inserta ahí el código de la parte else de la condición. Entonces podrás eliminar todo el condicional y el comportamiento diferente se implementará mediante polimorfismo.
    • Si las cosas no son tan sencillas y los métodos no pueden redefinirse, comprueba si puedes simplemente extraer a nuevos métodos del objeto nulo las operaciones que debían realizarse en el caso de un valor null. Llama a estos métodos en lugar del código antiguo en else como las operaciones por defecto.