重构 if else 语句

Posted

技术标签:

【中文标题】重构 if else 语句【英文标题】:Refactoring if else statement 【发布时间】:2021-04-11 14:20:25 【问题描述】:

这是我的方法:

Object.entries(query).forEach(([key, value]) => 
  if (key === 'team_ids') 
    if (typeof value === 'string') 
      this.items.push(this.$store.getters.teamById(value));
     else 
      value.forEach((itemId) => 
        this.items.push(this.$store.getters.teamById(itemId));
      );
    
else if (key === 'close_ids') 
    if (typeof value === 'string') 
      this.items.push(this.$store.getters.closeFriendsById(value));
     else 
      value.forEach((friendId) => 
        this.items.push(this.$store.getters.closeFriendsById(friendId));
      );
    
   else 
    if (key === 'name') this.name = value;
    if (key === 'patr') this.patr= value;  
  
);

我正在尝试重构它,但现在我被难住了...... 它看起来不太好。 有什么建议吗?

【问题讨论】:

你想重构什么,为什么? 【参考方案1】:

您可以使用 switch 语句重构 if 语句

试试这个:

Object.entries(query).forEach(([key, value]) => 
  switch(key) 
    case 'name' : 
      this.name = value; break;
    case 'patr' : 
      this.patr = value; break;
    default:
      let getterMap = 
        'team_ids': 'teamById',
        'close_ids': 'closeFriendsById'
      
      if(Array.isArray(value)) 
        value.forEach((itemId) => 
          this.items.push(this.$store.getters[getterMap[key]](itemId));
        );
       else 
        this.items.push(this.$store.getters[getterMap[key]](value));
      
      break;
  
);

如果您愿意,可以在 getterMap 中添加更多键。

【讨论】:

【参考方案2】:

还不错,您有三元运算符,可以使代码更清晰,并且缩短了 if 语句。但是,如果你想重构它,你应该提供一些关于逻辑的信息,因为它在重构中很重要。

【讨论】:

以上是关于重构 if else 语句的主要内容,如果未能解决你的问题,请参考以下文章

重构嵌套的 if-else 以处理横切关注点,例如日志记录

学习重构-简化条件表达式

if--else 嵌套 怎么理解?

R语言中的if else语句

SQL语句中能否含有if....else...判断语句?

重构手法之简化条件表达式