Поможете рассмотреть модуль в js под микроскопом?

Сегодня, уже второй раз, мне дали ссылку на статью Паттерны для масштабируемых JavaScript-приложений которую я прочел, но до конца не понял. А не понял я эту статью из-за того, что сначала говорится о модуле, а потом раз и переключается все на расширяемое приложение.
Вот. И чтобы не остаться с вопросами, помогите закрепить прочитанное.
В статье есть момент Глава 9. Паттерн «Фасад», в котором кодом проиллюстрировано совмещения модуля и фасада ( надеюсь меня не арестуют за код из статьи ):
var module = (function() {
  var _private = {
    i: 5,
    get: function() {
      console.log('Текущее значение:' + this.i);
    },
    set: function(val) {
      this.i = val;
    },
    run: function() {
      console.log('процесс запущен');
    },
    jump: function() {
      console.log('резкое изменение');
    }
  };
  return {
    facade: function(args) {
      _private.set(args.val);
      _private.get();
      if (args.run) {
        _private.run();
      }
    }
  }
}());

module.facade({run:true, val:10}); // Текущее значение: 10, процесс запущен

И первый вопрос - скажите, фасад должен оставаться так как показан или же :
var module = (function() {
  var _private = {}ж
  return {
    // вся эта область является фасадом
    // так как является публичной?
  }
}());
  • Вопрос задан
  • 2232 просмотра
Решения вопроса 4
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
модуль предоставляет нам область видимости, в которой мы прячем реализацию, а фасад в этом случае будет интерфейсом, то есть публичными методами. Пример на самом деле кажется мне немного странным...
Ответ написан
@personaljs
Более понятный пример. Здесь вы никогда не можете получить basket, но в то же время разрешено узнать количество итемов в ней и ли добавить еще один. Этот паттерн скрывает все что не должно быть увидено и изменено и возвращает вам только то, что захотите вы.
var module = (function(){
    /**
     * private variables are declared only inside the module
     */
    var basket = [];
 
    /**
     * public variables are declared in the returned object
     */
    return {
        add: function(value){ ... },
        count: function() { ... }
    };
}());
 
module.add('a');
module.add('b');
module.add('c');
 
var total = module.count();


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

// a simple facade that masks the various browser-specific methods
function addEvent( element, event, callback ) {
  
  if( window.addEventListener ) {
    element.addEventListener( event, callback, false );
  } else if( document.attachEvent ) {
    element.attachEvent( 'on' + event, callback );
  } else {
    element[ 'on' + event ] = callback;
  }
  
}
Ответ написан
@vasIvas Автор вопроса
А у меня вот ещё какой вопрос - сегодня услышал формулировку, что модуль чем-то похож на класс. Так ли это? Просто я всегда считал, что модуль, это точка входа в законченный продукт, состоящий из множества объектов.
Какая из трактовок вернее - первая, вторая или вообще никакая?
Ответ написан
AMar4enko
@AMar4enko
По поводу фасада - фасад может включать в себя какие угодно методы, а не только facade :D
Главное, чтобы их наличие соответствовало самой идее паттерна - сокрытию сложности за единой точкой входа.
Чуть-чуть модифицировал исходный код. "Экспортируемая" функция start скрывает от нас сложный процесс запуска, который включает в себя некое конфигурирование и последующий старт, что соответствует принципам паттерна.
var module = (function() {
  var _private = {
    i: 5,
    get: function() {
      console.log('Текущее значение:' + this.i);
    },
    set: function(val) {
      this.i = val;
    },
    run: function() {
      console.log('процесс запущен');
    },
    jump: function() {
      console.log('резкое изменение');
    },
    config: function(settings){
      console.log('конфигурируем подсистемы'); 
    }
  };
  return {
    facade: function(args) {
      _private.set(args.val);
      _private.get();
      if (args.run) {
        _private.run();
      }
    },
    start: function(){
        _private.config(arguments);
        _private.run();
    }
  }
}());
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы