1
votes

Comment puis-je réduire la complexité de ce boîtier de commutation?

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


5 commentaires

Êtes-vous sûr de ne pas vouloir casser en cas de EXTRA ?


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


3 Réponses :


0
votes
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)

3 commentaires

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?



1
votes

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


1 commentaires

et pour simplifier drawTypes , utilisez la réponse de @Charlie Martin



0
votes

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.


0 commentaires