Logo ConstructiCat
CodeBust.
Parcourir la section ▾

Poltergeist.

Un poltergeist est une classe éphémère et sans état qui n’existe que pour appeler les méthodes d’une autre classe, ajoutant une indirection sans comportement.

En programmation informatique, un poltergeist est un objet éphémère, généralement sans état, utilisé pour effectuer une initialisation ou pour invoquer des méthodes dans une autre classe plus permanente. Il est considéré comme un antipatron. Le terme a été introduit par Michael Akroyd lors de la conférence Object World West de 1996 : comme un esprit frappeur, cet objet apparaît et disparaît mystérieusement. En conséquence, le code est plus difficile à maintenir et des ressources sont gaspillées sans aucun bénéfice. La cause habituelle de cet antipatron est une mauvaise conception des objets.

Un poltergeist peut souvent être identifié par son nom ; ces noms contiennent fréquemment des mots tels que « Manager », « Controller », « Supervisor », « StartProcess », etc.

Parfois, des classes poltergeist sont créées parce que le programmeur a anticipé le besoin d'une architecture plus complexe. Par exemple, un poltergeist apparaît si une même méthode joue à la fois le rôle de client et d'invocateur dans un patron Commande, et que le programmeur anticipe la séparation des deux phases. Toutefois, cette architecture plus complexe peut en réalité ne jamais voir le jour.

Les poltergeists ne doivent pas être confondus avec les objets à longue durée de vie et porteurs d'état d'un patron tel que modèle–vue–contrôleur, ni avec les patrons de séparation en couches tels que le patron business delegate.

Pour supprimer un poltergeist, supprimez la classe et insérez ses fonctionnalités dans la classe invoquée, éventuellement par héritage ou sous forme de mixin.

Des méthodes ont été proposées pour détecter les poltergeists dans le code en vue d'une refactorisation.

En termes de refactoring, le remède est Intégrer la classe. Le poltergeist est proche des odeurs de code Classe paresseuse et Intermédiaire.

Exemple

Dans cet exemple en C++, UserCreator est un poltergeist : il n’est instancié que pour créer un UserManager, appeler l’une de ses méthodes et disparaître.

import std;

using String = std::string;

class UserManager {
public:
    void createUser(const String& name) {
        std::println("User created: {}", name);
    }
};

// La classe poltergeist
class UserCreator {
public:
    explicit UserCreator(const String& name) {
        UserManager manager;
        manager.createUser(name);
    }
};

int main() {
    // Crée un poltergeist uniquement pour appeler createUser()
    UserCreator("Alice");
    UserCreator("Bob");
}

Sans le poltergeist, l’appelant utilise directement UserManager, et il y a une classe de moins à lire et à maintenir :

import std;

using String = std::string;

class UserManager {
public:
    void createUser(const String& name) {
        std::println("User created: {}", name);
    }
};

// Pas de UserCreator : l’appelant s’adresse directement à UserManager
int main() {
    UserManager manager;
    manager.createUser("Alice");
    manager.createUser("Bob");
}

Adapté de l’article Wikipédia “Poltergeist (computer programming)” (révision 1321576717), disponible sous licence CC BY-SA 4.0 ; le texte a été traduit et modifié, et des exemples ont été ajoutés.