Какова лучшая практика, чтобы справиться, если истина, то бежать? - PullRequest
0 голосов
/ 17 января 2020

function handleOrder(data) {
  if (data.payment_type === 'VISA') {
     handleVisaPayment()
  }

  if (data.payment_type === 'VISA') {
     handleMastercardPayment()
  }

  if (data.payment_type === 'PayPal') {
     handlePayPalPayment()
  }

  if (data.shipping === 'Express') {
     handleExpressShipping()
  }

  if (data.shipping === 'Standard') {
     handleStandardShipping()
  }
}

Есть ли лучший способ написать эту функцию, особенно следуя передовым методам?

Ответы [ 3 ]

4 голосов
/ 17 января 2020

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

let allowedValues = [{
    "value": "VISA",
    "handler": handleVisaPayment
  },
  {
    "value": "PayPal",
    "handler": handlePayPalPayment
  },
  {
    "value": "Express",
    "handler": handleExpressShipping
  },
  {
    "value": "Standard",
    "handler": handleStandardShipping
  }
]

function handleOrder(data) {
  let matchedOrder = allowedValues.find(({
    value
  }) => value === data.payment_type);
  if (matchedOrder) {
    matchedOrder.handler();
  }
}

Вы даже можете создать сопоставление объектов для этих значений и операций:

let allowedValues = {
  "VISA": handleVisaPayment,
  "PayPal": handlePayPalPayment,
  "Express": handleExpressShipping,
  "Standard": handleStandardShipping
}

function handleOrder(data) {
  if (allowedValues[data.payment_type]) {
    allowedValues[data.payment_type]();
  }
}
0 голосов
/ 17 января 2020

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

const data = {
  shipping: 'Standard',
  payment_type: 'VISA',
}

const handleVisaPayment = () => console.log('handling visa payment')
const handleStandardShipping = () => console.log('handling standard shipping')

const orderHandlingMap = {
  'Standard': handleStandardShipping,
  'VISA': handleVisaPayment,
}

const handleOrder = data =>
  Object.values(data)
    .filter(element => orderHandlingMap[element])
    .map(handlerName => orderHandlingMap[handlerName]())

handleOrder(data)
0 голосов
/ 17 января 2020

Прежде всего, вы выполняете один и тот же оператор IF два раза подряд.

if (data.payment_type === 'VISA') {
    handleVisaPayment
}

if (data.payment_type === 'VISA') {
    handleMastercardPayment
}

Я думаю, было бы более логично, если бы ваш второй оператор IF был таким:

if (data.payment_type === 'Mastercard') {
    handleMastercardPayment
}

Это похоже на простую ошибку копирования-вставки, но, думаю, на это стоит обратить внимание.

Во-вторых, вы можете реорганизовать свой код с помощью оператора switch. Пример:

switch (data.payment_type) {
  case 'VISA':
    handleVisaPayment
    break;
  case 'Mastercard':
    handleMastercardPayment
    break;
  case 'PayPal':
    handlePayPalPayment
    break;
}

switch (data.shipping) {
  case 'Express':
    handleExpressShipping
    break;
  case 'Standard':
    handleStandardShipping
    break;
}

Это должно сделать ваш код легче читать / поддерживать / добавлять новые функции в будущем. Опять же, я знаю, что он был указан, чтобы избежать использования switch, но это выглядит как самое простое решение здесь.

...