Pull to refresh

Comments 14

когда я хотел воспользоваться custom аттрибутами в 5.6, 2 года назад, они еще не работали… Причем по идее они подходили замечательно — пропускать вызовы только тегированным определенным образом методам пришлось с дополнителнительными некрасивыми проверками.
А теперь уже возврщаться к ним и руки не доходят
Довольно странно. Я специально рылся в документации, чтобы понять, как давно я игнорирую эту тему. Я понял так что Attribute::Handlers уже входил в поставку perl 5.6…
в документации они были — а вот использовать можно было только какой-то список «встроенных» аттрибутов. Выдавалось достаточно невнятное сообщение при проверке синтаксиса.
ого, целый кусок перла прошел мимо меня :)
И мимо меня тоже. Вообще не знал про аттрибуты.
Я активно использую Perl6::Export::Attrs — достаточно простую и удобную альтернативу монструозному Exporter работающую как раз на атрибутах:
  sub something :Export { ... }
  sub another :Export(:DEFAULT) { ... }

Но, надо отметить, основное достоинство атрибутов является одновременно их основным недостатком: они вводят ещё один блок кода, который вызывается неявным образом и делает неизвестно что. Что увеличивает неявность кода и, как следствие, усложняет его поддержку. Помню, отлаживал я когда-то чужой модуль написанный с использованием атрибутов — матерился я при этом значительно больше обычного. :-)

Вообще, мы потихоньку приходим к тому, что выполнение кода в блоках BEGIN/CHECK/INIT это плохая идея. При подгрузке модуля, до того как из него явным образом не вызвали функцию, он не должен ничего делать! Как-то раз я наступил на восхитительную граблю: при записи файла в vim переставал напрочь работать разрабатываемый сайт. Проблема оказалась в том, что в момент проверки синтаксиса (вызываемой автоматически при записи в vim) подгружался модуль, который «инициализировал» FastCGI-шный unix-сокет — разумеется, убивая при этом сокет на котором ждал подключений от апача сервер FastCGI этого проекта. Так же код в этих блоках имеет тенденцию вызывать странности при подгрузке тестируемого модуля/скрипта в тестах.
UFO just landed and posted this here
К сожалению, нет. Это тоже может вызывать проблемы при подгрузке этого скрипта require-ом в тестах и при операциях вроде проверки синтаксиса (я выше приводил пример из личного опыта).

Безусловно, речь не идёт о том, чтобы категорически отказаться от использования этих блоков (или оператора goto :)). Речь идёт о том, что по возможности желательно обходиться без них, т.к. у них есть неприятные побочные эффекты. А при использовании иметь эти побочные эффекты в виду.
Люди, тут проблема у товарища как раз с аттрибутами, можно ее прокомментировать?
Скорее всего при наличии такого пробела скобка не распознается как часть атрибута Method, и в результате перл вообще не понимает что это за скобочки. Вопреки мнению вопрошающего, в доке на модуль пробела в этом месте нет.
По поводу варнингов — use warnings стоит в самом модуле, возможно ему там что-то не по душе.
Могу еще раз посоветовать не забивать гвозди микроскопом и не использовать этот класс. Непрактично это.
Да, на счет пробела ошибся.

Есть ли способы отключить варнинги, кроме как отредактировав исходники и положив свою версию этого модуля?

Attribute::Method значительно сокращает количество строчек и уже по этому есть ситуации, когда оно оправдано. Так же оно хорошо, если есть необходимость набрать и посадить кодить студентов и другую дешевую рабочую силу, которые проме паскаля умеют в лучшем случае еще только си.
Попробуйте указать интерпретатору ключик -X.

По поводу Attribute::Method — не думаю, что строчка вида my ($self, $a, $b) = @_; сильно увеличит размер кода. Если студенты с даже с этим не могут справиться, я Вам не завидую.
> Еще раз повторюсь: эти вызовы выполняются прямо во время компиляции (на стадии BEGIN)…

1. Не все хэндлы вида MODIFY_*_ATTRIBUTES выполняются на стадии BEGIN. В частности MODIFY_SCALAR_ATTRIBUTES выполнится на этапе инициализации переменной ( my $tmp: attr = 0; )
Данные методы вызываются в момент объявления переменных и функций. На это стоит обратить внимание.
2. В коде MODIFY_*_ATTRIBUTES должны быть описаны раньше чем встретятся атрибуты.
Вы правы :( На момент написания материала был богатый опыт трахотни именно с атрибутами функций, отсюда и глюк. Сейчас поправим.
Sign up to leave a comment.

Articles

Change theme settings