Из записок технического менеджера.
A
За последние несколько дней несколько раз рассказывал, что моя жена в свое время преподавала в университете C++ студентам-физикам. Сам-то я до сих пор испытываю нереализованное желание писать на этом замечательном языке — первом, в котором я досконально и по-взрослому разобрался.
В C++ есть модификатор static, который в применении к переменной означает, что ее значение не нужно забывать между вызовами функции.
Б
Мой коллега за последние несколько недель несколько раз коммитил код с модификатором state (правда, потом были и откаты этих правок). Сам-то я до сих пор ощущаю внутреннее желание найти еще сто тысяч применений новым фичам, появившимся в Perl 5.10, но чувствую, что досконально и по-взрослому это ощутят лишь через несколько лет.
В Perl 5.10 модификатор state делает то же самое, что и static в C++ — позволяет сохранять значение переменной между вызовами подпрограммы.
B
По-настоящему ощуить полезность новых фич получается только тогда, когда в них возникнет потребность в реальных примерах из ежедневной практики.
Сегодня как раз предоставился такой случай. Мне потребовалось выбрать случайную строку из большой базы данных. Разумеется, sort by rand() не подходит, а вот limit $N, 1 работает вполне быстро.
my $N = int rand $count;
Тут все понятно: чтобы узнать общее число записей $count, нужен еще один запрос (к тому же он с дополнительными ограничениями where). Вместо того, чтобы возиться с кешированием этой величины (memcached, BEGIN, etc.), достаточно поместить значение в статическую переменную, и вычислять ее, если она неопределена.
state $count;
unless ($count) {
# SQL-запрос select count(*)
}
my $offset = int rand $count;
# SQL-запрос select ... limit $offset, 1
В файлик todo.txt заносится задача: использовать state совместно c defined-or (//).
Использовать count для рандома- плохая идея.
Чем больше удаленных записей- тем хуже идея :)
Все равно окончательный рабочий алгоритм получился совсем другим (аж с двумя state), чего переживать :-)