Как я могу назвать класс Perl с более коротким именем?

Кажется, что то, что я пытался сделать с MOQ, не возможно.

По существу я делал попытку к MOQ текстового объекта HTTPSession, где ключ объекта, устанавливаемого на индекс, мог только быть определен во времени выполнения. Доступ к индексируемому свойству должен был возвратить значение, которое было ранее установлено. Это работает на основанные на целом числе индексы, но основанные на строке индексы не работают.

9
задан brian d foy 16 September 2009 в 15:09
поделиться

5 ответов

Вы можете предложить своим пользователям использовать модуль с псевдонимом для загрузки вашего:

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

Или вы можете экспортировать имя своего класса в переменной с именем $ MakeJobSH ;

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

Или вы можете экспортировать функцию MakeJobSH, которая возвращает имя вашего класса:

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

Я не уверен, что это такая уж хорошая идея. Обычно людям не нужно так часто вводить имя класса.

Вот что вы бы сделали в своем классе для последних двух вариантов:

package Galaxy::SGE::MakeJobSH;

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

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

Конечно, вы, вероятно, захотите выбрать только один из них методы. Я просто объединил их, чтобы избежать дублирования примеров.

12
ответ дан 4 December 2019 в 11:06
поделиться

Меня не беспокоит алиасинг. Я думаю, это неправильный путь. Если вы просто хотите меньше печатать, это может быть ответ (но разве новая зависимость больше пользы, чем риска?). Мне не нравится идея обманывать обслуживающего программиста, скрывая от него настоящее имя, поскольку псевдонимы происходят далеко от его использования, и нет никаких указаний на то, что то, что выглядит как имя класса, не является настоящим классом.

Я в основном ищу простые подклассы, поэтому я позволяю классу самому решать, какой модуль будет реализовывать часть.

Например, я мог бы начать с класса, который хочет использовать Foo для обработки часть работы. Я знаю, что, возможно, захочу создать подкласс Foo позже, поэтому я не буду его жестко кодировать:

 package Foo::Bar;

 sub foo_class { 'Foo' }

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

В приложении я выбрал использование «Foo :: Bar»:

3
ответ дан 4 December 2019 в 11:06
поделиться

псевдоним работает хорошо, когда вы хотите влиять только на вызовы из пакетов которые явно запрашивают псевдоним. Если вы хотите использовать глобальные псевдонимы одного пространства имен для другого, используйте вместо него Package :: Alias ​​.

1
ответ дан 4 December 2019 в 11:06
поделиться

Спасибо, cjm.

Я просто выбрал встроенный псевдоним.

require Exporter;

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

sub MakeJobSH() {return 'Galaxy::SGE::MakeJobSH';}
2
ответ дан 4 December 2019 в 11:06
поделиться

Это почти тот же подход, что и с псевдонимом , но с использованием стандартного модуля Perl:

use constant MakeJobSH => 'Galaxy::SGE::MakeJobSH';
my $job = MakeJobSH->new();
1
ответ дан 4 December 2019 в 11:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: