如何从这段代码中减少圈复杂度?

时间:2016-01-11 22:43:46

标签: javascript cyclomatic-complexity

我正在重构一些遗留代码。我从jshint得到关于圈复杂度的错误,我试图弄清楚如何修复警告。代码在node.js中,所以JavaScript中的任何东西都非常受欢迎。

  if (rawObj.title) {
    formattedObj.name = rawObj.title;
  }
  if (rawObj.urls && rawObj.urls.web) {
    formattedObj.url = rawObj.urls.web.project;
  }
  if (rawObj.photo) {
    formattedObj.image = rawObj.photo.thumb;
  }
  if (rawObj.category) {
    formattedObj.category = rawObj.category.name;
  }

它只是检查属性是否存在并映射到新对象。

1 个答案:

答案 0 :(得分:1)

有点迟到了,但是你(或其他人正在寻找减少圈复杂度的方法)可以采用这样的方法。它有点像战略模式。根据您是否能够或不能使用ES6,将决定您应该使用哪个setRawObjProp

function setFormObjName () {
  formattedObj.name = rawObj.title;
  console.log(arguments.callee.name,formattedObj);
}

function setFormObjURL () {
  formattedObj.url = rawObj.urls.web.project;
  console.log(arguments.callee.name,formattedObj);
}

function setFormObjImage () {
  formattedObj.image = rawObj.photo.thumb;
  console.log(arguments.callee.name,formattedObj);
}

function setFormObjCat () {
  formattedObj.category = rawObj.category.name;
  console.log(arguments.callee.name,formattedObj);
}

function setRawObjProp(obj) {
  var objectMap = new Map();

  objectMap
    .set('string1', setFormObjName)
    .set('string2', setFormObjURL)
    .set('string3', setFormObjImage)
    .set('string4', setFormObjCat);

  if (objectMap.has(obj)) {
    return objectMap.get(obj)();
  }
  else {
    console.log('error', obj); 
  }
}

/*
function setRawObjProp2(obj) {
  var objectMap = {
      'string1': setFormObjName,
      'string2': setFormObjURL,
      'string3': setFormObjImage,
      'string4': setFormObjCat,
  };

  if (objectMap.hasOwnProperty(obj)) {
    return objectMap.get(obj)();
  }
  else {
    console.log('error', obj); 
  }
}
*/

var rawObj = {
  title: 'string1',
  urls: {
    app: {
      project: 'some thing'
    },
    web: {
      project: 'string2'
    }
  },
  photo: {
    large: 'large',
    thumb: 'string3'
  },
  category: {
    name: 'string4',
    type: 'some type',
    id: 12345
  }
},

formattedObj = {
  title: '',
  urls: {
    web: {
      project: ''
    }
  },
  photo: {
    thumb: ''
  },
  category: {
    name: ''
  }
};

setRawObjProp('string1');
/* setRawObjProp2('string1') */