Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
  Socket сервер на FreeBSD.
  Создание программ на QT4/С++
  PerlQT4 (Использование С++ классов в Perl скриптах)
  CRUD Perl Web
  MVC Catalyst
  Zyxel Configuration
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> Programming —> ООП в Perl

ООП в Perl


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

пока никто не просил - очень много сочинять/писать не буду :)

ООП в Perl

Писать $self->{attribute} – это конечно хорошо.

Но при этом интерпретатор не проверяет правильность написания аттрибута. Т.е. если вы где-то напишете $self->{atribute}, то Perl создаст новое св-во atibute, а Вы будете долго трахаться в поисках этой ошибки.

Также обращаться напрямую к аттрибутам не стоит по той причине, что если вы потом захотите сделать проверку значений, то вам это не удастся. Для более удобной работы с аттрибутами создаются методы доступа (accessors). В Perl методы доступа создаются модулем Class::Accessor:

Создание методов доступа:

package MyClass;
use Class::Accessor;
__PACKAGE__->follow_best_pactice;
__PACKAGE__->mk_accessors( qw/value1 value2/); #чтение/запись
__PACKAGE__->mk_ro_accessors( qw/ro_data/); #можно только читать
__PACKAGE__->mk_wo_accessors( qw/wo_data/); #можно только записывать. Даже автор модуля незнает нахрена это нужно (:

Class::Accessor автоматически создаёт конструктор, который устанавливает аттрибутам начальные значения.

Использование:

package main;
use feature qw/say/;
my $obj = MyClass->new( { 
    value1 => 5, 
    value2 => 'test', 
    ro_data => 'you can't write me' 
} );
$obj->set_value1(6);
$obj->set_ro_data( 'qwerty' ); # это выдаст ошибку
say $obj->get_value2;

Наследование

С наследованием от одного класса – всё просто:
use parent ModuleName. Именно use parent. От use base хотят избавиться потому что он хреновый.
Но вот с множественным наследованием у perl-а нелады. Если вы всё-таки решили воспользоваться множественным наследованием (и перед этим сто раз подумали. Потому что множественное наследование не рекомендуют использовать), то Perl преподносит вам неожиданный и неприятный сюрприз:
возьмём вот такой код:

package A;
sub method {
    return __PACKAGE__;
}
 
package B;
use parent -norequire, qw/A/;
 
package C;
use parent -norequire, qw/A/;
sub method {
    __PACKAGE__ .shift->SUPER::method();
}
package D;
use parent -norequire, qw/B C/;
sub method {
    __PACKAGE__ .shift->SUPER::method();
}
package main;
use feature qw/say/;
say D->method

если его запустить, то он выведет строку DA, вместо правильной DCA. Это происходит потому что путь наследования определяется по масиву @ISA. В каком порядке модули запушились, в таком и вызываются.
Чтобы множественное наследование работало как следует, в perl5.10 нужно написать

use mro

В Perl 5.8 для этого необходимо поставить модуль Class::C3 и написать

man Class::C3 #ибо нефиг старьём пользоваться


Исключения

Про них я напишу попозже. Потому что Грабли закроют.
UPD: в грабли не успел :-(

Изначально в perl есть работа с исключениями с помощью eval/die. Исключения эти только строковые и отличить их от системных нельзя. Если нужны нормальные исключения – лезем в CPAN и устанавливаем модуль Exception::Class. До джавовских исключений ему далеко, но базовые функции он выполняет.

use Exception::Class (
    'Exception',
    'EHandsFromAss' => (
        isa => 'Exception'
    )
);
eval {
    if ( $string == "" ) {
        EHandsFromAss->throw('Использовать "==" для сравнения строк некошерно.')
    }
};
if ( $e = Exception::Class->caught('Exception') { #наследники класса Exception
    warn $e->error;
} elsif ( $e == Exception::Class->caught ) { #все остальніе исключения
    ref $e
        ? $e->rethrow
        : die $e; #это обычные die
}

Private/Protected методы

Perl не умеет создавать совсем приватные методы. Но метод, который начинается c подчеркивания:

sub _private {
}

- является private или protected. Это просто соглашение по использованию. Никто не мешает какому-то кретину вызвать его из другого объекта. Но для адекватных людей – отличная замена приватным методам.
Оффтопик

И ещё то, о чём нельзя забывать:

   * Документирование кода с помощью POD
   * Написание unit-тестов (Test::More)

package MyClass;
 
=head1 NAME
 
MyClass
 
=head1 DESCRIPTION
 
описание того что метод делает
 
=head1 SYNOPSIS
 
пример использования
 
  my $obj = MyClass->new();
  ...
 
=head1 METHODS
 
=head2 new()
 
описание этого метода
...
=cut





Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 20 чел.
За последние 30 мин было: 47 человек
За сегодня было
126 показов,
42 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0436 секунд
Из них PHP: 22%; SQL: 78%; Число SQL-запросов: 76 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 52090