Использование модулей, синглтонов и классов - PullRequest
0 голосов
/ 08 мая 2020

У меня вопрос по дизайну, когда использовать класс в Javascript, одноэлементном классе класса или просто экспортировать функции модуля;

Допустим, у нас есть очень простая функция pub-sub файла, которая Я хочу использовать во всем приложении, в основном с 3 элементами;

  • функция для публикации sh события
  • функция подписки на событие
  • Список подписчиков

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

Я мог бы сделать это, создав модуль, который экспортирует publi sh и подписывается, но не подписчиков

 // pubsub.js
 const subscribers = [];

 function publish(event, data){...} // publishes to all subscribers in the list
 function subscribe(event, callback){...} // Adds a callback to the subscribers
 export { 
  publish, 
  subscribe
 }

 // other files;
 import {publish, subscribe} from 'pubsub'

Но насколько я знаю, я могу добиться того же результата, создав класс; создание экземпляра и экспорт этого экземпляра, а не только функции

// pubsub.js 
class EventService {
    constructor() {
        this.subscribers = []; 
    }

    publish(event, data){...} // publishes to all subscribers in the list
    subscribe(event, callback){...} // Adds a callback to the subscribers
}

export default eventService = new EventService();

// other files; 
import eventService from 'pubsub'

И в последнем случае я также могу экспортировать сам класс (что обычно имеет смысл) и создать экземпляр при запуске приложения и поделиться им через приложение (с DI).

Вопрос такой; Как быть с go, если вы хотите, чтобы некоторые функции были общими для всего кода, который использует один и тот же список элементов, и вы хотите убедиться, что активен только синглтон. (Поскольку наличие нескольких экземпляров EventService даст неверные результаты при публикации в другом экземпляре)

(я знаю, что существуют библиотеки pubsub, это просто пример фрагмента кода, который должен использоваться в коде в единичный экземпляр).

...