Продолжается подписка на наши издания! Вы не забыли подписаться?

Continuations в RIFE

Автор: Geert Bevin
Опубликовано: 20.10.2008

RIFE – это полнофункциональный Web-фреймворк с инструментами и API для реализации наиболее востребованных возможностей. Каждый из его наборов инструментов может использоваться отдельно, а при совместном использовании они дают множество средств для повышения производительности разработки. RIFE обеспечивает, обработку каждого объявления и определения в коде в одном месте. Это упрощает задачу разработчика, уменьшая число повторов в коде, обеспечивая целостность и облегчая поддержку.

Что такое continuations?

Continuations позволяют частям страницы вести себя как изолированные, независимые и вложенные элементы.

Эти конструкции позаимствованы из Scheme и содержат всю информацию о местоположении программы и локальных переменных методов. Используя эту информацию, приложение может прервать исполнение программы (это характерно для RIFE) и продолжить его позже с того же места, как будто ничего не случилось.

Как это применимо к Web-приложениям?

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

Результат получается примерно таким:

/* start page 1 */
output form 1
wait for input
process input
go to page 2
/* end page 1 */

/* start page 2 */
check for form 1 data
if not present go to page 1
output form 2
wait for input
process input
go to page 3
/* end page 2 */

/* start page 3 */
check for form 2 data
if not present go to page 2
output form 3
wait for input
process input
go to next page
/* end page 3 */

Но на самом деле нужно следующее:

/* start page */
output form 1
wait for input
process input
output form 2
wait for input
process input
output form 3
wait for input
process input
go to next page
/* end page */

Таким образом, вы думаете об этом как о непрерывном ряде шагов, следующих друг за другом с периодическим взаимодействием с пользователем. Если все шаги выполнены, вы переходите к следующему элементу.

RIFE позволяет писать элементы точно так же, как в приведенном выше псевдокоде. Нужно только заменить 'wait for input' вызовом метода pause();. Вызов метода pause() распознается как continuation только в том случае, если он используется внутри метода processElement(). В любом другом месте он будет просто удален. Это сделано, потому что трассировка байткода других методов элемента подразумевает рассмотрение всех методов всех классов, которые используются в Element. Это не только приведет к потерям в производительности, это просто невозможно выполнить, поскольку нельзя динамически изменять классы самого JRE.

Простой пример, иллюстрирующий сказанное выше:

public void processElement()
{
    int total = 0;
    while (total < 50)
    {
        print(getHtmlTemplate("form"));
        pause();
        total += getParameterInt("answer", 0);
    }

    print("получена сумма " + total);
}

Этот элемент берет серию ответов и складывает их. Когда сумма превышает 50, исполнение завершается, и выводится сумма.

Поскольку continuations всегда работают в одном элементе, вам придется реализовать взаимодействие с пользователем через submissions (которые в данном контексте можно рассматривать как сохранение изменений) или через exit (здесь – возврат к предыдущему состоянию), которые указывают на тот же самый элемент.

Разные модели обработки continuation

Поддержка межэлементных continuations (вызов/ответ)

Обработка множественных посылок (submissions)

Использование initialize() для исполнения кода при каждом вводе


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
........................
"С полным содержанием данной статьи можно ознакомиться в печатной версии журнала"

Copyright © 1994-2016 ООО "К-Пресс"