#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 /…
Ответ №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 для клиентского кода, без создания экземпляра и т.д.