Pull to refresh

Comments 19

do {
no strict 'refs';
*$_ = sub { html_tag($_, @_) } for qw( h1 h2 h3 p div span ul ol li em strong );
}

Так будет куда элегантнее, ИМХО.
А вот и нет. Суть меняется кардинально. Вы забываете, что здесь у вас $_ — глобальная переменная, поэтому не создаётся замыкания — значение $_ берётся для момента вызова h1, а не для момента создания ф-ции.
Кстати да, ни хрена не работает.
Невнимательно посмотрел, запускать не стал
Еще один вариант (с небольшими улучшениями в плане безопасности естественно):

use strict;
our $AUTOLOAD;

print li('me');

sub AUTOLOAD{
my $msg = shift;
my $tag = $AUTOLOAD;
$tag =~ s/.*://;
return sprintf('<%s>%s</%s>', $tag, $msg, $tag);
}

1;
… и туда упадут вообще все вызовы, даже в случае опечатки в имени метода.
Ага, надо добавить еще хэш разрешенных вызовов, а на все остальное делать die. Про безопасность выше это я и имел ввиду — так ее конечно нехорошо использовать.
А в чем заключается улучшение безопасности по сравнению с моим способом?
Это я неправильно выразился.
Тот вариант, что я представил, нуждается в улучшении — AUTOLOAD надо допилить немного, хотя бы сделать там список разрешенных функций.
да, мне тоже не близок автозапуск функций с произвольными именами.
Товарищи, а вы не забываете, что динамическими функциями вы убиваете Code Completion и прочее?

Я конечно понимаю, что на perl`е надо писать раз и навсегда, чтобы ни один человек не понял (и даже автор), но это же не есть гут!

Или и в традиционной разработке на perl`е Code Completion не ценится?
А что такое Code Completion?
К своему стыду, первый раз слышу такой термин
Это когда мы не забиваем голову знаниями всех функций и модулей, а нажимая в своем любимом редакторе на некое сочетание (обычно Ctrl + Space), получаем их.

Или напр., помним, что функция начинается на sub, нажимаем это и получаем все функции, начинающиеся на sub.

Мелочь, а экономит время + объем головы.
Честно говоря, никогда не пользовался. Если мне надо найти какую-нибудь функцию, то grep'a вполне достаточно. Кстати, grep найдет не только саму функцию, но и примеры ее использования — а это обычно как раз то, что нужно знать.

Кроме того, если сравнивать удобства от использования Code Completion с преимуществами, которые потенциально может дать динамическое программирование, то тут вообще не о чем говорить.
Попробуйте посчитать в секундах (минутах), сколько у Вас это займёт.

Потом учтите, что отвлечение на поиск функции в доках (иным способом), выбивает из состояния «потока» на некоторое время и Вы увидите, сколько времени тратится на всякую ненужную деятельность.

А время — деньги.

А про magic и проч. динамическое — это имеет смысл, когда делаешь на раз и только для себя.
В команде это — дурной тон, ибо лишний раз приходится документировать то, что может само себя автоматом задокументировать.

Хотя если мы говорим о чём-то некоммерческом — то тут-то да!
Кстати да — очень тяжело редактировать чужой модуль если функции создаются на лету, сталкивался пару раз и больше не хочу.

С другой стороны можно генерировать функции для доступа к данным в хэше на основании ключей хэша, что бы писать $row->id вместо $row->get('id').
Точно знаю, что такая подлость в PHP, в Zend Framework — все хелперы так сделаны.

И это во вроде бы крутой коробке!

// Хотя в прочих коробках отечественных вааще пипец :)
Никогда не видел code completition для Perl'а.
Возможно потому, что разобрать синтаксис перла до конца правильно может только перл =).
Кто-то из мудрых говорит нам: «Программируйте не на языке, а с использованием оного!» *

Так что в общем я верю, что в perl`е это возможно, а скорее всего нужно, када у нас проект немалый или команда.

____________________________
* Эт как всегда тов. МакКонелл :)
Sign up to leave a comment.

Articles