J'ai le cas
suivant dans le cas du commutateur qui contient l'instruction if
else if
. Comment puis-je réduire sa complexité? Existe-t-il un moyen concis de refactoriser ce code pour réduire 3 points à 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 Réponses :
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)
Hey Charlie, merci pour l'effort, il semble que Sonarqube considère les mots case
et if
comme +1 point.
Cela semble un peu complexe à comprendre. Cela fonctionnerait-il de la même manière que le code d'origine? Il serait utile que vous puissiez expliquer un peu. Merci
Je devrais ajouter break
après la dernière déclaration, non?
Divisez-le en plusieurs fonctions.
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); } }
et pour simplifier drawTypes
, utilisez la réponse de @Charlie Martin
Qu'en est-il de l'utilisation d'une convention basée sur vos variables au lieu d'un appel direct:
Vous pouvez créer
chartHandlers.invoke(switchKey, chartOptions.type, chartOptions.data, $chart.attr('id'));
Remarquez comment la fonction invoke appelle votre fonction en fonction des noms de votre touche de commutation et le type de graphique.
Vous pouvez alors remplacer l'intégralité de votre commutateur par un seul appel.
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); } }
Clause de non-responsabilité: Je n'ai pas programmé en JS depuis un moment et je n'ai pas vérifié ma syntaxe. C'est juste pour vous donner une idée. Désolé pour d'éventuelles erreurs stupides.
Êtes-vous sûr de ne pas vouloir
casser
en cas deEXTRA
?Quels autres
media.type
s existe-t-il?Sur quoi
allumez-vous
? Veuillez partager votre code complet, cela peut avoir de l'importance.Veuillez ne pas modifier le code de la question afin qu'il invalide les réponses.
Juste une minute pour refactoriser le code