En programación informática , un poltergeist (o carro gitano ) es un objeto efímero, generalmente 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 . La definición original es de Michael Akroyd en la conferencia Object World West de 1996.
Así como una caravana gitana o un poltergeist aparece y desaparece misteriosamente, este objeto efímero también lo hace. En consecuencia, el código se vuelve más difícil de mantener y se produce un desperdicio innecesario de recursos. La causa típica de este antipatrón es un mal diseño de objetos.
A menudo, un poltergeist puede identificarse por su nombre; suelen incluir palabras como " Gerente ", " Controlador ", " Supervisor ", " Iniciar proceso ", etc.
En ocasiones, se crean clases poltergeist porque el programador anticipó la necesidad de una arquitectura más compleja. Por ejemplo, surge una clase poltergeist si el mismo método actúa como cliente e invocador en un patrón de comando , y el programador prevé separar ambas fases. Sin embargo, esta arquitectura más compleja puede que nunca llegue a materializarse.
Los poltergeists no deben confundirse con objetos de larga duración que conservan un estado, como los patrones modelo-vista-controlador o los patrones de separación de niveles, como el patrón delegado de negocio .
Para eliminar un poltergeist, elimine la clase e inserte su funcionalidad en la clase invocada, posiblemente por herencia o como un mixin .
Se han propuesto métodos para detectar poltergeists en el código para su refactorización. [ 1 ]
Ejemplo
En este ejemplo de C++ , esta Poltergeistclase puede considerarse un "objeto poltergeist", ya que no añade funcionalidad ni encapsulación adicionales, sino que solo aumenta la complejidad con una abstracción innecesaria.
importar std ;usando String = std :: string ;// Clase Poltergeist que simplemente contiene un puntero, pero no agrega ningún comportamiento significativo. class Poltergeist { private : String * s ; // puntero a cadena, pero la clase en sí no hace nada útil. public : explicit Poltergeist ( String * s ) : s { s } {}~ Poltergeist () { eliminar s ; }[[ nodiscard ]] String get () const noexcept { return s ; }// Sin comportamiento adicional ni funcionalidad significativa };int main () { // Crea un objeto Poltergeist que simplemente contiene un puntero a la cadena Poltergeist p ( new String ( "Hello, world!" ));// Simplemente pasa los datos sin agregar valor std :: println ( * p.get ( ));devolver 0 ; }Esto podría hacerse de forma más apropiada utilizando un puntero inteligente .
importar std ;using String = std :: string ; template < typename T > using UniquePtr = std :: unique_ptr <T> ;// Usar punteros inteligentes directamente para administrar la memoria UniquePtr < String > s = std :: make_unique < String > ( "Hello, World!" ); std :: println ( * s );Otro ejemplo de un objeto poltergeist/carreta gitana es el siguiente, donde UserCreatorse instancia solo para realizar algunas acciones básicas.
importar std ;usando String = std :: string ;clase UserManager { public : void createUser ( const String & name ) { std :: println ( "Usuario creado: {}" , name ); } };// La clase poltergeist class UserCreator { public : explicit UserCreator ( const String & name ) { UserManager manager ; manager . createUser ( name ) ; } };int main () { // Creando un poltergeist solo para llamar a createUser() UserCreator ( "Alice" ); UserCreator ( "Bob" ); }Esto podría hacerse de forma más apropiada de la siguiente manera, evitando por completo cualquier clase de poltergeist:
// Evita por completo el poltergeist UserCreator int main () { UserManager manager ; manager . createUser ( "Alice" ); manager . createUser ( "Bob" ); }Véase también
Referencias
- ↑ Al-Rubaye, Samer Raad Azzawi; Selcuk, Yunus Emre (24–26 de noviembre de 2017). «Una investigación sobre ciclos de código y el antipatrón Poltergeist» . 8.ª Conferencia Internacional IEEE de Ingeniería de Software y Ciencia de Servicios (ICSESS) de 2017. págs. 139–140 . doi : 10.1109/ICSESS.2017.8342882 . ISBN 978-1-5386-0497-7.
- Brown, William J. (1998). «Capítulo 5: Antipatrones en el desarrollo de software». Antipatrones: Refactorización de software, arquitecturas y proyectos en crisis . Nueva York, EE. UU.: John Wiley & Sons. ISBN 0-471-19713-0.
Enlaces externos
- Antipatrones de desarrollo
- Antipatrones
- Esbozos de programación informática