ConstructiCat Logo
CodeBust.
Browse section ▾

Introduire un objet Null.

Problem

Comme certaines méthodes renvoient null au lieu d’objets réels, votre code comporte de nombreuses vérifications de null.

Solution

Au lieu de null, renvoyez un objet Null qui présente le comportement par défaut.

##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();
  }
  // Autres fonctionnalités NULL.
}

// Remplacer les valeurs null par l'objet Null.
customer = (order.customer != null) ?
  order.customer : new NullCustomer();

// Utiliser l'objet Null comme s'il s'agissait d'une sous-classe normale.
plan = customer.getPlan();

##Why Refactor

Des dizaines de vérifications de null rendent votre code plus long et plus laid.

##How to Refactor

  1. À partir de la classe concernée, créez une sous-classe qui jouera le rôle d’objet Null.

  2. Dans les deux classes, créez la méthode isNull(), qui renverra true pour un objet Null et false pour une classe réelle.

  3. Repérez tous les endroits où le code peut renvoyer null au lieu d’un objet réel. Modifiez le code pour qu’il renvoie un objet Null.

  4. Repérez tous les endroits où les variables de la classe réelle sont comparées à null. Remplacez ces vérifications par un appel à isNull().

    • Si des méthodes de la classe d’origine sont exécutées dans ces conditions lorsqu’une valeur n’est pas égale à null, redéfinissez ces méthodes dans la classe Null et insérez-y le code de la partie else de la condition. Vous pouvez alors supprimer toute la condition, et le comportement différent sera mis en œuvre via le polymorphisme.
    • Si les choses ne sont pas si simples et que les méthodes ne peuvent pas être redéfinies, voyez si vous pouvez simplement extraire les instructions qui devaient être exécutées dans le cas d’une valeur null vers de nouvelles méthodes de l’objet Null. Appelez ces méthodes à la place de l’ancien code dans else, comme opérations par défaut.