2009-09-16 19 views

Odpowiedz

12

Można sugerować, że użytkownicy korzystają z modułu aliased załadować je:

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

Albo można wyeksportować nazwę klasy w zmiennej o nazwie $MakeJobSH;

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

Albo można wyeksportować funkcję MakeJobSH która zwraca nazwę klasy:

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

nie jestem pewien, że to wszystko to wielka idea, choć. Ludzie zwykle nie muszą wpisywać nazwy klasy tak często.

Oto, co można zrobić w swojej klasie w ciągu ostatnich dwóch opcji:

package Galaxy::SGE::MakeJobSH; 

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

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

Oczywiście, to prawdopodobnie chcesz wybrać tylko jedną z tych metod. Właśnie je połączyłem, aby uniknąć powielania przykładów.

+0

życzę 'aliased' był częścią standardowej dystrybucji. –

+0

używanie __PACKAGE__ jest o wiele mądrzejsze. – Galaxy

+0

@Chris Lutz: dlaczego, gdy stała robi to samo z tym samym pisaniem? http://stackoverflow.com/questions/1430548/how-can-i-call-a-perl-class-with-a-shorter-name/1435069#1435069 –

2

Dzięki cjm.

Po prostu wybieram wbudowany alias.

require Exporter; 

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

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

To była trzecia opcja w mojej odpowiedzi. – cjm

1

alias działa dobrze, jeśli chcesz wpływać tylko na wywołania z pakietów, które jawnie żądają aliasingu. Jeśli chcesz globalnie aliasingować jedną przestrzeń nazw do drugiej, użyj zamiast tego Package::Alias.

3

Nie zawracam sobie głowy aliasingiem. Myślę, że to niewłaściwy sposób. Jeśli szukasz tylko mniej do pisania, może to być odpowiedź (ale czy nowa zależność jest bardziej korzystna niż ryzyko?). Nie podoba mi się pomysł oszukania programisty konserwacji, ukrywając prawdziwe imię od niego, ponieważ aliasing zdarza się daleko od jego użycia i nic nie wskazuje na to, że to, co wygląda jak nazwa klasy, nie jest prawdziwą klasą.

W większości poszukuję łatwej podklasy, więc pozwoliłem klasie zdecydować, który moduł będzie implementował część.

Na przykład mogę zacząć od klasy, która chce użyć Foo do obsługi części pracy.Wiem, że może chcę podklasy Foo później, więc nie ciężko kod to:

package Foo::Bar; 

sub foo_class { 'Foo' } 

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

W aplikacji, I zdecydować się na stosowanie 'Foo :: Bar':

#!perl 
use Foo::Bar; 

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

później muszę specjalizują Foo, więc tworzę podklasę przesłania części muszę:

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

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

1; 

Inna aplikacja korzysta prawie wszystko z tego samego materiału, ale z małym uszczypnąć:

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

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

Możesz również zrobić coś podobnego na poziomie aplikacji, jeśli chcesz napisać jeden program i pozwolić użytkownikom wybrać klasę przez konfigurację.

1

Jest prawie dokładnie takie samo podejście jak aliased ale przy użyciu standardowego modułu Perl:

use constant MakeJobSH => 'Galaxy::SGE::MakeJobSH'; 
my $job = MakeJobSH->new(); 
Powiązane problemy