Pull to refresh

Botox — разгоняем лосей и мышей

Reading time2 min
Views617
В мире Perl очень много волшебства. Оно завораживает и готовит ловушку каждому, кто начинает использовать магию по любому поводу.
Хочется предостеречь Вас от этого, особенно если Вы используете не балаганные трюка, а истинную магию.
Мой совет прост — выбирайте инструмент под задачу, верно ее оценив.
Например, не стоит использовать Moose или Mouse, если Вам всего лишь неохота каждый раз писать
my $self = bless({}, ref $invocant || $invocant);.
Вы забиваете гвозди микроскопом.
Perl феноменально удобен в отношении ОО-style программирования, вся загвоздка в том, что это неочевидно.
Все, что требуется для достижения саматхи — пару раз вдумчиво перечитать главу о typeglob.
Или воспользоваться пакетом Botox.

Пакет прост до неприличия. Я всего лишь ввожу Ваши свойства класса в его собственное (класса) пространство имен, обернув “конфетку” в замыкание. Вуаля!
Да, это не магия — это всего лишь ловкий трюк, но какая разница? Это действительно работает, и работает хорошо (прим. автора — я надеюсь что прав в обоих пунктах ).

Класс создается так:

{{{package Parent;
use Botox qw(new prepare set_multi AUTOLOAD); # now you KNOW how mach is it cost.
my $object = new Parent(qw(name adress_rw surname_ro));
1;
}}}


Экземпляр объекта создается так:

{{{package Child;
my $foo = new Parent;
$foo->set_multi(name=>'Dolly',adress=>'Scotland, Newerland');
}}}


Botox не только избавляет Вас от необходимости дублировать код создания класса, но как можно увидеть, добавляет пару крайне полезных вещей:

1. так как свойства у нас по факту становятся методами (странными, но все же) — они наследуются. Собственно, стоит только напомнить Вам, что в дереве наследования левый верхний родитель имеет приоритет над левым нижним, а левый нижний — над расположенным правее. Семьи особо приближенные даже в седьмом колене выше дальних родственников.

2. так как свойства у нас и так странные, никто не запретит нам сделать их еще более странными — например дать им возможность иметь флаг права записи из экземпляра объекта. Иногда весьма полезно иметь свойство, доступное напрямую для чтения и опосредованно записываемое (через акцессор или в результате каких-либо более хитрых манипуляций в коде класса). Просто добавьте суффикс ‘_ro’ в название свойства для того, чтобы его закрыть от прямого изменения из экземпляра объекта. Суффикс ‘_rw’ разрешает изменение откуда угодно и является значением по умолчанию. Вы вольны писать или не писать его, и я не намерен указывать Вам что более правильно. Если по какому-то странному стечению обстоятельств мои суффиксы пересекаются с любимым Вами способом обозначения свойств класса — дайте мне знать. Будет интересно почитать ЧТО сподвигло Вас на такой синтаксис :)

3. никто не будет против возможности проинициализировать значения экземпляра (напомнию, rw-only) чохом, дабы не писать вереницу вызовов. Легко! Воспользуйтесь методом set_multi. Правда, если Вам платят по SLOC — удалите метод из прототипа. И вообще — пишите на ассемблере!

Буду рад, если Botox окажется Вам полезен, ну или если Вы напишите что-то более элегантное.
Tags:
Hubs:
Total votes 4: ↑1 and ↓3-2
Comments23

Articles