【问题标题】:Javascript: Reduce cyclomatic complexityJavascript:降低圈复杂度
【发布时间】:2017-02-08 12:29:38
【问题描述】:

function(response) {
  if (response.bMap && SelType === 'q') {
    setDefaultQQ(response.bMap);
  } else if (response.bMap && SelType === 'a') {
    setDefaultAA(response.bMap);
  } else if (response.bMap && SelType === 'o') {
    setDefaultOO(response.bMap);
  } else if (response.mMap && SelType === 'm') {
    setDefaultMM(response.mMap);
  } else if (response.bMap && SelType === 'p') {
    setDefaultPP(response.bMap);
  } else if (response.eMap && SelType === 'e') {
    setDefaultEE(response.eMap);
  } else {
    setDefaultData();
    showModal();
  }
}

有没有办法将这个条件语句简化为更短的形式和更好的可读性

【问题讨论】:

  • 不完全相关,但这个问题似乎与您的个人资料有点冲突; )。

标签: javascript if-statement conditional cyclomatic-complexity


【解决方案1】:

可以使用一个对象来映射 SelType 特定的方法

var methods = {
  'a': setDefaultQQ,
  'o': setDefaultOO,
  'm': setDefaultMM,
  ....    
}

if(response.bMap && methods[SelType]){
   methods[SelType](response.bMap);
}else{
   setDefaultData();
   showModal();
}

【讨论】:

  • 你缺少我的其他键 eMap 和 Mmap
  • 所以你需要额外的逻辑。我的猜测是您可以使用一种方法并将响应对象作为参数传递并在那里做所有事情
  • 是的,我正在添加额外的逻辑,但这是我传递响应参数的方法,您的意思是添加另一种方法来分离逻辑吗?
【解决方案2】:

确实没有什么好方法,但是这个怎么样

eval("setDefault"+SelType.toUpperCase()+SelType.toUpperCase()+"(response."+SelType.toUpperCase()+"Map);");

但肯定不是最好的方法。

【讨论】:

  • 有趣的是,这可以通过这种方式完成,但请不要使用eval(),除非你真的必须(developer.mozilla.org/en/docs/Web/JavaScript/Reference/…)。您拥有代码,@charlietfl 的回答证明没有必要:)
  • 我想让它动态化。如果有一天您添加另一个SelType,您将不必回来更新SelType 键到函数映射等。
  • kawadhiya21 这是有道理的,但我仍然不允许在这里使用 eval ..
猜你喜欢
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
相关资源
最近更新 更多