2009-09-16 7 views

答えて

12

あなたはあなたのユーザーがあなたのロードにaliasedモジュールを使用することをお勧めすることができます

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

それとも、自分のクラス名が$MakeJobSHという名前の変数にエクスポートできますが、しかし、これはすべてのこと素晴らしいアイデアです私はよく分からない

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

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

は、またはあなたのクラス名を返すMakeJobSH機能をエクスポートすることができます。一般的に、クラス名を頻繁に入力する必要はありません。

は、ここでは、最後の2つのオプションのためにあなたのクラスでやるだろ何:もちろん

package Galaxy::SGE::MakeJobSH; 

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

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

、あなたはおそらく、これらの方法のひとつを選ぶにしたいと思います。私は、重複した例を避けるためにそれらを組み合わせただけです。

+0

'aliased'は標準配布の一部でした。 –

+0

__PACKAGE__を使用する方がはるかにスマートです。 – Galaxy

+0

@Chris Lutz:定数が同じタイピングで全く同じになるのはなぜですか? http://stackoverflow.com/questions/1430548/how-can-i-call-a-perl-class-with-a-shorter-name/1435069#1435069 –

2

ありがとうcjm。

私はインラインエイリアスを選択しました。

require Exporter; 

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

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

これは私の答えの3番目の選択肢でした。 – cjm

1

エイリアスは、明示的にエイリアシングを要求するパッケージからの呼び出しに影響を与えたい場合にうまく機能します。ある名前空間のグローバルエイリアシングを別の名前空間にしたい場合は、代わりにPackage::Aliasを使用してください。

3

私はエイリアシングを気にしません。私はそれが間違った方法だと思う。あなたがタイプするのを探しているだけであれば、それは答えかもしれません(しかし、リスクよりも新しい依存関係がより効果的ですか?)。私はエイリアスが使用から遠く離れて起こっているので、メンテナンスプログラマを騙して実際の名前を隠すというアイデアは好きではなく、クラス名のようなものは実際のクラスではないという兆候はない。

私は主に簡単なサブクラス化を探しています。そのため、モジュールがどのモジュールを実装するかをクラスが決定するようにしました。

たとえば、ジョブの一部を処理するためにFooを使用するクラスから開始することがあります。私はFoo後でサブクラス化したい場合がありますことを知っているので、私はハードコードそれない:アプリケーションで

package Foo::Bar; 

sub foo_class { 'Foo' } 

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

、私は「フー::バー」を使用することを選択:

#!perl 
use Foo::Bar; 

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

その後、私はFooのを専門とする必要があるので、私はサブクラスが、私は必要な部品を上書きします作成:

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

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

1; 

別のアプリケーションがなく、小さな微調整して、ほぼすべて同じもののを使用しています。

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

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

使用すると、1つのプログラムを作成し、ユーザーが設定を通してクラスを選択できるようにしたい場合は、アプリケーションレベルでの同様のことを行うことができます。

1

それはほとんど同じaliasedようなアプローチが、標準のPerlモジュールを使用している:私は希望

use constant MakeJobSH => 'Galaxy::SGE::MakeJobSH'; 
my $job = MakeJobSH->new(); 
関連する問題