Logo ConstructiCat
CodeBust.
Parcourir la section ▾

Introduire un objet Null.

Problème

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.

##Exemple

Avant
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}
Après
class NullCustomer extends Customer {
  boolean isNull() {
    return true;
  }
  Plan getPlan() {
    return BillingPlan.basic();
  }
  // Autres comportements de l'objet 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();

##Pourquoi refactoriser

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

##Comment refactoriser

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

  5. Simplifiez ensuite les conditions elles-mêmes :

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