Следующие способы взаимодействия: уведомления и запросы.
Уведомление определяется парой: верстак, имя уведомления. Любой инструмент может подключиться к уведомлению и ждать его. При подключении надо указать имя команды инструмента, которая будет вызвана в ответ на уведомление. . При подключении указывается: (имя верстака, имя уведомления, имя команды), пример из схемы Вира:
«..» «Изменилась редактируемая программа» «Сохранить адрес стола в тени»
При отправке уведомление надо указать пару: верстак, имя уведомления. Уведомление рассылается всем подключенным инструментам (в порядке подключения). То есть это действительно рассылка, которая используется во многих случаях. Например, инструмент через уведомление, отправляет запись в журнал (log). Так же используется в GUI для уведомления об изменениях.
Основные отличия от вызова команды по указателю:
- Как правило, подключение к уведомлению задается в схеме, а не закодировано в инструментах. Отправляющий инструмент (инструменты) не связаны с получающими инструментами. Это существенно увеличивает гибкость и позволяет писать (более) универсальные инструменты.
- Рассылка уведомлений безопасна. При удалении инструмента он автоматически вывязывается из всех списков рассылки. Как и везде в Вире, проверка сигнатуры команды, принимающей уведомление не делается.
Запросы похожи на уведомления, единственное отличие в том, что запрос возвращает результат. Обработчиком запроса может быть один инструмент, подключенный к запросу, или последовательность инструментов. Рассылка запроса идет до тех пор, пока какой-то инструмент вернет не нулевой результат. Получается гибкий и мощный механизм, практически не используемый в обычном кодировании.
Запросы и уведомления появились на втором этапе развития Вира. Замечу, что Вир однопроцессный, но если добавить параллелизм, то уведомления — это асинхронное взаимодействие, а запросы — синхронное.
Третий этап развития Вира — это добавление разъемов.
Разъемы так же, как уведомления и запросы позволяют задать взаимодействие через схему (а не заданы в коде инструмента). Разъемы должны быть определены у каждого из двух взаимодействующих инструментов — у одного исходящий разъем, у другого — входящий. Всего было две пары разъемов: входящий — исходящий:
- Передатчик — Приемник (не нужен результат)
- Заказчик — Поставщик (нужен результат)
Разъемы позволяли ускорить взаимодействие — после подключения вызов через разъем был по скорости сравним с обычным вызовом через виртуальную таблицу.
Но разъемы не решали задачу тесного взаимодействия инструментов, когда один инструмент использует несколько (много) команд другого инструмента. Но об этом дальше.
Итого, способы взаимодействия команды в Вире:
- прямой вызов команды инструмента
- прямой вызов основной команды инструмента
- косвенный вызов основной команды инструмента через верстак
- отправка/получение уведомления
- отправка/обработка запроса
- взаимодействие через разъем: Передатчик — Приемник
- взаимодействие через разъем: Заказчик — Поставщик
Постоянная ссылка