Комбинация Модули + Фасад + Медиатор в JavaScript

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

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

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

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

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

P.S. Вопрос здесь уместен?


person Moon    schedule 08.09.2011    source источник
comment
Знаете ли вы, в чем разница или преимущества этого посредника arguments.callee.info/2009/05/18/ и посредник Аддис? Для меня пока не ясно.   -  person user257980    schedule 02.12.2011


Ответы (2)


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

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

person Thedric Walker    schedule 19.10.2011

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

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

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

Так зачем опять фасад?

Возвращаясь к сообщению Эдди, Фасад — Фасад дополняет песочницу тем, что песочница обеспечивает предопределенную эффективность, которая позволяет одному модулю выполнять задачи определенным образом, например. оптовая. Например, вам не нужна песочница, которая заставляет пользователя писать:

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 :(
    }
});

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

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

person Cody    schedule 25.02.2015