Подтвердить что ты не робот

В чем разница между пакетом, модулем и классом в объектно-ориентированном Perl?

В чем разница между пакетом, модулем и классом в объектно-ориентированном Perl?

4b9b3361

Ответ 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, но я говорю о других терминах вокруг "модуля".