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