2010-02-22 19 views
7

¿Cuál es la mejor práctica para implementar Singletons en Perl?¿Cómo puedo implementar una clase singleton en Perl?

+1

La mejor práctica para implementar singletons es ** ¡No! ** –

+0

@gbacon: ¿cuál sería la razón (es) contra la implementación de los sigletons? De acuerdo, nunca los he usado extensamente (o casi nunca) pero no conozco ninguna razón para evitarlos en lugar de simplemente no necesitarlos. – DVK

+3

@DVK Un singleton es una variable global con un traje elegante. –

Respuesta

16

Puede usar el módulo Class::Singleton.

Una clase "Singleton" también se puede implementar fácilmente usando la variable my o state (esta última está disponible desde Perl 5.10). Pero mira el comentario de @Michael a continuación.

package MySingletonClass; 
use strict; 
use warnings; 
use feature 'state'; 

sub new { 
    my ($class) = @_; 
    state $instance; 

    if (! defined $instance) { 
     $instance = bless {}, $class; 
    } 
    return $instance; 
} 
+4

Esto falla si el módulo está subclasificado; la variable de instancia necesita vivir en el paquete final. Clase :: Singleton consigue esto correcto. –

+3

Realmente no "falla" si se hereda. La clase heredada solo tiene que acceder e interactuar con el objeto singleton como cualquier otra clase. Sin embargo, todo depende de lo que trates de hacer. –

9

Si está utilizando Moose, entonces MooseX::Singleton. Su interfaz es compatible con Class :: Singleton.

2

Singleton Resumen:

  • mayoría de las veces un objeto normal, va a funcionar.
  • Tenga cuidado con los singletons.
  • Localizar la interacción tanto como sea posible

Mientras únicos son una buena idea, tiendo a poner en práctica un objeto normal y usarlo. Si es fundamental que solo tenga uno de esos objetos, modificaré el constructor para arrojar una excepción fatal cuando se cree el segundo objeto. Los diversos módulos singleton no parecen hacer mucho además de agregar una dependencia.

Lo hago porque es fácil, funciona, y cuando en un futuro extraño necesito trabajar con un segundo objeto en mi aplicación, los cambios se reducen al mínimo.

También me gusta localizar la interacción con mis objetos 'singleton' - mantener la interacción en el menor número de lugares posible. Entonces, en lugar de que cada objeto tenga acceso directo al singleton, medío toda la interacción a través de mi objeto "Aplicación". Siempre que sea posible, el objeto de la aplicación obtiene datos del 'singleton' y lo pasa como un parámetro al método en los otros objetos. Las respuestas de otros objetos también se pueden enviar y pasar al 'singleton'. Todo este esfuerzo me ayuda cuando necesito hacer cambios en el objeto 'singleton', y cuando quiero reutilizar otros objetos en otra aplicación que pueden no necesitar o poder usar el objeto 'singleton' original.

+1

Creo que te estás perdiendo el punto del singleton. Es un patrón que puede usar para no tener que hacer toda la mediación complicada. No tiene que usarlo, pero no lo descuenta simplemente porque no lo necesita. No todo encaja en el esquema que ha descrito. –

Cuestiones relacionadas