Руководство по разработке решателя
В данном документе описываются этапы разработки решателя на платформе IACPaaS. Считается, что приступая к разработке решателя, пользователь (разработчик) уже зарегистрирован на сайте проекта и ознакомлен со статьёй Базовая технология разработки сервисов.
Содержание
Порядок действий
- Сформулировать решаемую решателем задачу (описание назначения решателя) и убедиться в отсутствии в фонде решателей, решающих её.
- Разработать требования к решателю.
- Разработать проектную документацию решателя, включающую:
- название и описание решателя (они будут доступны всем авторизованным пользователям проекта при просмотре содержимого фонда);
- спецификацию именованых формальных параметров, задающих онтологии входных и выходных инфоресурсов, собственные инфоресурсы решателя (с полным доступом и только на чтение), а также онтологии временных инфоресурсов решателя;
- спецификацию агентов решателя и, возможно, схемы их взаимодействия (управляющего графа);
- спецификацию шаблонов сообщений, посредством которых агенты должны взаимодействовать друг с другом;
- проект интерфейса решателя (если разрабатываемый решатель является решателем с пользовательским интерфейсом), включающий:
- спецификацию множества запросов к агенту Интерфейсный контроллер решателя, каждый из которых относится к определенной web-странице (и описывается как тег <ui ... >) или к управляющему интерфейсному элементу (и описывается как его параметры) и содержит описание передаваемых данных в виде множество пар
<имя>=<значение>
, обработав которые, решатель вернёт некоторый интерфейс, который будет отображён на месте расположения запроса, или некоторые данные[3];
- проект содержательной части интерфейса решателя (состоящего из одной или нескольких web-страниц), представляющий собой комбинацию описания содержательной части интерфейса в виде текста и
ui-тегов
для ui-запросов[4];
- проект дизайнерской часть интерфейса решателя, представляющий собой описание стилей отображения текста и интерфейсных элементов с именованием таких стилей (при реализации эта информация преобразуется в таблицы стилей CSS у каждой web-страницы — множества правил CSS, определяющих внешний вид web-страниц).
При этом
- Этап проектирования выполняется без использования сервисов платформы.
- Необходимо проанализировать содержимое фонда на предмет наличия в нем онтологий, агентов, шаблонов сообщений, и др. ресурсов, используя которые, можно решить определенные подзадачи в рамках решаемой задачи, и в случае обнаружения таких сущностей их необходимо повторно использовать.
- В каждом решателе должен присутствовать Инициализирующий агент - агент, содержащий блок продукций, инициируемый системным сообщением, создаваемым платформой по шаблону Ииициализирующее сообщение при запуске сервиса с данным решателем, — это точка входа в поток управления решателя.
- Различают решатели двух типов: с пользовательским интерфейсом и без такового. Решатель первого типа должен иметь специализированный агент — Интерфейсный контроллер, а также стартовую страницу на сайте проекта. В решателях без пользовательского интерфейса также должен быть агент, содержащий блок продукций, в процессе выполнения которого должно быть создано системное сообщение по шаблону Финализирующее сообщение (для решателей с пользовательским интерфейсом это не рекомендуется - они должны завершаться пользователем вручную исключительно с помощью интерфейсных возможностей платформы).
- Интеллектуальный решатель должен работать как минимум с одним входным или одним выходным инфоресурсом (то есть должен иметь как минимум один формальный параметр). Неинтеллектуальным считается решатель, который работает без обработки инфоресурсов (например, калькулятор).
- Собственные инфоресурсы содержат информацию, управляющую работой всех сервисов, построенных с использованием данного решателя. Зачастую (как минимум, когда такая информация не меняется), такая информация может быть заложена в исходный код и использование собственных инфоресурсов не требуется.
Порядок взаимодействий при запуске
Начало работы решателя с интерфейсом происходит следующим образом: при запуске платформа (помимо отправки сообщения по Инициирующему шаблону корневому агенту решателя) выполняет "переход" на стартовую страницу — открывает модальное окно решателя, в котором отображаются все предыдущие вкладки для сервисов с этим решателем и присутствует новая (активированная) вкладка, соответствующая запускаемому сервису, и выполняет отображение стартовой страницы в этой вкладке. Отображение происходит по следюущим правилам: всё содержимое страницы, не являющееся ui-тегом отображается как есть, а на месте каждого ui-тега выполняется запрос в решатель, по получении результата которого он (результат) помещается в место расположения ui-тега (сам ui-тег не отображается). Можно сказать, что это вторая, третья и т.д. точки входя в поток управления решателя (число зависит от количество ui-тегов на стартовой странице).
Если в полученном интерфейсе (на стартовой и других страницах решателя) выполнить командное действие пользователя, которое опять же приводит к передаче ui-запроса, то его результат (ответ) заместит всё предыдущее содержимое, сгенерированное для предыдущего ui-запроса.
При выполнении перехода между страницами решателя отображение новой страницы и её дальнейшая работа подчиняется уже описанной схеме (для стартовой страницы).
Взаимодействие агентов Интерфейсный контроллер и Вид
При проектировании решателей с интерфейсом важно понимать, как сопрягаются пользовательский интерфейс (отображенный в браузере) и программная логика решателя (код блоков продукций агентов). В рамках такого взаимодействия данные от интерфейса проходят через двух агентов: Вид (агент платформы) и Интерфейсный контроллер (агент решателя), при этом между ними они помещаются в сообщение, формируемое по шаблону Запрос от агента Вид (UiParams) (отправителем считается агент "Вид"). А в обратную сторону - как минимум через агент Вид (далее для простоты изложения они будут исходить от агента Интерфейсный контроллер, хотя это не обязательно). Таким образом, задача агента Интерфейсный контроллер - получить сообщение по шаблону Запорс от агента Вид, а затем задача решателя (то есть какого-либо из его агентов, в простейшем случае - того же интерфейсного контроллера) состоит в обязательной отправке ответа агенту Вид.
Типичная схема потока данных (и в том числе — взаимодействия агентов Вид и Интерфейсный контроллер, обеспечивающего поддержку пользовательского Web-интерфейса в решателях с пользовательским интерфейсом), выглядит следующим образом:
Описание схемы:
- Внешне-системная часть агента Вид:
- получает запрос (2) от Web-сервера;
- формирует сообщение по шаблону "Запрос от агента Вид" (3), помещая в него параметры запроса, и отправляет его агенту Интерфейсный контроллер решателя;
- переходит в режим ожидания ответа (4) — уведомления (6) об окончании обработки ответного сообщения (5), которое придёт в Агентную часть агента Вид.
- Агентная часть агента Вид:
- принимает ответное сообщение (5), сформированное по одному из перечисленных на схеме шаблонов, которое содержит сформированный агентом Интерфейсный контроллер результат — в зависимости от шаблона сообщения это может быть одно из следующего:
- ссылка на инфоресурс, сформированный по онтологии "Структура интерфейса" и представляющий собой описание фрагмента интерфейса
- строка произвольного вида
- ссылка на инфоресурс произвольного вида;
- обрабатывает полученное сообщение (5), формируя результат (7) для внешнесистемной части, который может представлять собой одно из следующего:
- html-код (фрагмент интерфейса)
- строка произвольного вида
- JSON-представление;
- уведомляет (6) Внешне-системную часть агента Вид об окончании обработки сообщения (5) и отправляет ей результат (7).
- Внешне-системная часть агента Вид:
- получив увдомление (6), выходит из режима ожидания ответа (4)
- принимает сформированный в блоке продукций Агентной части агента Вид фрагмент интерфейса (7) (или строку, или JSON-представление инфоресурса) и передаёт его Web-серверу (8);
- переходит в режим ожидания нового запроса (2) от Web-сервера.
- Сообщения (5), пришедшие к Агентной части агента Вид в период времени, когда Внешне-системная часть не находится в режиме ожидания ответа, будут обработаны соответствующими блоками продукций Агентной части, но не приведут к отрисовке пользовательского интерфейса (передачи данных (6), (7), (8), (9) не будут выполнены.
- Агент Вид всегда посылает сообщения только агенту Интерфейсный контроллер решателя.
- Интерфейсный контроллер, получив сообщение по шаблону "Запрос от агента Вид" (3), может сформировать сообщение некоторому другому агенту решателя, который, выполнив свою работу, может самостоятельно сформировать и отправить сообщение (5) агенту Вид для отрисовки интерфейса (минуя Интерфейсный контроллер). Однако рекомендуется придерживаться представленной схемы, в которой агенту Вид посылает сообщения (5) только агент Интерфейсный контроллер решателя.
- Агент Интерфейсный контроллер или некоторый другой агент решателя всегда должен посылать ответное сообщение (5), сформированное по одному из перечисленных на схеме шаблонов, Агентной части агента Вид для того, чтобы Внешне-системная часть агента Вид могла выйти из режима ожидания ответа и реагировать на новые запросы (2) от Web-сервера; Внешне-системная часть агента Вид работает в нескольких потоках, число которых ограничено, так что во избежания полной потери отклика платформы каждый такой поток ожидает ответ в течение максимум 30 секунд.
В общем случае разработка решателя предполагает разработку следующих инфоресурсов, представляющих информационные компоненты:
- онтологий входных инфоресурсов;
- онтологий выходных инфоресурсов;
- онтологий собственных инфоресурсов;
- собственных инфоресурсов;
- онтологий временных инфоресурсов.
Для создания каждого из этих инфоресурсов необходимо выполнить следующее:
- создать новый инфоресурс в Фонде пользователя стандартные действия по созданию ЕХ (при этом для собственных инфоресурсов необходимо указать соответствующие онтологии);
- сформировать содержимое инфоресурсов, созданных на предыдущем шаге (причём вначале наполняеются онтологии, а затем — созданные по ним инфоресурсы) - см. статью.
Для разработки каждого нового агента и соответствующих ему шаблонов сообщений (которые он может принимать и/или отправлять) необходимо выполнить действия, описанные в руководстве по разработке агентов и шаблонов сообщений.
Разработка решателя состоит в формировании инфоресурса его представляющего.
Для этого необходимо создать инфоресурс решателя (название инфоресура есть название решателя, присвоенное ему на этапе проектирования) и сформировать его содержимое (см. статью) следующим образом:
- ввести описание решателя (берётся из проекта решателя);
- создать понятие "корневой агент" и его содержание, сделав ссылку на разработанный ранее корневой агент решателя;
- создать понятие "интерфейсный контроллер" и если решатель является решателем с пользовательским интерфейсом, то:
- сформировать содержание понятия "интерфейсный контроллер", сделав ссылку на разработанный ранее агент интерфейсный контроллер решателя;
- указать стартовую web-страницу решателя (её имя), задав строковое значение на основе метапонятия "стартовая страница" (значение должно соответствовать регулярному выражению
[A-Za-z][_A-Za-z0-9|]*
);
- создать понятие "web-страницы", под которым для каждой страницы решателя создать понятие (по метапонятию "название") с именем, совпадающим с именем страницы, под которой по метапонятию "содержимое" создать понятие с бинарным значением, представляющим собой содержимое этой страницы (см. далее);
- создать понятие "входные инфоресурсы" и, если решатель имеет формальные параметры, описывающие входные инфоресурсы, то сформировать его содержание: создать нетерминал с именем формального параметра и под ним сделать ссылку на соответствующую онтологию входного инфоресурса;
- создать понятие "выходные инфоресурсы" и, если решатель имеет формальные параметры, описывающие выходные инфоресурсы, то сформировать его содержание: создать нетерминал с именем формального параметра и под ним сделать ссылку на соответствующую онтологию выходного инфоресурса;
- создать понятие "собственные инфоресурсы" и, если решатель имеет параметры, описывающие собственные инфоресурсы, то сформировать его содержание: создать нетерминал с именем параметра и под ним сделать ссылку на соответствующий собственный инфоресурс;
- создать понятие "собственные инфоресурсы на чтение" и, если решатель имеет параметры, описывающие собственные инфоресурсы на чтение, то сформировать его содержание: создать нетерминал с именем параметра и под ним сделать ссылку на соответствующий собственный инфоресурс, с доступом на чтение;
- создать понятие "временные инфоресурсы" и, если решатель имеет формальные параметры, описывающие временные инфоресурсы, то сформировать его содержание: создать нетерминал с именем параметра и под ним сделать ссылку на соответствующую онтологию временного инфоресурса;
- задать на основе метапонятия "вести лог" нужное логическое значение (в зависимости от того, требуется ли сохранять лог агентов во время работы сервиса: true или false);
- если разрабатываемый решатель является решателем с пользовательским интерфейсом, то:
- создать вершину 'web-страницы' и под ней для каждой web-страницы решателя (описанной в его проекте):
- (под вершиной 'web-страницы') создать вершину с именем текущей web-страницы (по метапонятию 'название'),
- (под вновь созданной вершиной) задать содержимое текущей web-страницы путём порождения вершины по метапонятию 'содержимое' с содержанием вида (TEXT|UI|CSS)*, где:
- создать по метапонятию "стартовая страница" вершину с значением, заивисимо-склонированным от названия некоторой из уже созданных страниц — той, что в проекте решателя определена как стартовая.
Примечание: последовательность задания имён параметров не важна.
Пример содержимого web-страницы:
Здравствуй, пользователь!
<ui action="навигация"/>
{{#css: .bad-error {color: red;} }}
Если в проектной документации решателя явно описана схема взаимодействия агентов, то:
- создать понятие "управляющий граф" и, в соответствии со схемой взаимодействия, описанной в проекте, его содержание: непустое множество понятий и, возможно пустое, множество дуг.
- создать понятие "АгентыРешателя" и под ней - описать все его агенты.
Примечание
При формировании инфоресурса запрещается создавать понятие "логи".