В Perl объекты реализованы через "blessing" ссылок на стандартные структуры данных (массивы, хэши, скаляры). Исторически ООП в Perl строится на обращении к хэшу, где ключи — имена атрибутов, а значения — сами данные. Такой подход обеспечивает гибкость, но требует дисциплины: язык не реализует строгую инкапсуляцию и модификаторы доступа — всё базируется на соглашениях.
Проблема: Без явных ограничений доступ к атрибутам возможен из любого кода; легко сломать инварианты объекта, перепутать namespace, сделать ошибку в наследовании.
Решение — строго следовать соглашениям: прятать внутренние данные через соглашение (например, подчеркивания), по возможности использовать accessor-методы, а для сложных задач применять стандартные модули Moose, Moo, Class::Accessor и т. д.
Пример кода:
package Animal; sub new { my $class = shift; my $self = { _name => shift }; bless $self, $class; return $self; } sub get_name { $_[0]->{_name} } package Dog; use parent 'Animal'; sub bark { print "Woof! "; } my $dog = Dog->new("Buddy"); print $dog->get_name; $dog->bark;
Ключевые особенности:
Можно ли создать объект Perl без использования bless?
Ответ: Нет, только bless превращает обычную ссылку в объект, понимаемый методом ->
Зачем нужен base/parent и в чем разница с @ISA?
Ответ: @ISA — это массив, который указывает на базовые классы. base/parent автоматизируют работу с @ISA и делают наследование модулей более безопасным: предотвращают двойное наследование и дают дополнительные проверки.
Перекроет ли дочерний класс методы родительского, если они определены с тем же именем?
Ответ: Да, если в дочернем классе определён метод с тем же именем, '->' выберет его в первую очередь — работает классическое "method overriding".
В модуле Animal данные хранятся в открытых атрибутах, к которым обращаются напрямую. Кто-то неосознанно изменяет значение поля из вне — объект переходит в неконсистентное состояние.
Плюсы:
Минусы:
Модуль использует accessor'ы, все внутренние поля начинаются с _, есть чёткая спецификация — только через get/set-методы идёт работа с данными, внесены проверки в set.
Плюсы:
Минусы: