如何降低这段代码的圈复杂度

How can I reduce cyclomatic complexity from this piece of code?

本文关键字:复杂度 代码 何降低 段代码      更新时间:2023-09-26

我正在重构一些遗留代码。我从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;
  }

它实际上只是检查属性是否存在并映射到一个新对象。

派对有点晚了,但你(或其他正在寻找降低圈复杂度的方法的人)可以采用这样的方法。这有点像战略模式。根据您是否可以使用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') */