多重条件判断的写法优化

373 阅读1分钟

截屏2022-10-06 18.49.10.png

背景

写多维度的条件判断时,很容易会写出又臭又长的代码。

举个简单的例子,假设我要写一个进入页面前根据用户身份跳转到不同页面的逻辑。

假设用户的 vip 身份有 normal、standard 和 proEdition 三种。

用户的项目组类型有 algorithm 和 UX 两种,用户的角色有 evangelist 和 follower 两种。

那么当我写判断时,很可能会写成 if 嵌套

if (user.vipType === 'standard') {
  if (user.groupType === 'algorithm') {
    if (user.role === 'evangelist') {
    } else {
    }
  } else if (user.groupType === 'UX') {
    if (user.role === 'evangelist') {
    } else {
    }
  }
} else if (user.vipType === 'proEdition') {
  if (user.groupType === 'algorithm') {
    if (user.role === 'evangelist') {
    } else {
    }
  } else if (user.groupType === 'UX') {
    if (user.role === 'evangelist') {
    } else {
    }
  }
} else {
  if (user.groupType === 'algorithm') {
    if (user.role === 'evangelist') {
    } else {
    }
  } else if (user.groupType === 'UX') {
    if (user.role === 'evangelist') {
    } else {
    }
  }
}

缺点

这样的代码分支太多,嵌套太多,而且堆积在一起,影响阅读感受。

维护时,在写处理函数时还总要耗费精力去注意外层 if 条件,以免写错行。

有可能出现在外层调用了作用于 vip 身份的 evangelist 角色的函数,但在写最深层处理时,由于疏忽,又再次调一遍。

优化

所以应该想办法去掉 if 嵌套,将3层条件合并为一层,将多个判断条件的组合合并为一个结果。

const DISPOSAL_METHOD_MAP = {
  standard_algorithm_evangelist: () => {},
  standard_UX_evangelist: () => {},
  standard_algorithm_follower: () => {},
  standard_UX_follower: () => {},
  proEdition_algorithm_evangelist: () => {},
  proEdition_UX_evangelist: () => {},
  proEdition_algorithm_follower: () => {},
  proEdition_UX_follower: () => {},
  normal_algorithm_evangelist: () => {},
  normal_UX_evangelist: () => {},
  normal_algorithm_follower: () => {},
  normal_UX_follower: () => {}
}
const disposal_method =
  DISPOSAL_METHOD_MAP[[user.vipType, user.groupType, user.role].join('_')]
  
try {
  disposal_method()
} catch (error) {}

好处

代码看上去更舒服。

对于每个具体分支分配单独的处理函数,这样不会写出函数重复调用的代码。