2016-03-28 9 views
0

Ich möchte This function's cyclomatic complexity is too high Nachrichten beheben und stolpern auf eine einfache Funktion, die nur eine switch Aussage enthält. Die zyklomatische Komplexität der Funktion wurde zu (5) berechnet (W074).Verständnis einer zyklomatischen Komplexität der JavaScript-Funktion

Configuration.prototype.loadAndParseDataFromStorageFilename = function(cmd) { 
    var jsonData; 

    var ext = path.extname(cmd.argumentDatasource.filename).toLowerCase(); 
    var rawData = fs.readFileSync(cmd.argumentDatasource.filename).toString().replace(/\n/g, "").replace(/\r/g, ""); 
    switch(ext) { 
     case ".config": 
      jsonData = xml.parseString(rawData); 
      break; 
     case ".xml": 
      jsonData = xml.parseString(rawData); 
      break; 
     case ".json": 
      jsonData = JSON.parse(cmd.argumentDatasource.filename); 
      break; 
     case ".js": 
      jsonData = require(cmd.argumentDatasource.filename); 
      break; 
     default: 
      var msg = colors.bgRed.white(cmd.argumentDatasource.filename + " not supported as data storage"); 
      console.log(msg); 
    } 
    return jsonData; 
}; 

Wie wird die zyklomatische Komplexität in diesem einfachen Fall auf 5 berechnet? Bis jetzt keine Idee, die Komplexität für einen Switch zu reduzieren. Für mein Verständnis würde ich die Komplexität auf max berechnen. 3 oder 4 :). Was ist die beste Methode, um eine Methode zu codieren, die nur eine switch-Anweisung enthält? Es scheint, wie codacy.com setzt maxcomplexity-4 oder 3.

+0

Was macht die Komplexitätsberechnung? – Pointy

+3

Es gibt 5 Pfade durch den Switch, auch wenn Sie nur einmal zurückkehren. Sie könnten eine Map/Lookup-Tabelle verwenden, aber ich würde wahrscheinlich den CC-Schwellenwert auf 6 oder 8 setzen oder die Warnung für diese bestimmte Funktion deaktivieren. – ssube

+0

wurde von jshint –

Antwort

1

Es gibt 5 Wege, die die Funktion übernehmen können und hat daher eine zyklomatische Komplexität von 5

0

Nur mein Code neu geschrieben. So weit ich sehen kann, sollten wir switch Befehle vermeiden, um in der besten Praxis zu kodieren?

Configuration.prototype.loadAndParseDataFromStorageFilename = function(cmd) { 
    var jsonData; 

    var ext = path.extname(cmd.argumentDatasource.filename).toLowerCase().replace(/\./g,""); 
    var parserFunction = { 
     config : xml.parseString, 
     xml : xml.parseString, 
     json : JSON.parse, 
     js : require 
    }; 

    if (parserFunction[ext]){ 
     var rawData = fs.readFileSync(cmd.argumentDatasource.filename).toString().replace(/\n/g, "").replace(/\r/g, ""); 
     jsonData = parserFunction[ext](rawData); 
    } else { 
     var msg = colors.bgRed.white(cmd.argumentDatasource.filename + " not supported as data storage"); 
     console.log(msg); 
    } 

    return jsonData; 
};