2009-09-16 20 views

Respuesta

12

Usted puede sugerir que sus usuarios utilizan el módulo aliased para cargar la suya:

use aliased 'Galaxy::SGE::MakeJobSH'; 
my $job = MakeJobSH->new(); 

O puede exportar el nombre de la clase en una variable denominada $MakeJobSH;

use Galaxy::SGE::MakeJobSH; # Assume this exports $MakeJobSH = 'Galaxy::SGE::MakeJobSH'; 
my $job = $MakeJobSH->new(); 

O puede exportar una función MakeJobSH que devuelve el nombre de la clase:

use Galaxy::SGE::MakeJobSH; # Assume this exports the MakeJobSH function 
my $job = MakeJobSH->new(); 

No estoy seguro de que esto es tan grande una idea, sin embargo. La gente normalmente no tiene que escribir el nombre de la clase con frecuencia.

Esto es lo que haría en su clase para las dos últimas opciones:

package Galaxy::SGE::MakeJobSH; 

use Exporter 'import'; 
our @EXPORT = qw(MakeJobSH $MakeJobSH); 

our $MakeJobSH = __PACKAGE__; 
sub MakeJobSH() { __PACKAGE__ }; 

Por supuesto, usted probablemente querrá elegir sólo uno de esos métodos. Los acabo de combinar para evitar la duplicación de ejemplos.

+0

Deseo 'aliased' era parte de la distribución estándar. –

+0

utilizando __PACKAGE__ es mucho más inteligente. – Galaxy

+0

@Chris Lutz: ¿por qué cuando constante hace absolutamente lo mismo con el mismo tipeo? http://stackoverflow.com/questions/1430548/how-can-i-call-a-perl-class-with-a-shorter-name/1435069#1435069 –

2

Gracias cjm.

Solo elijo alinear alias.

require Exporter; 

our @ISA = qw(Exporter); 
our @EXPORT = qw(MakeJobSH); 

sub MakeJobSH() {return 'Galaxy::SGE::MakeJobSH';} 
+1

Esa fue la tercera opción en mi respuesta. – cjm

1

alias funciona bien cuando se quiere afectar sólo a las llamadas de paquetes que solicitan explícitamente el aliasing. Si desea un aliasing global de un espacio de nombre a otro, use Package::Alias en su lugar.

3

No me molesto con aliasing. Creo que es la manera incorrecta de ir. Si solo está buscando menos para escribir, podría ser la respuesta (¿pero es una nueva dependencia más beneficios que riesgos?). No me gusta la idea de engañar a un programador de mantenimiento ocultándole el nombre real, ya que el alias está muy lejos de su uso y no hay indicación de que lo que parece ser un nombre de clase no sea una clase real.

Principalmente estoy buscando subclases fáciles, por lo que dejo que la clase decida por sí misma qué módulo implementará una pieza.

Por ejemplo, podría comenzar con una clase que quiera usar Foo para manejar parte del trabajo.Sé que yo podría querer subclase Foo más tarde, por lo que no difícil que el código:

package Foo::Bar; 

sub foo_class { 'Foo' } 

sub new { 
     .... 
     eval "require $self->foo_class"; 
     $self->foo_class->do_something; 
     } 

En la aplicación, que optan por utilizar 'Foo :: Bar':

#!perl 
use Foo::Bar; 

my $obj = Foo::Bar->new(); 

Más tarde, necesito especializarse Foo, por lo que se crea una subclase anula las partes que necesitan:

package Foo::Bar::Baz; 
use parent 'Foo::Bar'; 

sub foo_class { 'Local::Foo::SomeFeature' } 

1; 

Otra aplicación utiliza casi la totalidad de la misma materia, pero con el pequeño pellizco:

#!perl 
use Foo::Bar::Baz; 

my $obj = Foo::Bar::Baz->new(); 

También puede hacer algo similar a nivel de aplicación si desea escribir un programa y permitir que los usuarios elijan la clase mediante la configuración.

1

Es casi exactamente mismo enfoque que aliased pero usando Perl módulo estándar:

use constant MakeJobSH => 'Galaxy::SGE::MakeJobSH'; 
my $job = MakeJobSH->new(); 
Cuestiones relacionadas