使用对象代替开关
有时,我们只需进行简单的重构就能实现很多功能!我将要展示的示例取自一个长期运行良好的真实项目。
但这并不意味着我们不应该仅仅因为已经取得了成效就主动改进!然而,我们也需要务实,避免陷入完美主义的陷阱。总而言之,我们应该找到一个平衡点,让必要的努力获得相应的回报。🕵️
我正在开发一个模块,它有一个getMonth函数可以根据给定的月份返回翻译键:
const getMonth = (month: string) => {
  let translationKey = ''
  switch (month) {
    case 'January':
      translationKey = 'JANUARY_TRANSLATION_KEY'
      break
    case 'February':
      translationKey = 'FEBRUARY_TRANSLATION_KEY'
      break
    case 'March':
      translationKey = 'MARCH_TRANSLATION_KEY'
      break
    case 'April':
      translationKey = 'APRIL_TRANSLATION_KEY'
      break
    case 'May':
      translationKey = 'MAY_TRANSLATION_KEY'
      break
    case 'June':
      translationKey = 'JUNE_TRANSLATION_KEY'
      break
    case 'July':
      translationKey = 'JULY_TRANSLATION_KEY'
      break
    case 'August':
      translationKey = 'AUGUST_TRANSLATION_KEY'
      break
    case 'September':
      translationKey = 'SEPTEMBER_TRANSLATION_KEY'
      break
    case 'October':
      translationKey = 'OCTOBER_TRANSLATION_KEY'
      break
    case 'November':
      translationKey = 'NOVEMBER_TRANSLATION_KEY'
      break
    case 'December':
      translationKey = 'DECEMBER_TRANSLATION_KEY'
  }
  return translationKey
}
在这种情况下,我很清楚使用对象而不是 switch 语句可以实现什么目的:
- 可读性
- 认知复杂性(您可以在此处阅读更多相关内容)
为什么是对象?好吧,如果你仔细看看这个getMonth函数在做什么,你会发现它只是把键映射到值,这正是对象的作用!✨
因此,switch 语句完全没必要。实际上,它只会降低代码的可读性,并增加其认知复杂性。因此,重构后:
type Month =
  | 'January'
  | 'February'
  | 'March'
  | 'April'
  | 'May'
  | 'June'
  | 'July'
  | 'August'
  | 'September'
  | 'October'
  | 'November'
  | 'December'
type Mapping = Record<Month, string>
const MONTH_TO_TRANSLATION_KEY: Mapping = {
  January: 'JANUARY_TRANSLATION_KEY',
  February: 'FEBRUARY_TRANSLATION_KEY',
  March: 'MARCH_TRANSLATION_KEY',
  April: 'APRIL_TRANSLATION_KEY',
  May: 'MAY_TRANSLATION_KEY',
  June: 'JUNE_TRANSLATION_KEY',
  July: 'JULY_TRANSLATION_KEY',
  August: 'AUGUST_TRANSLATION_KEY',
  September: 'SEPTEMBER_TRANSLATION_KEY',
  October: 'OCTOBER_TRANSLATION_KEY',
  November: 'NOVEMBER_TRANSLATION_KEY',
  December: 'DECEMBER_TRANSLATION_KEY',
}
const getMonth = (month: Month) => MONTH_TO_TRANSLATION_KEY[month]
我创建了一个包含两个版本的存储库,并使用了Cognitive-complexity-ts包来获取数字进行比较(分数越高表示代码越复杂):
正如预期的那样,对象的使用使得该代码不那么复杂,也更具可读性,因为它比 switch 语句更简洁。
tl;dr:每当我们注意到 switch 只是将键映射到值时,我们就应该使用对象。
鏂囩珷鏉ユ簮锛�https://dev.to/ubmit/use-an-object-instead-of-a-switch-1e55 后端开发教程 - Java、Spring Boot 实战 - msg200.com
            后端开发教程 - Java、Spring Boot 实战 - msg200.com
          