【问题标题】:How can I reduce cyclomatic complexity from this piece of code?如何从这段代码中降低圈复杂度?
【发布时间】:2016-01-11 22:43:45
【问题描述】:

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

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

【问题讨论】:

  • I get error from jshint about cyclomatic complexity - 不是你没有的代码
  • 这段代码没有很大的圈复杂度 - 取决于它的计算方式,我希望它是一个从 3 到最多 5 的值。可能它是一段更大的代码的一部分,或者您收到警告的门槛非常低。
  • 对不起,我错过了一些代码。
  • 但是我有没有办法减少那段代码?
  • 你能发布完整的功能吗?这段代码对我来说很好,我不会改变任何结构。

标签: javascript cyclomatic-complexity


【解决方案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') */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多