Как реализовать шаблон посредника Javascript (публикация-подписка) - PullRequest
4 голосов
/ 21 марта 2012

Фон

У нас есть довольно сложный клиент Silverlight, который мы переписываем на HTML / Javascript / CSS, построенный поверх тех же веб-сервисов.На самом деле у нас есть два разных клиента Silverlight, которые мы переносим, ​​которые имеют некоторые общие функции.

Я прочитал статью на http://addyosmani.com/largescalejavascript/ и планирую использовать предложенную архитектуру, и в частности шаблон-посредник.,

10000-футовый обзор шаблона, описанного Addy:

  • код разделен на маленькие модули
  • Модули знают только об объекте-посреднике;Модули не могут напрямую связываться с другими модулями
  • посредник имеет простой интерфейс для публикации и подписки на сообщения
  • Модули могут подписываться на сообщения (через API посредника), предоставляя функцию обратного вызова
  • Модули могут публиковать сообщения для посредника с объектом параметра, и посредник вызывает метод обратного вызова любых модулей, подписанных на сообщение, передавая объект параметра

Одна из основных целей здесьзаключается в достижении слабой связи между модулями.Таким образом, мы можем повторно использовать модули в двух клиентах.И проверить модули в изоляции.И посредник должен быть единственным глобальным объектом, который нам нужен, который должен быть хорошим.

Но хотя мне нравится эта идея, у меня есть ощущение, что в некоторых случаях она слишком сложна, и что некоторые из моей командыучастники не будут убеждены.Позвольте мне объяснить на примере:

Предположим, у нас есть вспомогательная функция, которая выполняет вычисления - допустим, она форматирует строку - и предположим, что эта функция должна быть доступна для любого модуля.Эта функция может входить в модуль 'tools' или 'helper', который затем можно использовать повторно и тестировать.

Чтобы вызвать эту функцию из произвольного модуля, я должен отправить сообщение, что-то вроде formatString с моей входной строкой в ​​качестве параметра.И вспомогательная функция подписалась на сообщение formatString .Но прежде чем я отправлю сообщение formatString , мне сначала нужно подписаться на сообщение, подобное formatStringResult , с функцией обратного вызова, которая может получитьрезультат.И затем, как только я получу результат обратно, я отписываюсь от сообщения formatStringResult .

Вопрос (ы)

  • Должен ли посредник предлагать этот тип вспомогательных функций непосредственно в своем собственном интерфейсе?
  • Или я должен расширить интерфейс публикации, чтобы разрешить необязательный параметр результата, где вспомогательные методы могут напрямую записывать результат?
  • Является ли компромисс наличия дополнительного слоя посредника действительно выгодным для достижения слабой связи?

Я действительно был бы признателен советам разработчиков с опытом достижения слабой связи в 'сложные приложения JavaScript.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Вы на самом деле прекрасно описали BarFoos application Framework:

https://github.com/jAndreas/BarFoos

0 голосов
/ 13 апреля 2012

Я не думаю, что посредник - это то, что вы ищете, по крайней мере, не то, что вы описали.
Подумайте только о двух объектах, запускающих formatString одновременно. Что каждый получит обратно в своем formatStringResult ?

Посредник предназначен для трансляции событий для всех, кто слушает. Издатели не хотят транслировать запросы (например, formatString ), а хотят уведомлять других об изменении своего состояния. Обратите внимание, как источник и потребитель информации различаются. Наличие посредника означает, что эти стороны не должны иметь ссылку друг на друга, чтобы общаться, тем самым снижая сцепление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...