Вопрос

В Perl есть функции ООП, но они используются довольно редко.Как создавать и использовать объекты Perl с методами и свойствами?

Это было полезно?

Решение

Вам обязательно стоит взглянуть Moose.

package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

Moose предоставляет вам (помимо прочего) конструктор, методы доступа и проверку типов бесплатно!

Итак, в вашем коде вы можете:

my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15);     # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5);   # FAILS! Free type check.

Хорошей отправной точкой является Moose::Manual и Moose::Cookbook

Если вам просто нужны базовые вещи, вы также можете использовать Mouse который не такой полный, но без большей части штрафа за время компиляции.

Другие советы

лось, определенно.

package Person;
use Moose;
has age => ( isa => Int, is => 'rw'); 
has name => ( isa => Str, is => 'rw'); 
1;

Сразу же у вас есть бесплатный метод new() и методы доступа к атрибутам, которые вы только что определили с помощью «has».Итак, вы можете сказать:

my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";

и так далее.Более того, ваши методы доступа проходят бесплатную проверку типов (и вы можете определять свои собственные типы, а также стандартные).Кроме того, вы получаете «расширения» для создания подклассов, «с» для ролей/признаков и множество других замечательных вещей, которые позволяют вам приступить к реальной работе по написанию хорошего надежного и поддерживаемого объектно-ориентированного кода.

TMTOWTDI, но этот работает.

В настоящее время я использую Объект::InsideOut всякий раз, когда мне нужны объекты, это довольно приятно и даст вам много возможностей по сравнению со стандартными благословенными хэш-объектами.При этом, если бы я начинал новый проект, я бы серьезно присмотрелся к Мусу.

Хотя читать официальную документацию PERL полезно, я бы НЕТ рекомендуйте попробовать создать свою собственную объектную структуру или создать объекты с использованием хэшей, слишком велик соблазн пойти по легкому пути и «пикнуть» непосредственно в «частные» переменные объектов, полностью нарушая инкапсуляцию, это аукнется, когда вы захотите провести рефакторинг объекта.

Объекты Perl — это НЕ просто благословенные хеши.Это благословенные ССЫЛКИ.Они могут быть (и чаще всего являются) благословенными ссылками на хеш, но с таким же успехом они могут быть благословенными ссылками на скаляры или массивы.

Официальное руководство по CPAN-сайт хороший.

Еще есть хорошая статья под названием Верблюжьи какашки в КодПроекте.

Я настоятельно рекомендую взглянуть на Moose, если вы хотите реализовать объектно-ориентированный подход на Perl.Однако это бесполезно, если вы не понимаете, что означает объектно-ориентированный подход в Perl.Чтобы лучше понять, как работает Perl OO, я написал обзор в своем блоге: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-ориентированный-perl/

С точки зрения структуры данных, объект является ссылкой с несколькими дополнительными функциями.Интерпретатор знает, что эти специальные ссылки следует рассматривать как объекты, поскольку они были «благословлены» ключевым словом «bless».Благословенные ссылки содержат флаг, указывающий, что они являются Объектом.По сути, это означает, что вы можете определять и вызывать для них методы.

Например, если вы создали базовую хеш-ссылку, это не сработает:$hashref->foo();

Но если вы создадите благословенную хэш-ссылку (также называемую объектом), это сработает:$blessed_hashref->foo();

Moose — отличный модуль для ООП в Perl, поскольку он создает реализуемый объектно-ориентированный уровень И автоматически обрабатывает методы доступа, поэтому вам не нужно определять кучу геттеров и сеттеров.Если вы хотите использовать Devel::Peak, чтобы узнать, как интерпретатор Perl хранит объекты, перейдите по ссылке на запись в блоге, которую я разместил выше.

С одной стороны, каждый класс представляет собой пакет;вы устанавливаете (при необходимости множественное) наследование, устанавливая переменную пакета @ЭТО (желательно во время компиляции);вы создаете объект из существующего фрагмента данных (часто, но не всегда, анонимного хеша, используемого для хранения переменных экземпляра) с помощью благословить(ССЫЛКА [, ИМЯ КЛАССА]);вы вызываете методы объекта, такие как $obj->имя_метода(@ARGS), и методы класса, такие как "ИМЯ КЛАССА"->имя_метода(@ARGS).Порядок разрешения множественного метода наследования можно изменить с помощью ТО.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top