Как я могу уменьшить сложность этого случая переключения? - PullRequest
1 голос
/ 21 октября 2019

У меня есть следующий case в переключателе, который содержит оператор if else if. Как я могу уменьшить его сложность? Есть какой-нибудь краткий способ, которым я могу реорганизовать этот код, чтобы уменьшить 3 пункта до 1?

case 'glidepath':             ------->  +1 

   if (chartOptions.type === trp.fai.charts.glidepath.types.OVERVIEW) { --->+1
     trp.fai.charts.glidepath.drawOverview(chartOptions.data, $chart.attr('id'));   } 

else if (chartOptions.type === trp.fai.charts.glidepath.types.DETAILS) { -->+1
      trp.fai.charts.glidepath.drawDetails(chartOptions.data, $chart.attr('id'));

      break;
    }

Ответы [ 3 ]

1 голос
/ 21 октября 2019

Разделите его на несколько функций.

case 'glidepath':
  drawTypes(type);
  break;
}
  // --- END FUNCTION ---------------


function drawTypes(type) {
  const {type, data} = chartOptions;
  const chart = $chart.attr('id');    
  cont {glidepath: {types,drawOverview},OVERVIEW,DETAILS} = trp.fai.charts;
  if (type === types.DETAILS) { // Put DETAILS first to break out earlier
      drawOverview(data, chart);
  } 
  else if (type === types.OVERVIEW) {
    drawDetails(data, chart);
  }
}
0 голосов
/ 21 октября 2019

А как насчет использования соглашения, основанного на ваших переменных, вместо прямого вызова:

Вы можете создать

chartHandlers: {
    glidepathDETAILS: function(data, id){ drawDetails(data, id); },

    glidepathOVERVIEW: function(data, id){  drawOverview(data, id); }

    invoke: function(switchKey, type, data, id){ this[switchKey + type.ToString()].apply(data, type); }
}

Обратите внимание, как функция invoke вызывает вашу функцию на основе имен вашей клавиши переключенияи тип диаграммы.

Тогда вы можете заменить весь коммутатор на один вызов.

chartHandlers.invoke(switchKey, chartOptions.type, chartOptions.data, $chart.attr('id'));

Отказ от ответственности: Я давно не программировал в JS и не проверял свой синтаксис. Это просто чтобы дать вам идею. Извините за возможные глупые ошибки.

0 голосов
/ 21 октября 2019
case 'glidepath':      
  const { types, drawOverview, drawDetails } = trp.fai.charts.glidepath
  const id = $chart.attr('id')

  switch(chartOptions.type) {
    case types.OVERVIEW:
      drawOverview(chartOptions.data, id); 
      break;
    case types.DETAILS:
      drawDetails(chartOptions.data, id);
      break;
  }

РЕДАКТИРОВАТЬ : На основании вашего комментария цель здесь состоит в том, чтобы удалить операторы if, if else и case. Я не думаю, что это улучшает код каким-либо образом, но вы могли бы сделать это ...

case 'glidepath':      
  const { types, drawOverview, drawDetails } = trp.fai.charts.glidepath
  const id = $chart.attr('id')
  const actions = {
    [types.OVERVIEW]: drawOverview,
    [types.DETAILS]: drawDetails
  }
  actions[chartOptions.type](chartOptions.data, id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...