Наиболее распространенный шаблон для реализации переменной с настраиваемой областью действия модуля

#javascript #design-patterns #ecmascript-6 #module

#javascript #шаблоны проектирования #ecmascript-6 #модуль

Вопрос:

Я пишу клиент для взаимодействия с серверным API на JavaScript. У меня есть опыт работы с ООП, но я пытаюсь использовать современный ECMAScript.

Итак, я начал с этого:

customerApi.js:

 const baseUrl = "http://myapi";
export const getCustomers = () => { /* get customer code */ }
export const addCustomer = cust => {}
export const deleteCustomer = id => {}
  

Все функции используют baseUrl.

Теперь я хочу провести рефакторинг, чтобы код, использующий customerApi.js устанавливает / передает в baseUrl, и единственные способы, которые я придумал, это —

сделайте это классом:

 export default class customerApi {
  constructor(baseUrl) {
   this._baseUrl  baseUrl;
  }
}
  

Передайте его в каждый метод:

 export const getCustomers = (baseUrl) => { /* get customer code */ }
export const addCustomer = (baseUrl,cust) => {}
export const deleteCustomer = (baseUrl,id) => {}
  

Обернуть в функцию:

 const moduleFn = baseUrl => (
  return {
    getCustomers: () => { /* get customer code */ }
    addCustomer: (cust) => {}
    deleteCustomer: (id) => {}
  }
)
export default moduleFn;
  

Это всего лишь примеры.
Какой наиболее распространенный шаблон для реализации «настраиваемой» переменной в модуле?

Комментарии:

1. Все они работают нормально, поэтому я боюсь, что то, что вы спрашиваете, основано на мнении

2. изменено, чтобы меньше основываться на мнениях, хотя я согласен с мнениями. нужен stackoverflow для мнений шаблона проектирования.

3. class Является наиболее распространенным. Фабрика объектов в значительной степени эквивалентна классу. Отдельные функции встречаются реже, поскольку передавать baseUrl везде неудобно.

4. Возможно, это то самое место: softwareengineering.stackexchange.com/questions/tagged /…

5. softwareengineering.stackexchange.com/questions/389371/…

Ответ №1:

Я бы выбрал функциональный подход

 export default function(baseUrl){

  return Object.freeze({
    getCustomers: () => { /* get customer code */ }
    addCustomer: (cust) => {}
    deleteCustomer: (id) => {}
  })

}

  

Это потому, что все функции имеют закрытие в baseUrl и никакой дополнительной работы не требуется.

Клиентский код может просто

 import yourmodule from 'yourmodule';
var derp = yourmodule('www.derp.com')

  

Комментарии:

1. Я согласен, что это лучший API для клиентского кода, без создания экземпляра и т.д.