理解JavaScript函数的圈复杂度

时间:2016-03-28 17:27:44

标签: javascript switch-statement cyclomatic-complexity

我想修复This function's cyclomatic complexity is too high个消息并偶然发现一个只包含switch语句的简单函数。函数的圈复杂度计算为(5)(W074)。

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

在这个简单的情况下,如何将圈复杂度计算为5? 到目前为止,如果不想降低交换机的复杂性。根据我的理解,我会计算最大的复杂度。 3或4 :)。对包含仅switch语句的方法进行编码的最佳做法是什么?似乎codacy.com将maxcomplexity设置为4或3。

2 个答案:

答案 0 :(得分:1)

该函数可以采用5条路径,因此圈复杂度为5

答案 1 :(得分:0)

刚刚重写了我的代码。那么到目前为止,我可以看到我们应该避免switch命令进行最佳实践编码?

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