私はPerlモジュールGalaxy::SGE::MakeJobSH
をOOで書いています。短い名前のPerlクラスを呼び出すにはどうすればいいですか?
Galaxy::SGE::MakeJobSH->new()
, またはその他の短い名前の代わりにMakeJobSH->new()
を使用します。どうやってやるの?
私はPerlモジュールGalaxy::SGE::MakeJobSH
をOOで書いています。短い名前のPerlクラスを呼び出すにはどうすればいいですか?
Galaxy::SGE::MakeJobSH->new()
, またはその他の短い名前の代わりにMakeJobSH->new()
を使用します。どうやってやるの?
あなたはあなたのユーザーがあなたのロードに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__ };
、あなたはおそらく、これらの方法のひとつを選ぶにしたいと思います。私は、重複した例を避けるためにそれらを組み合わせただけです。
ありがとうcjm。
私はインラインエイリアスを選択しました。
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(MakeJobSH);
sub MakeJobSH() {return 'Galaxy::SGE::MakeJobSH';}
これは私の答えの3番目の選択肢でした。 – cjm
エイリアスは、明示的にエイリアシングを要求するパッケージからの呼び出しに影響を与えたい場合にうまく機能します。ある名前空間のグローバルエイリアシングを別の名前空間にしたい場合は、代わりにPackage::Aliasを使用してください。
私はエイリアシングを気にしません。私はそれが間違った方法だと思う。あなたがタイプするのを探しているだけであれば、それは答えかもしれません(しかし、リスクよりも新しい依存関係がより効果的ですか?)。私はエイリアスが使用から遠く離れて起こっているので、メンテナンスプログラマを騙して実際の名前を隠すというアイデアは好きではなく、クラス名のようなものは実際のクラスではないという兆候はない。
私は主に簡単なサブクラス化を探しています。そのため、モジュールがどのモジュールを実装するかをクラスが決定するようにしました。
たとえば、ジョブの一部を処理するために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つのプログラムを作成し、ユーザーが設定を通してクラスを選択できるようにしたい場合は、アプリケーションレベルでの同様のことを行うことができます。
それはほとんど同じaliased
ようなアプローチが、標準のPerlモジュールを使用している:私は希望
use constant MakeJobSH => 'Galaxy::SGE::MakeJobSH';
my $job = MakeJobSH->new();
'aliased'は標準配布の一部でした。 –
__PACKAGE__を使用する方がはるかにスマートです。 – Galaxy
@Chris Lutz:定数が同じタイピングで全く同じになるのはなぜですか? http://stackoverflow.com/questions/1430548/how-can-i-call-a-perl-class-with-a-shorter-name/1435069#1435069 –