РВД привела из борьбы между предлагая максимальную гибкость для пользователя и расходов, как мало усилий в области развития, как это возможно, следуя итеративный подход. Он развивался с небольшими шагами, чтобы всегда иметь функциональное прогрессирующее приложение.В целях соблюдения этих требований было принято очень важное конструктивное решение: сохранить основную часть (контроллер) фиктивным движком, который просто создает RCML и делегирует всю логику где-то еще, легко доступную через HTTP.
Это, как говорится, @scottbarstow, я приветствую ваши комментарии. Наличие автономных приложений значительно упрощает настройку и обслуживание приложения, особенно сейчас, когда появляется RAS. ES должен быть инструментом для общения с действительно внешними целями, не способ делегировать все виды сложных операций за пределами RVD.
Однако «логика» стоит дорого. Представляя несколько элементов для ветвления, сравнения, манипуляции с строками и т. Д., Требуется много мышления для разработки, часы для выполнения и головные боли для отладки.
Альтернативный подход я предложить заключается в следующем:
улучшить способ ES переговоры с внешними конечными точками. Добавьте полную поддержку для отправки POST/JSON. Выбирайте выбор между типами контента application/json и url-encoded. Ручка все, что обычно требуется обычными поставщиками услуг , как Slack. Вся обработка будет выполняться в ES. Дальнейшая обратная связь здесь будет оценена.
Храните всю логику в одном месте, а не распространяйте ее через несколько новых элементов. Представьте элемент «Сценарий», где какой-то тип механизма сценариев будет использоваться для выполнения блока кода , реализующего всю необходимую логику. Позвольте этому элементу говорить снаружи мир через простой контракт на основе строки с «INs» и «OUTs». Существует уже экспериментальная реализация по этому вопросу с использованием Groovy и то же самое можно сделать на стороне сервера Javascript.
Но подождите минуту. RVD должен быть простым инструментом для обычных пользователей, а не для разработчиков! Ну, действительно. Но рассмотрим альтернативу. Будет ли проще понимать и использовать несколько новых умных элементов и все дополнительные синтаксические последствия, которые будут с ним связаны? Наверное, если только это не очень просто. Не говоря уже об отладке и поддержке.
Javascript имеет хорошо известный синтаксис, и его гораздо легче отлаживать. Он даже запускается внутри браузера, который открывает окно для тестирования на стороне клиента.
- Ввести очень простой элемент ветвления/GOTO. Он сможет сломать выполнение модуля и перенаправить на другой модуль. Однако логика ветвления будет реализована в предыдущем элементе Script.
Технические недостатки и «почему логика должна быть в одной черный ящик место»
РВД имеет состояние. Существуют переменные, которые он создает (Collect, элементы ES создают такие) в дополнение к этим, которые подаются Restcomm, которые необходимо сохранить.Поскольку поток приложений развивается в виде серии запросов на восстановление, инициированных пользователем, которые по своей природе являются апатридами, существуют два варианта.
(а) Переработайте эти переменные в URL, действий или
(б) хранить их в сессии-подобную структуру в РВД и сохранить идентификатор сеанса, который будет передан вместо этого.
RVD использует (a).
Это означает, что когда управление передается обратно в restcomm (например, когда выполняется элемент Gather/Collect), все это состояние должно быть закодировано в URL-адресе действия, содержащемся в ответе. Таким образом, когда restcomm делает следующий запрос, RVD будет иметь состояние. Его более или менее та же картина с веб-разработчиком старой школы без сеанса HTTP.
Это состояние должно быть маленьким, чтобы не было много данных, идущих туда и обратно между RVD и Restcomm.
Приложение RVD состоит из модулей, которые содержат элементы, которые обрабатываются последовательно, и любой элемент может потенциально нарушить выполнение приложения в RVD и вернуть управление обратно в restcomm. Имеет смысл сделать элементы независимыми, так что есть возможность разорвать выполнение приложения и вернуть управление обратно в Restcomm.
Я хочу сказать, что мы должны сохранять элементы независимыми, интерфейс между элементом и контекстом выполнения RVD прост и состояние легко сериализуемое. И блок-бокс, подобный элементу скрипта, похоже, соответствует этой цели.
Если я что-то не хватает, все помощники Ruby предоставляют оболочку для API. Он не вводит новые функции в структуру RVD/App. Я могу создавать внешние приложения, чтобы сделать все это, это не проблема. Однако во многих случаях я могу просто направить все взаимодействия на это приложение и даже не создать приложение. Я могу просто настроить URL-адреса приложений для чисел, как обычно, и отправить их всем. – scottbarstow