Перехожу к тем способам взаимодействия, которые должны быть в Арвиле.
Взаимодействие через протоколы. Любую арку (указатель на арку) можно преобразовать к протоколу (утиная типизация). При этом протокол должен быть статически (во время компиляции) задан в тексте арки. Если преобразование прошло, то использовать методы протокола. Также можно узнать — реализует ли арка протокол и затем, выбрать нужный протокол из нескольких.
В отличие от всех способов Вира, этот способ позволяет эффективно вызывать несколько методов другой арки. Взаимодействие безопасно, пока используется автоматическое управление памятью, то есть используемая арка не может быть удалена. Здесь есть о чем подумать, по крайней мере, о том, какое именно управление памятью использовать для арок.
Взаимодействие через протоколы можно назвать «сильным» взаимодействием, для него нужно много знать об интерфейсе арки (точнее предполагать, а не знать). Сильное взаимодействие удобно для тесно связанных арок. Например, текстовый редактор можно быть реализован несколькими арками. Для примера, предположим, что реализация использует шаблон Model-Viewer-Controller, тогда арки, реализующие компоненты шаблона могут быть сильно связаны.
С другой стороны, взаимодействие через уведомления и запросы (см. здесь) является слабым, взаимодействующие арки вообще ничего не предполагают друг о друге, связь задается через схему.
Для меня очевидно, что Арвиль должен поддерживать, как минимум, такие способы взаимодействия:
- взаимодействие через протоколы
- отправка уведомлений
- обработка запросов
Что еще?
Еще один способ, часто используемый в Вире, — это вызов основной команды инструмента. Обычно, это функция без параметров, имя которой совпадает с именем инструмента. В какой-то степени — это аналог команды (экспортированной процедуры без параметров) в Оберон системе, где на командах построен весь UI.
Забавно, вчера я долго сидел и восхищался изяществом идеи — придать значение команде с именем инструмента. По сути, это всего лишь соглашение, не требующее поддержки в языке. Но оно позволяет избежать конфликтов имен. Например, при вызове команды через верстак, имя сначала однозначно определяет инструмент (на верстаке не может быть двух инструментов с одинаковым именем), а потом и команду инструмента.
Есть достаточно много инструментов, которые используют это свойство. Я уже упоминал кнопки, которые тривиальным образом связываются с «действием» — по щелчку кнопка вызывает основную команду из инструмента, стоящего последним на верстаке кнопки. То есть связывание не требует задания имени. И это далеко не единственный пример. В Вире есть набор инструментов-посредников, которые передают управление, возможно, трансформируя сообщение, или модифицируют среду. Как правило, это инструменты с одним входом, которые подключаются к уведомлениям, кнопкам (не обязательно кнопкам UI, а часто к виртуальным кнопкам).
Что-то подобное надо делать в Арвиле, но у меня пока мысль не кристаллизовалась.