Как стать автором
Обновить

Комментарии 31

Статья готовилась для блога «Великий язык PERL!», но кармы пока маловато. Перенесу при первой возможности.
замечательно :) требую настойчиво продолжения!
в perl огромное количество фич, но юзается малая часть. так и с атрибутами.

автор подобрал удачные примеры, но вот лень (моя) подсказывает что лучше придерживаться привычных схем в которых отсутствует сабж :)
А лень это чем-то обосновывает, или просто общается? :)
лень не обосновывает. она диктует свои условия. своеобразная оптимизация процессов жизнедеятельности:wq
Эдак можно реализовать декораторы, как я вижу. Мощно.
Ну в catalyst так и делают вобщем-то, sub index :uri('/lala'){}

Атрибутами можно много фана сделать, но у них есть свои подводные камни :)
Поделитесь, какие камни достались вам. Я пока нашел только один, он описан во второй статье. Но не хотелось бы собирать их самостоятельно и дальше. К сожалению, по теме не так много информации как хотелось бы…
На сколько я понимаю это широко используется в перловом Catalyst-е
извините, промахнулась окном(((
Да в Catalyst это используется повсеместно. Могу сказать, что используется оно обосновано. Код становиться гораздо нагляднее. Мне вообще иногда начинало казаться, что я книгу читаю )
Я время от времени пытаюсь использовать редкие фичи, например фильтры, но натыкаюсь на случаи, когда они не работают или работают нетривиально. А работают программы у меня от Perl 5.6 до последних версий.
Реально атрбуты, как мне кажется, только способствуют запутыванию кода.
sub myMethod :Method($x) выглядит красиво, но не читается теми, кто атрибуты не использует Написать
sub abc {my $x = shift;}
несложно, зато нет никаких лишних зависимостей и всё понятно.
по поводу читабельности согласен. трудно предугадать кто будет поддерживать код. некоторые все еще пишут return undef; в своих творениях :)
И правильно делают, кстати.
а как же постулаты Perl Best Practices? O o
А кто их читает. Perl — язык для практиков. Главное — чтобы было удобно. И так умолчаний слишком много.
> А кто их читает
Вот и получается write-only
Два Perl-кодера иногда могут не понимать код друг друга… иногда бывает обидно, а что еще хуже препятсвует дальнейшей разработке.
В других языках проще с этим, так как они более менее стандартизированы. А на Perl тебе ничего не мешает свой язык написать, в котором уж никто ничего без тебя не поймет — обфускация )
Впрочем даже в C практиковались не очень хорошие практики, видел код
#define if if (
#define then ) {
#define else } else {
#define endif }

Комуто ведь было удобнее писать
if a then
b = ...;
else
b = ...;
endif
Для программиста одиночки — это лишние заморочки!

Их применение важно при работе в команде, это своего рода стандарт кодирования без которого командная работа просто превратится в хаос и все друг друга поубивают в спорах у кого лучше.
PBP рекомендует явные return-ы (section 9.11).

Что касается return undef, то это вполне правильная команда, если функция должна вернуть скаляр. Отличающаяся от просто return. Использование одной, когда должна быть использована другая — баг. Так что return-ы всякие нужны, return-ы всякие важны! :)
Ну для такой ерунды их использовать конечно не стоит. Я привел этот пример, т.к. он меня действительно удивил. Когда я посмотрел на реализацию этого модуля, у меня случился небольшой нервный срыв :)

А вот пример с memoize выглядит уже более здраво. Есть типичный декоратор, реализующий одинаковое для любой функции поведение, пусть даже тривиальное. Копипастить его ручками — только зря код плодить, а так получается достаточно наглядно. У меня через подобный паттерн работает гораздо более хитрая система, и пока что я счастлив, сравнивая ее с тем что было раньше — новое поведение прикручивается не за час с хреном, а за 5 минут.

Хотя я согласен, что такие трюки заслуживают документирования в первую очередь — хотя бы ввиду того, что не каждый знает про подобный синтаксис.
Это всё заплаты для сокрытия того факта, что ООП модель перла очень простая, гибкая, но слабоконтролируемая. Мне кажется, что использование чего-то, выходящего за базовые возможности, сильно бьёт по надёжности программы. Даже кэширование memoize вызывает вопросы — а какие алгоритмы для удаления из кэша, где хранится результат…
Если Вы реализуете то же самое через вполне базовое обращение к внешней функции, вопросы останутся и придется точно так же эти алгоритмы искать в другом месте. А по поводу надежности — аргументируйте, пока утверждение ничем не подкреплено. Я планирую через некоторое время написать о том, как атрибуты помогли навести порядок в одном достаточно крупном проекте. Новый код работает гораздо стабильнее и прозрачнее старого. Это конечно больше говорит о проблемах в старом коде, я могу также сделать вывод что надежность из-за новой фичи не упала.
Аргумент простой — все нововведения ненадёжны в принципе. В любой области. Если есть хорошая тестовая база — то ошибки быстро находятся, если нет — медленно. В данном случае тестовая база крохотная.

Реализовать свой алгоритм кэширования для более сложной задачи, чем кэширования sin(x), всё равно придётся.

Если проект сложный, то, наверно, можно вложиться в такого рода технологии, но у меня есть подозрение, что сложный проект на перле в принципе невозможно реализовать — перл морально устарел, поддерживать проекты на нём трудно.

Это уже давно не нововведение…
впрочем ладно. Я понял Вашу мысль :)
На счет читабельности вопрос, как всегда, спорный. Как раз для прототипов синтаксис обычный (например, Javascript). Как и для тех кто работал с блоками кода и н
А прототипы тут причём?

А что такое блоки кода?
Большое спасибо за статью! Давненько ничего не было по перлу, а жаль. С интересом прочитаю продолжение.
Кусок из Attribute::Method:

my $dp        = B::Deparse->new();
...
sub UNIVERSAL::Method : ATTR(RAWDATA) {
    my ( $pkg, $sym, $ref, undef, $args ) = @_;
    my $src = $dp->coderef2text($ref);
    if ($args) {
        $src =~ s/\{/sub{\nmy \$self = shift; my ($args) = \@_;\n/;
    }
    else {
        $src =~ s/\{/sub{\nmy \$self = shift;\n/;
    }
    no warnings 'redefine';
    *$sym = eval qq{ package $pkg; $src };
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории