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

Introduzir Objeto Nulo.

Problema

Como alguns métodos retornam null em vez de objetos reais, você tem muitas verificações de null no seu código.

Solução

Em vez de null, retorne um objeto nulo que apresenta o comportamento padrão.

##Exemplo

Antes
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}
Depois
class NullCustomer extends Customer {
  boolean isNull() {
    return true;
  }
  Plan getPlan() {
    return BillingPlan.basic();
  }
  // Outros comportamentos do Objeto-nulo.
}

// Substitui valores null por um Objeto-nulo.
customer = (order.customer != null) ?
  order.customer : new NullCustomer();

// Usa o Objeto-nulo como se fosse uma subclasse normal.
plan = customer.getPlan();

##Por que refatorar

Dezenas de verificações de null deixam seu código mais longo e mais feio.

##Como refatorar

  1. A partir da classe em questão, crie uma subclasse que desempenhará o papel de objeto nulo.

  2. Em ambas as classes, crie o método isNull(), que retornará true para um objeto nulo e false para uma classe real.

  3. Encontre todos os lugares onde o código pode retornar null em vez de um objeto real. Altere o código para que ele retorne um objeto nulo.

  4. Encontre todos os lugares onde as variáveis da classe real são comparadas com null. Substitua essas verificações por uma chamada a isNull().

  5. Em seguida, simplifique os próprios condicionais:

    • Se métodos da classe original forem executados nesses condicionais quando um valor não é igual a null, redefina esses métodos na classe nula e insira ali o código da parte else da condição. Então você pode excluir todo o condicional, e o comportamento divergente será implementado por meio de polimorfismo.
    • Se as coisas não forem tão simples e os métodos não puderem ser redefinidos, veja se você consegue simplesmente extrair os operadores que deveriam ser executados no caso de um valor null para novos métodos do objeto nulo. Chame esses métodos em vez do código antigo no else como as operações padrão.