Соглашение об именах классов Perl - PullRequest
7 голосов
/ 29 февраля 2012

Допустим, я создаю класс с именем Bar. Файл Bar.pm начинается

package Bar;

Чтобы избежать столкновения с другими Bar классами, я поместил файл в подкаталог Foo. Так что теперь, когда я использую класс, я должен написать

use Foo::Bar;

У меня вопрос: мне нужно изменить имя класса на Foo::Bar? Другими словами, мне нужно изменить первую строку Bar.pm на

package Foo::Bar;

? Проблема в том, что если я сделаю это, то теперь я должен ссылаться на класс как Foo::Bar везде, например

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

, что раздражает (та же проблема обсуждалась в этот вопрос ), тем более что мне нравятся методы класса.

Ответы [ 5 ]

9 голосов
/ 29 февраля 2012

Да, вы должны изменить имя package, чтобы оно точно совпадало с именем use.

2 голосов
/ 01 марта 2012

Если вы думаете, что имя класса Bar может конфликтовать с другими классами с именем Bar, то простое перемещение файла не поможет. Если ваша программа в конечном итоге использует и Bar, и Foo::Bar, то оба будут загружены в одно и то же пространство имен. В тот момент, что происходит с вашей программой, можно только догадываться.

Если вы не хотите вводить длинные имена классов, вы можете использовать переменную для хранения имени.

use My::Long::Class::Name::For::Bar; 
my $bar_class = 'My::Long::Class::Name::For::Bar'; 

$bar_class->class_method(); # the same as My::Long::Class::Name::For::Bar->class_method()
1 голос
/ 29 февраля 2012

Цитирование perldoc -f require:

Если EXPR - пустое слово, требование предполагает расширение «.pm» и заменяет "::" на "/" в имени файла, чтобы упростить загрузить стандартные модули. Эта форма загрузки модулей не рискует изменяя ваше пространство имен. Другими словами, если вы попробуете это:

    require Foo::Bar;     # a splendid bareword 

Функция require будет искать файл «Foo / Bar.pm» в каталоги, указанные в массиве @INC.

Итак, да, принято считать, что если ваш модуль находится в $dir/Foo/Bar.pm для некоторого $dir в @INC, то он должен называться Foo::Bar.

1 голос
/ 29 февраля 2012

Вам не нужно строго (т.е. это решение о стиле, а не то, что предписывает компилятор), но это хорошая идея, чтобы следовать соответствующим рекомендациям, изложенным в perlmod / perlnewmod, чтобы сделать программное обеспечение легко распространяемым.

IOW, если вам мешают длинные имена, найдите редактор с автозаполнением.

0 голосов
/ 01 марта 2012

Пакет Local зарезервирован только для этого использования. Например, если вы создаете пакет Bar.pm, вы можете вызвать пакет Local::Bar и знать, что он не будет конфликтовать с чем-то в CPAN.

По умолчанию @INC включает текущий каталог, так что вы можете создать подкаталог Local, а затем поместить все свои пакеты туда. В компании я разделю пространство имен пакета Local на группы и даже имена разработчиков. Например, я мог бы использовать Local::Cm::Bar или Local::David::Bar. Таким образом, если я решу, что смогу использовать класс Алисы Бар, я могу просто включить Local::Alice::Bar.

Да, стандартные правила CPAN гласят, что вы не должны использовать ваше имя в пространствах имен пакетов, но пакеты Local никогда не попадают в CPAN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...