[Moscow.pm] unless

Orlovsky Alexander nordicdyno на yandex.ru
Вт Май 5 01:05:10 PDT 2009


04.05.09, 13:46, "Andrew Shitov" <andy на shitov.ru>:
> > Задумался тут о своей нелюбови к unless-у (особенно к блочной форме),
> А я наоборот люблю. Если есть необходимость сделать действия if/else,
> причем else будет выполняться с большей вероятностью, то обычно
> стараюсь написать unless/else, чтобы более вероятное действие
> оказалось в коде выше.

Дело вкуса или тема для холивора, как уже правильно заметили. Но могу попытаться объяснить причину своей не любви.
Не раз уже замечал, что при чтении кода if-ы мой "внутренний парзер perl" сглатывает быстро, unless же обычно вызывает остановку сканирования кода и повторное считывание. :) 
Самое худшее - когда в unless длинное логическое условие или отрицательное логическое выражение, тогда unless еще сильнее проигрывает if-у в "производительности" при разборе. Так что, если мне хочется чтобы более вероятное условие в ветвлении было сверху, то я скорее напишу "if not", чем unless. 
Думал это у меня одного так, но оказывается нет. Тот же Конвей в PBP пишет о том, что отрицательные условия (aka unless, until) хуже распознаются/интерпретируются (человеком) и предлагает сократить их использование, оставив в простых постфиксных формах и блочной форме без else.

> Еще один типичный случай: функции типа get_tag_id(key), которая
> возвращает id чего-то из базы, и создает новую запись, если подходящей
> записи там нет.
> my $id = sql(select id from tags where);
> unless ($id) {
>    sql(insert into);
>    $id = sql(select last_insert_id);
> }
> return $id;
> Опять же, в циклах удобно писать next unless /\d/.

Это как раз те случаи, которые меня не "анноят" (и не предаются анафеме в PBP :) и не вызывают задержек при чтении кода :)


Подробная информация о списке рассылки Moscow-pm