Javascript 如何降低此交换机案例的复杂性?

Javascript 如何降低此交换机案例的复杂性?,javascript,code-complexity,Javascript,Code Complexity,我在开关盒中有一个案例,它包含ifelse if语句。如何降低其复杂性?有没有什么简洁的方法可以重构这段代码,将3分减为1分 case 'glidepath': -------> +1 if (chartOptions.type === trp.fai.charts.glidepath.types.OVERVIEW) { --->+1 trp.fai.charts.glidepath.drawOverview(chartOptions.d

我在开关盒中有一个
案例
,它包含
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;
    }
编辑:根据您的评论,这里的目标是删除
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)

将其拆分为多个函数

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);
  }
}

使用基于变量的约定而不是直接调用如何:

你可以创造

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编程了,也没有检查我的语法。这只是给你一个想法。对不起,可能的愚蠢错误。

嘿,查利谢谢你的努力,似乎SunARQube会考虑<代码> CASE < /代码>和<代码>如果单词为+1点。这看起来有点复杂。它的工作原理是否与原始代码类似?如果你能解释一下,那会很有帮助的。ThanksI应该在最后一句话之后添加
break
,对吗?为了简化
drawTypes
,请使用
@Charlie Martin
的答案,如果出现
额外的
,您确定不想
break
吗?还有什么
媒体。type
吗?您打开的
是什么?请共享您的完整代码,这可能很重要。请不要编辑问题中的代码,以免使答案无效。请稍候重构代码
chartHandlers.invoke(switchKey, chartOptions.type, chartOptions.data, $chart.attr('id'));