state (1)

| Комментариев: 2

Из записок технического менеджера.

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 (//).

Комментариев: 2

Использовать count для рандома- плохая идея.
Чем больше удаленных записей- тем хуже идея :)

Комментировать

Страницы

  • img

Об этой записи

Сообщение опубликовано 10.02.2010 23:39. Автор — ash.

Предыдущая запись — Geo::Horizon

Следующая запись — state (2)

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.