Comments 14
когда я хотел воспользоваться custom аттрибутами в 5.6, 2 года назад, они еще не работали… Причем по идее они подходили замечательно — пропускать вызовы только тегированным определенным образом методам пришлось с дополнителнительными некрасивыми проверками.
А теперь уже возврщаться к ним и руки не доходят
А теперь уже возврщаться к ним и руки не доходят
0
Довольно странно. Я специально рылся в документации, чтобы понять, как давно я игнорирую эту тему. Я понял так что Attribute::Handlers уже входил в поставку perl 5.6…
0
ого, целый кусок перла прошел мимо меня :)
+2
Я активно использую
Но, надо отметить, основное достоинство атрибутов является одновременно их основным недостатком: они вводят ещё один блок кода, который вызывается неявным образом и делает неизвестно что. Что увеличивает неявность кода и, как следствие, усложняет его поддержку. Помню, отлаживал я когда-то чужой модуль написанный с использованием атрибутов — матерился я при этом значительно больше обычного. :-)
Вообще, мы потихоньку приходим к тому, что выполнение кода в блоках BEGIN/CHECK/INIT это плохая идея. При подгрузке модуля, до того как из него явным образом не вызвали функцию, он не должен ничего делать! Как-то раз я наступил на восхитительную граблю: при записи файла в vim переставал напрочь работать разрабатываемый сайт. Проблема оказалась в том, что в момент проверки синтаксиса (вызываемой автоматически при записи в vim) подгружался модуль, который «инициализировал» FastCGI-шный unix-сокет — разумеется, убивая при этом сокет на котором ждал подключений от апача сервер FastCGI этого проекта. Так же код в этих блоках имеет тенденцию вызывать странности при подгрузке тестируемого модуля/скрипта в тестах.
Perl6::Export::Attrs
— достаточно простую и удобную альтернативу монструозному Exporter
работающую как раз на атрибутах:sub something :Export { ... } sub another :Export(:DEFAULT) { ... }
Но, надо отметить, основное достоинство атрибутов является одновременно их основным недостатком: они вводят ещё один блок кода, который вызывается неявным образом и делает неизвестно что. Что увеличивает неявность кода и, как следствие, усложняет его поддержку. Помню, отлаживал я когда-то чужой модуль написанный с использованием атрибутов — матерился я при этом значительно больше обычного. :-)
Вообще, мы потихоньку приходим к тому, что выполнение кода в блоках BEGIN/CHECK/INIT это плохая идея. При подгрузке модуля, до того как из него явным образом не вызвали функцию, он не должен ничего делать! Как-то раз я наступил на восхитительную граблю: при записи файла в vim переставал напрочь работать разрабатываемый сайт. Проблема оказалась в том, что в момент проверки синтаксиса (вызываемой автоматически при записи в vim) подгружался модуль, который «инициализировал» FastCGI-шный unix-сокет — разумеется, убивая при этом сокет на котором ждал подключений от апача сервер FastCGI этого проекта. Так же код в этих блоках имеет тенденцию вызывать странности при подгрузке тестируемого модуля/скрипта в тестах.
+1
UFO just landed and posted this here
К сожалению, нет. Это тоже может вызывать проблемы при подгрузке этого скрипта require-ом в тестах и при операциях вроде проверки синтаксиса (я выше приводил пример из личного опыта).
Безусловно, речь не идёт о том, чтобы категорически отказаться от использования этих блоков (или оператора goto :)). Речь идёт о том, что по возможности желательно обходиться без них, т.к. у них есть неприятные побочные эффекты. А при использовании иметь эти побочные эффекты в виду.
Безусловно, речь не идёт о том, чтобы категорически отказаться от использования этих блоков (или оператора goto :)). Речь идёт о том, что по возможности желательно обходиться без них, т.к. у них есть неприятные побочные эффекты. А при использовании иметь эти побочные эффекты в виду.
0
Скорее всего при наличии такого пробела скобка не распознается как часть атрибута Method, и в результате перл вообще не понимает что это за скобочки. Вопреки мнению вопрошающего, в доке на модуль пробела в этом месте нет.
По поводу варнингов — use warnings стоит в самом модуле, возможно ему там что-то не по душе.
Могу еще раз посоветовать не забивать гвозди микроскопом и не использовать этот класс. Непрактично это.
По поводу варнингов — use warnings стоит в самом модуле, возможно ему там что-то не по душе.
Могу еще раз посоветовать не забивать гвозди микроскопом и не использовать этот класс. Непрактично это.
+2
Да, на счет пробела ошибся.
Есть ли способы отключить варнинги, кроме как отредактировав исходники и положив свою версию этого модуля?
Attribute::Method значительно сокращает количество строчек и уже по этому есть ситуации, когда оно оправдано. Так же оно хорошо, если есть необходимость набрать и посадить кодить студентов и другую дешевую рабочую силу, которые проме паскаля умеют в лучшем случае еще только си.
Есть ли способы отключить варнинги, кроме как отредактировав исходники и положив свою версию этого модуля?
Attribute::Method значительно сокращает количество строчек и уже по этому есть ситуации, когда оно оправдано. Так же оно хорошо, если есть необходимость набрать и посадить кодить студентов и другую дешевую рабочую силу, которые проме паскаля умеют в лучшем случае еще только си.
0
> Еще раз повторюсь: эти вызовы выполняются прямо во время компиляции (на стадии BEGIN)…
1. Не все хэндлы вида MODIFY_*_ATTRIBUTES выполняются на стадии BEGIN. В частности MODIFY_SCALAR_ATTRIBUTES выполнится на этапе инициализации переменной ( my $tmp: attr = 0; )
Данные методы вызываются в момент объявления переменных и функций. На это стоит обратить внимание.
2. В коде MODIFY_*_ATTRIBUTES должны быть описаны раньше чем встретятся атрибуты.
1. Не все хэндлы вида MODIFY_*_ATTRIBUTES выполняются на стадии BEGIN. В частности MODIFY_SCALAR_ATTRIBUTES выполнится на этапе инициализации переменной ( my $tmp: attr = 0; )
Данные методы вызываются в момент объявления переменных и функций. На это стоит обратить внимание.
2. В коде MODIFY_*_ATTRIBUTES должны быть описаны раньше чем встретятся атрибуты.
+2
Sign up to leave a comment.
Articles
Change theme settings
Атрибуты: взгляд внутрь