ConstructiCat Logo
CodeBust.
Browse section ▾

Introducir objeto nulo.

Problem

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

Solution

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

##Example

Before
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}
After
class NullCustomer extends Customer {
  boolean isNull() {
    return true;
  }
  Plan getPlan() {
    return new NullPlan();
  }
  // Otra funcionalidad NULL.
}

// 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();

##Why Refactor

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

##How to Refactor

  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().

    • 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.