Pull to refresh

Perl: Централизованный вызов классов и методов. Из одного отдельно взятого класса.

Reading time2 min
Views567
Идея вот в чем: если, скажем, вы в процессе работы используете определенное окружение, какие-нибудь классы и модули, то может случиться так, что вы захотите, прямо-таки, возжелаете, использовать какой-нибудь класс-проводник между привычными классами и непосредственно вами.

Тут даже можно придумать несколько положительных моментов в этом. Например, вы не подключаете все классы в каждом скрипте, создавая в шапке кода стройную колонку из привычных «use». Ну, как бы, экономим место. Еще можно придумать так: вы используете не прямое подключение к классу и вызов его методов производите через класс-проводник, что вам не мешает заменить один класс другим и даже не заметить разницы. Конечно, в том случае, если методы будут совпадать в обоих классах :-)

Так или иначе, должно получиться что-то вроде этого:

my $name = $myClass->cgi->param( 'name' );
my $date = $myClass->date->get_local_date();


То есть, ваш класс-проводник обращается к псевдониму, внутреннему своему предтавлению нужного класса. Вот как-то так, в общем…

Для этого в нашем классе-проводнике мы организуем хэш-таблицу представлений нужных классов:

my $classes = { cgi => CGI, date => My::Date::Module };

По сути, первое звено в цепочке $myClass->cgi->param — это метод. Метод, которого нет и не будет в нашем классе-проводнике, по той простой причине, что это вообще удивительно — писать груду методов для использования классов. Мы будем использовать то, что дает нам Perl — метод AUTOLOAD, который вызывается в том случае, если метод класса не найден. Соответственно, сам вызыванный метод находится в переменной $AUTOLOAD:

sub AUTOLOAD {
my $self = shift;
$self->{$sub} = $classes->{$sub}->new unless $self->{$sub};
return $self->{$sub};
}


Этот метод всего лишь создает экземпляр класса, если он не создан или просто возвращает его обратно, если он уже есть.

У такого метода есть ряд недостатков. Например, не понятно до конца, зачем он нужен =) Шучу. Это может пригодиться. Но не в тех случаях, когда у нужного вам класса в конструкторе содержится масса полезных настроек, которые вы часто меняете. А в остальном — прикольно.
Tags:
Hubs:
+1
Comments2

Articles

Change theme settings