[Moscow.pm] AnyEvent::Pg

Alexandr Gomoliako zzz на zzz.org.ua
Вт Май 1 12:44:41 PDT 2012


> а вот это та самая лапша. которая очень плохо отлаживается поскольку
> не явно видно что твой &$cb действительно вызывается во всех возможных
> комбинациях.

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

> То есть основная проблема (вернее основная ошибка) не решается
> средствами языка (фреймворка): забытый так называемый return.

Откуда такая проблема? Забытый return абсолютно ни к чему не приведет
и скорее всего и нужен никогда не будет, пример:

sub baz (&) {
    my ($cb) = @_;

    foo 1, 2, sub {
        if (!$!) {
            bar 3, 4, sub {
                if (!$!) {
                    &$cb(@_);
                } else {
                    &$cb();
                }
            };
        } else {
            &$cb();
        }
    };
}

> и вот с guard'ами эти "забытые" return'ы как раз и можно
> контроллировать.


> то есть если ты объект передашь вместо каллбека функции, который будет
> содержать в себе каллбек, а в деструкторе если тот каллбек не был
> вызван - вызывать каллбек с ошибкой, вот тогда это начнет превращаться
> в фреймворк, но это еще надо универсально написать

И тогда это начнет превращаться в сложный, ненадежный код. Хотя куда
еще сложнее, в AnyEvent и так что попало. Где-то есть гард объекты,
где-то нет, где-то их нужно сохранять, где-то нет, где-то ошибки
возвращаются в тот же колбэк, где-то в другой, иногда с пустым @_, а
иногда с $!, который где-то очищается потом, а где-то нет, где-то еще
есть колбэки для инициализации, где-то еще для чего-то. Иногда даже
удивляет, что этим кто-то пользуется.

CPS, в отличии от такой каши из объектов с колбэками, помогает заметно
уменьшить сложность кода, чтобы создавать надежные работающие системы,
как впрочем и многие концепции из функционального программирования.
Попробуйте.


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