Определите 2 переключаемые реализации одних и тех же функций в NodeJS / Express - PullRequest
0 голосов
/ 07 мая 2020

У меня есть несколько полей для расчета, и у меня есть 3 случая.

Поля в основном одинаковы, но есть некоторые различия.

Кроме того, расчет для получения каждого поля может зависят от разных переменных, поэтому функция может иметь другую сигнатуру.

В других языках я бы определил интерфейс, использовал бы конструкторы, используя интерфейс вместо конкретного класса, и использовал бы инъекцию зависимостей.

В nodeJS, Я новичок ie, и видел, что интерфейсов нет.

Чтобы взять конкретный пример, я должен вычислить

У меня 2 case:

  • case sup36 === true

    fixedRouting = (CG + CC + CSF * subscribedPower) / 12
    
  • case sup36 === false

    fixedRouting = (CG + CC) / 12 + subscribedPower * billedCSFCoef * numDayInPeriod / 100
    

Прямо сейчас я добавляю параметр:

getFixedRouting(isSup36, CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod) {
        if isSup{
            return (CG + CC + CSF * subscribedPower) / 12
        }else{
            return (CG + CC) / 12 + subscribedPower * billedCSFCoef * numDayInPeriod / 100
        }
    },

Проблема в том, что у меня будет больше 2 случая, и в будущем мне придется кодировать больше случаев. Этот способ кодирования также увеличит сложность моего кода.

Как мне сделать, чтобы иметь возможность иметь 2 переключаемые реализации getFixedRouting(...)?

1 Ответ

0 голосов
/ 07 мая 2020

У вас могут быть разные функции для разных случаев, например:

function getFixedRoutingSup36(CG, CC, subscribedPower) {
  return (CG + CC + CSF * subscribedPower) / 12;
}
function getFixedRoutingNonSup36(CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod) {
  return (CG + CC) / 12 + subscribedPower * billedCSFCoef * numDayInPeriod / 100;
}

Это может быть полезно, если параметры, отправляемые каждому, сильно различаются (например, выше случай sup36 не нужен или используйте billedCSFCoef или numDayInPeriod).

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

function getFixedRouting(dataType, CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod) {
  switch (dataType) {
    case 1:
      return getFixedRoutingSup36(CG, CC, subscribedPower);
    case 2:
      return getFixedRoutingNonSup36(CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod);
    case 3:
      return someOtherFunction();
  }
}

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

Другой вариант - передать параметры как объект Javascript, чтобы содержимое может отличаться:

function getFixedRouting(data) {
  switch (data.type) {
    case 1:
      return getFixedRoutingSup36(data.CG, data.CC, data.subscribedPower);
    case 2:
      return getFixedRoutingNonSup36(data.CG, data.CC, data.subscribedPower, data.billedCSFCoef, data.numDayInPeriod);
    case 3:
      return someOtherFunction();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...