Подтвердить что ты не робот

Помощь с "Масштабируемой архитектурой приложений JavaScript"

Я создаю большое приложение javascript, и я решил использовать масштабируемую архитектуру архитектуры Nicholas Zakas: http://developer.yahoo.com/yui/theater/video.php?v=zakas-architecture

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

Например, у меня есть три модуля: Upload, Window и Manager.

При нажатии на параметр загрузки открывается всплывающее окно с формой загрузки. Также ссылка находится в окне "менеджер".

Нажатие ссылки менеджера обновляет всплывающее окно, чтобы отобразить инструменты администратора...

...

Мне было очень полезно (псевдокод):

upload module:
  upload option click --> sandbox.notification('need pop up window', [...html markup for form...])

manager module:
  manager link click --> sandbox.notification('need pop up window', [...html markup for admin tools...])

window module:
  sandbox.listen('need pop up window') --> calls createPopUpWindow( passed in html markup  )

... Однако это противоречит философии, потому что модули upload и manager специально "запрашивают" оконный модуль, чтобы что-то сделать, поэтому они знают об этом...

Итак, единственный способ, которым я могу это сделать, это:

upload module:
  upload option click --> sandbox.notification('upload option clicked', [...html markup for form...])

manager module:
  manager link click --> sandbox.notification('manager link clicked', [...html markup for admin tools...])

window module:
  sandbox.listen('upload option clicked') --> calls createPopUpWindow( passed in html markup  )
  sandbox.listen('manager link clicked') --> calls createPopUpWindow( passed in html markup  )

.. Но это чувствует себя намного менее интуитивно понятным, и, честно говоря, я считаю, что мой код намного менее ясен, потому что, глядя на уведомление о загрузке модуля, вы можете нажать кнопку "Загрузить", не говорит мне вообще о том, что должно произойти, когда он щелкнул.. Мне нужно идти на охоту во всех моих других файлах для модулей, которые его слушают..... Который, на мой взгляд, можно рассматривать как преимущество, потому что несколько модулей могут захотеть ответить на "вариант загрузки" ', где "всплывающее окно" нужно было явно решить только одним модулем.

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

У меня также есть еще одна ситуация, которая еще более проблематична. Два модуля: Track и Container. В контейнере много дорожек, и изначально у меня только были функции дорожки внутри модуля контейнера. Но по мере того, как длина кода в модуле начала расти, я решил разделить их на свои собственные модули для чистого кода. Во всяком случае, поскольку контейнер должен знать об этом дорожки и иметь возможность ссылаться на них внутренне, единственный способ, которым я мог это настроить, - это сделать:

containerObject = function(name) {
    this.name                       = name;
    this.video_track                = {'name': 'video',   'markup': sandbox.notification('create-track', 'video')}
    this.audio_track                = {'name': 'audio_1', 'markup': sandbox.notification('create-track', 'audio')}
    ....etc....
};

Таким образом, модуль Track делает sandbox.listen('create-track') и указывает на функцию, которая возвращает новый объект трека данного типа..... Возможно, это просто не стоит отслеживать будь то собственный модуль...... Так как это единственное место, где я назначаю значение, основанное на вызове уведомления.

Мне бы хотелось услышать, что другие программисты, знакомые с pub/sub architecture, должны сказать об этой теме......

Пожалуйста, дайте мне свои мысли и советы.

Спасибо.

4b9b3361

Ответ 1

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

Ваша проблема может быть переделана на:

  • Вы хотите, чтобы функциональные возможности были разбиты на модули.
  • Вы хотите, чтобы модули были как можно более автономными, с минимальным количеством внешних ссылок
  • Модули должны работать с другими модулями в "большой схеме вещей", однако

No.3 - это то, что давало вам проблемы - вы хотите, чтобы модули были независимыми, но тогда ему нужно общаться с другими модулями, чтобы ваша программа работала.

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

Обратите внимание, что ваши модули не должны заботиться о другой стороне - Four W's

что - не должно волновать, какие классы или объекты он разговаривает (или слушает)

где - не должно заботиться о том, где другая сторона (сервер? или в том же браузере)

который - не должен заботиться о том, с каким патикулярным объектом он общается (президент или просто рабочий)

сколько - не должно волновать, сколько объектов он разговаривает одновременно с прослушиванием

Затем вы подключаете весь график с главной конфигурацией. Это основная концепция Инъекции Зависимости.

Что касается сантехники, существует несколько способов/шаблонов, которые можно сделать:

  • События и обработчики
  • Публикация/подписка
  • Контейнер IOC/DI
  • Комбинация выше