В чем разница между пакетом, модулем и классом в объектно-ориентированном Perl? - PullRequest
18 голосов
/ 17 июля 2009

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

Ответы [ 2 ]

29 голосов
/ 17 июля 2009

Модули - это один файл, файл .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 знала, что она вызывается как метод. Perl ставит референт (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'); 
12 голосов
/ 17 июля 2009

Perl не имеет классов. У него есть пространства имен, которые вы изменяете с помощью package. Для получения полной информации о Perl OOP см. Промежуточный Perl или Объектно-ориентированный Perl . Вы также можете просмотреть документацию perltoot и perlboot . Короче говоря, Perl подделывает то, что люди ожидают от «настоящих» классов с пакетами, обычными подпрограммами и ссылками.

Модуль - это распространяемый фрагмент кода, содержащийся в файле. См. perlmod .


Подробнее об этом я расскажу в своем посте для The Effective Perler , Найдите менеджеры по выпуску модуля . Я не разбираюсь в вещах ОО, но я говорю о других терминах вокруг "модуля".

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