Передача флагов для функций через методы доступа - какой это шаблон JavaScript? - PullRequest
3 голосов
/ 06 декабря 2011

Я заметил следующий шаблон в socket.io-node :

// e.g. 1
socket.volatile.emit('bieber tweet', tweet);

// e.g. 2
socket.broadcast.json.send({ a: 'message' });

в более широком смысле это выглядит следующим образом:

someObject.functionFlagA.functionFlagB.functionFlagEtc.someFunction(/* etc */);

Как называется этот шаблон, когда вы добавляете флаги, которые могут повлиять на выполнение функции, в цепочку методов доступа, каждый из которых возвращает целевую функцию (с любыми другими доступными / подходящими цепочками доступа)?Когда это уместно, скажем, просто путем передачи некоторых параметров в функцию?

Глядя на это, я подумал о создании объекта sync для моего веб-приложения HTML5 следующим образом:

// Saves someObj to localStorage AND to server-maintained session
sync.toLocalStorage.toServer.save(someObj);

... так как это было бы более самодокументируемым, чем:

// Saves someObj to localStorage AND to server-maintained session
sync.save(someObj, true, false, true);

Это правильное использование вышеуказанного шаблона?


РЕДАКТИРОВАТЬ 2011-12-06 13: 06: 15

Для любопытных, именно так socket.io реализует это:

Socket.prototype.__defineGetter__('volatile', function () {
  this.flags.volatile = true;
  return this;
});

, который используется в цепочке для окончательного вызова следующей внутренней функциикоторый отправляет пакет и очищает флаги:

Socket.prototype.packet = function (packet) {
  /* snip */
  this.setFlags(); // clears this.flags

  return this;
};

1 Ответ

2 голосов
/ 08 декабря 2011

Я бы назвал это примером свободного интерфейса .

Из статьи Википедии :

В разработке программного обеспечения,Свободный интерфейс (впервые разработанный Эриком Эвансом и Мартином Фаулером) - это реализация объектно-ориентированного API, цель которого - обеспечить более читаемый код.Свободный интерфейс обычно реализуется с помощью цепочки методов для передачи контекста инструкции последующего вызова.

Конечно, в вашем примере у вас есть свойства вместо методов.Но, глядя на код узла socket.io, «свойства» запрограммированы как __defineGetter__, так что вы также можете сказать, что они являются методами.

Что касается вашего объекта синхронизации для HTML5: подумайте о состоянииобъекта синхронизации после вызова save.Сбрасывается ли в исходное состояние или запоминает конфигурацию?Что произойдет, если вы позвоните сохранить дважды подряд?

Если речь идет только о читабельности, вы можете также передать вызывающим абонентам конфигурацию следующим образом:

sync.save(someObj, { toLocalStorage: true, toServer: true });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...