Комбинация Модули + Фаскад + Медиатор в JavaScript - PullRequest
5 голосов
/ 08 сентября 2011

Я закончил читать отличную статью на http://addyosmani.com/largescalejavascript/

В этой статье объясняется, как объединить модули, фасад и посредник вместе для приложения JavaScript.

Я могу написать то, что объясняет статья, но я не понимаю, почему мне нужно использовать фасад для доступа к медиатору.

Я думаю, что могу получить доступ к медиатору напрямую из моих модулей.

Пожалуйста, посоветуйте мне ..

П.С .: Это правильный вопрос здесь?

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Справочный материал для этого раздела, Pro Javascript Design Patterns, очень хорошо отвечает на ваш вопрос, когда говорится следующее:

Фасады никогда не являются строго необходимыми.Те же задачи могут быть выполнены без них.Это организационная структура;это позволяет вам изменять интерфейсы классов и объектов так, чтобы они были более удобными для вас.

0 голосов
/ 26 февраля 2015

Опираясь на ответ Тедрика Уокера ...

Возьмем эту, возможно, нелепую аналогию:

ВЫ - дятел (модуль), и вы хотели бы выбрать некоторых личинок (данные), которые были пролежали на опорно-структуре, Хауса (ядро).Обычно вы просто клюете (на самом деле дятлы имеют длинный заостренный язык, обвивающий их череп) личинками инфраструктуры, но какой-то плотник (Application Architect) применил Фасад снаружи дома.Однако плотник был достаточно хорош, чтобы тыкать отверстия на Фасаде, чтобы только дятлы могли получить доступ к личинкам.Кроме того, плотник был достаточно умен, чтобы придать этим отверстиям определенную форму, позволяя дятлу выполнять больше задач по поеданию личинок за пек.

Так зачем нужен фасад,снова?

Относительно Фасада обратно к посту Адди - Фасад увеличивает Песочницу в том смысле, что песочница обеспечивает предопределенную эффективность, которая позволяет одному модулю выполнять задачи определенным образом, напримероптовая.Например, вы не хотели бы, чтобы песочница заставляла пользователя писать:

var node = getNode('#errorPanel'); node.innerHTML = 'Field is invalid!';

Лучшая песочница может иметь что-то вроде:

notifyUser.error('Field is invalid!');

Фасад , с другой стороны, может обеспечить эти сквозные точно так же, только прослушивая канал mediator.fire('error:Validation', 'Field is invalid!').

Фасад в сообщении Адди, которым я все время пользуюсь, теоретически может просто перенаправлять запросы в Ядро.Вероятно, он проверил бы что-нибудь в сигнале канала канала, чтобы убедиться, что, скажем, Финч не пытается клевать личинок, из-за которых он заболел - например, выбрасывать исключение.

Вот почему может иметь смысл иметь отдельный канал-носитель (то есть посредник) для вашего ядра, где ваш Фасад является единственным «эталоном» для Ядра, а ваши модули ссылаются только на Фасад .Другой способ заключается в применении в вашей команде соглашения для имен дискретных каналов , например, mediator.fire('ready://Core') & mediator.fire('updated://ToDos/task', taskId).facade будет прослушивать 'updated://ToDos/task' и будет делать запросы к core - что может выглядеть примерно так:

var thus = mediator.installTo(this);
this.on('updated://ToDos/task', function(id){
    thus.fire('request://Core/save/todo', id);
    thus.fire('user://Core/notify/task/added', id);
});
this.on('response://Core/save/todo', function(err, id){
    if(!err){
        // ... success -- notify module!
    } else {
        // ... notify for failure :(
    }
});

ВНИМАНИЕ! делайте не пишите свои обработчики непосредственно в вызовах ваших слушателей!

I действительно надеюсь, что это поможет, и что я не разочарован в разговорах о птицах;)

...