В чем разница между пакетом, модулем и классом в объектно-ориентированном Perl?
В чем разница между пакетом, модулем и классом в объектно-ориентированном Perl?
Ответ 1
Модули - это один файл, файл .pm, который предоставляет код. Это могут быть не пакеты, ни один пакет, ни несколько пакетов. Модулю действительно не важно, что в нем, поэтому он может быть кодом, который вставляет себя в одно и то же пространство имен, более традиционный набор подпрограмм в библиотеке или определяет представление Perl класса.
Пакет, также известный как пространство имен, содержит свои собственные переменные и подпрограммы. Это способ разделения различных частей вашей программы. Вы создаете пакет и помещаете в него свой код:
package SomePackage;
sub some_subroutine { ... } # really SomePackage::some_subroutine
Вы загружаете модуль, чтобы получить доступ к пакету:
use SomePackage; # read and compile the module file
SomePackage::some_subroutine( ... );
Класс Perl - это пакет и связанное с ним поведение. Методы в классе являются просто нормальными подпрограммами, хотя, когда мы рассматриваем подпрограммы как методы, первым параметром является вещь (имя пакета или объект, также известный как референт), который вызывает метод:
package SomeClass;
sub class_method { my( $class, @args ) = @_; ... }
sub instance_method { my( $self, @args ) = @_; ... }
Так как класс - это просто пакет, как любой другой пакет, и, вероятно, он живет в модуле, вы обращаетесь к нему одинаково с use
:
use SomeClass;
my $i = SomeClass->class_method( ... );
Синтаксис стрелок OO делает некоторые специальные вещи, чтобы подпрограмма some_method
знала, что она вызывается как метод. Перл ставит референт (SomeClass
в этом случае) в качестве первого аргумента. Кроме того, при использовании синтаксиса OO Perl знает, как использовать его функции наследования.
Методы, называемые с '- > ', получают референт в качестве первого параметра метода, поэтому этот вызов:
SomeClass->new('world');
является синтаксически, если вы назвали его с именем класса в качестве первого параметра:
SomeClass::new( 'SomeClass' ,'world'); # no inheritance this way
Это тоже работает для объектов. Когда объектом является референт:
my $i = SomeClass->new();
$i->bar( 'world');
объект является первым параметром в качестве метода:
SomeClass::bar($i, 'world');
Ответ 2
Perl не имеет классов. У него есть пространства имен, которые вы меняете с помощью package
. Для получения полной информации о Perl OOP см. Intermediate Perl или Object Oriented Perl. Вы также можете увидеть perltoot и perlboot документация. Короче говоря, Perl подделывает то, что люди ожидают, что "настоящие" классы будут с пакетами, нормальными подпрограммами и ссылками.
Модуль - это распространяемый фрагмент кода, содержащийся в файле. См. perlmod.
Я больше об этом говорю в своем сообщении для Эффективный Perler, Найти менеджеров выпуска модулей. Я не попадаю в материал OO, но я говорю о других терминах вокруг "модуля".