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

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

НЛО прилетело и опубликовало эту надпись здесь
Нет смысла. Автолоуд работает медленно и считается последним средством, когда ничто уже не помогает.
Обычно AUTOLOAD срабатывает один раз, при первом вызове, создаёт функцию с требуемым именем "на лету", и передаёт ей управление. Последующие вызовы этой функции идут с обычной скоростью, так что тормоза из-за AUTOLOAD (при нормальной реализации) сильно преувеличены.
Что значит "обычно"? AUTOLOAD - это механизм реакции на вызов отсутствующего метода, однако как он реализован - дело программиста. Далеко не все AUTOLOAD'ы реально создают новые функции при вызове, чаще всего они как раз просто тупо реализуют ветвление по имени функции внутри.
"Обычно" означает что лично я чаще видел в чужом коде и писал AUTOLOAD сам именно в таком стиле. Моя субъективная статистика. Спорить с ней бессмысленно, хотя я охотно верю, что Ваша субъективная статистика может отличаться от моей.

Впрочем, это не важно. Суть моего комментария заключалась в том, что AUTOLOAD не есть нечто "томозящее" само по себе в любых условиях. AUTOLOAD это просто инструмент, которым можно пользоваться по-разному, и который абсолютно не обязательно будет тормозить.
Конечно. Но ведь TIMTOWTDI ;)!
1. Простите, но за "Пёрл" убить готов. Где Вы учили Ваш французский :)?
2. Использовать операторы and и or не для управления control flow, т.е. порядком исполнения команд, - моветон, для логический выражений есть операторы && и ||.
3. $obj->subobj and $obj->subobj->method - это, вообще говоря, расточительно; правильнее всё же писать в два выражения: my $whatever = $obj->subobj; $whatever->method if $whatever; - иначе метод subobj будет вызываться дважды, причём в первом случае результат выполнения будет отброшен.

А вообще способ записи my $a = $b->{h1} && $b->{h1}->{h2} && $b->{h1}->{h3}->{h3} || $c - это классическая замена тернарному оператору (x ? y : z).

1. Простите, но за "Пёрл" убить готов. Где Вы учили Ваш французский :)?

Недалеко от Лиона, а что, южный акцент проскальзывает? «Кёрлинг» и «сёрфинг» вас не раздражают?

Хорошо бы учитывать, что многие из присутствующих (скажем, я), живут за пределами России, и, стараясь писать грамотно, могут не обязательно быть в курсе последних решений по поводу русского правописания того или иного. Но с радостью выслушают конструктивную (с ссылками) критику.

Оператор and как раз и используется в данном случае для флоу-контрола, если присмотреться. Хотя можете записать это через &&, я не обижусь. Речь в данном случае может идти не о моветоне, а о деле вкуса. ИМО.

Что касается $subobj, то он не вызывается (поскольку не метод), а проверятеся на заданность, и результат выполнения (undef) в первом случае будет вовсе не отброшен, а полезно использован в выражении:

; $a = $obj->subobj && $obj->subobj->method

$a получит значение в любом случае. А в вашем варианте переменная расходуется, не факт, что лучше.
Насчёт "Пёрл" лень искать ссылки, просто его не слишком принято так называть. Хотя я не придираюсь, а просто готов убить :)), - ну, знаете, как за "тучА" :). Не обижайтесь. Просто неконтролируемая "пёрл"офобия.

Control flow - это open or die или open and close, а $a && $b - это не control flow.

Что означает "проверяется на заданность"? Может, Вы всё-таки имели ввиду в таком случае $obj->{subobj}? Потому как $obj->subobj - это вызов метода subobj и никак иначе. А $obj->{subobj} - это dereference хэшрефа и получение значения по ключу {subobj}.

А переменная расходуется в обоих случах, в том числе и в Вашем, просто в моём случае у этой переменной есть имя, а в Вашем для неё просто выделяется память, которая хранит промежуточные значения выражения.
А может в таги добавить "perl"? а то фиг найдешь потом статью.
Такой стиль программирования ведёт к большим проблемам. Такой код сложно читать и понимать. Про отладку и тестирование я вообще молчу. Не из-за синтаксиса, а из-за архитектуры. Использование таких динамических классов уже не очень хорошо, а использование их в стиле "метод может быть, а может и не быть, но мы при этом работаем как ни в чём не бывало" совсем плохо.

К сожалению, вы не привели никакой конкретики и контекста, так что я никакой конкретной альтернативы предложить не могу.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории