Фон
У нас есть довольно сложный клиент Silverlight, который мы переписываем на HTML / Javascript / CSS, построенный поверх тех же веб-сервисов.На самом деле у нас есть два разных клиента Silverlight, которые мы переносим, которые имеют некоторые общие функции.
Я прочитал статью на http://addyosmani.com/largescalejavascript/ и планирую использовать предложенную архитектуру, и в частности шаблон-посредник.,
10000-футовый обзор шаблона, описанного Addy:
- код разделен на маленькие модули
- Модули знают только об объекте-посреднике;Модули не могут напрямую связываться с другими модулями
- посредник имеет простой интерфейс для публикации и подписки на сообщения
- Модули могут подписываться на сообщения (через API посредника), предоставляя функцию обратного вызова
- Модули могут публиковать сообщения для посредника с объектом параметра, и посредник вызывает метод обратного вызова любых модулей, подписанных на сообщение, передавая объект параметра
Одна из основных целей здесьзаключается в достижении слабой связи между модулями.Таким образом, мы можем повторно использовать модули в двух клиентах.И проверить модули в изоляции.И посредник должен быть единственным глобальным объектом, который нам нужен, который должен быть хорошим.
Но хотя мне нравится эта идея, у меня есть ощущение, что в некоторых случаях она слишком сложна, и что некоторые из моей командыучастники не будут убеждены.Позвольте мне объяснить на примере:
Предположим, у нас есть вспомогательная функция, которая выполняет вычисления - допустим, она форматирует строку - и предположим, что эта функция должна быть доступна для любого модуля.Эта функция может входить в модуль 'tools' или 'helper', который затем можно использовать повторно и тестировать.
Чтобы вызвать эту функцию из произвольного модуля, я должен отправить сообщение, что-то вроде formatString с моей входной строкой в качестве параметра.И вспомогательная функция подписалась на сообщение formatString .Но прежде чем я отправлю сообщение formatString , мне сначала нужно подписаться на сообщение, подобное formatStringResult , с функцией обратного вызова, которая может получитьрезультат.И затем, как только я получу результат обратно, я отписываюсь от сообщения formatStringResult .
Вопрос (ы)
- Должен ли посредник предлагать этот тип вспомогательных функций непосредственно в своем собственном интерфейсе?
- Или я должен расширить интерфейс публикации, чтобы разрешить необязательный параметр результата, где вспомогательные методы могут напрямую записывать результат?
- Является ли компромисс наличия дополнительного слоя посредника действительно выгодным для достижения слабой связи?
Я действительно был бы признателен советам разработчиков с опытом достижения слабой связи в 'сложные приложения JavaScript.