Logotipo de ConstructiCat
CodeBust.
Explorar la sección ▾

Poltergeist.

Un poltergeist es una clase efímera y sin estado que solo existe para llamar a métodos de otra clase, con lo que añade indirección sin aportar comportamiento.

En la programación informática, un poltergeist es un objeto efímero, normalmente sin estado, que se utiliza para realizar la inicialización o para invocar métodos en otra clase más permanente. Se considera un antipatrón. El término lo introdujo Michael Akroyd en la conferencia Object World West de 1996: como un poltergeist, este objeto aparece y desaparece de forma misteriosa. En consecuencia, el código es más difícil de mantener y se desperdician recursos sin ningún beneficio. La causa típica de este antipatrón es un diseño deficiente de objetos.

A menudo, un poltergeist puede identificarse por su nombre; estos suelen incluir en el nombre palabras como "Manager", "Controller", "Supervisor", "StartProcess", etc.

A veces, las clases poltergeist se crean porque el programador anticipó la necesidad de una arquitectura más compleja. Por ejemplo, surge un poltergeist si el mismo método actúa a la vez como cliente e invocador en un patrón Command, y el programador anticipa la separación de ambas fases. Sin embargo, esta arquitectura más compleja puede que en realidad nunca llegue a materializarse.

Los poltergeists no deben confundirse con los objetos longevos y portadores de estado de un patrón como el modelo–vista–controlador, ni con los patrones de separación en capas como el patrón business delegate.

Para eliminar un poltergeist, borra la clase e inserta su funcionalidad en la clase invocada, posiblemente mediante herencia o como un mixin.

Se han propuesto métodos para detectar poltergeists en el código con vistas a la refactorización.

En términos de refactorización, el remedio es Incorporar clase. El poltergeist está muy relacionado con los olores de código Clase perezosa y Intermediario.

Ejemplo

En este ejemplo en C++, UserCreator es un poltergeist: se instancia solo para crear un UserManager, llamar a uno de sus métodos y desaparecer.

import std;

using String = std::string;

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

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

int main() {
    // Crear un poltergeist solo para llamar a createUser()
    UserCreator("Alice");
    UserCreator("Bob");
}

Sin el poltergeist, quien llama usa UserManager directamente y hay una clase menos que leer y mantener:

import std;

using String = std::string;

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

// Sin UserCreator: quien llama habla directamente con UserManager
int main() {
    UserManager manager;
    manager.createUser("Alice");
    manager.createUser("Bob");
}

Adaptado del artículo de Wikipedia “Poltergeist (computer programming)” (revisión 1321576717), disponible bajo la licencia CC BY-SA 4.0; el texto ha sido traducido y editado, y se han añadido ejemplos.