Я создаю большое приложение 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, должны сказать об этой теме......
Пожалуйста, дайте мне свои мысли и советы.
Спасибо.