使用对象代替开关
有时,我们只需进行简单的重构就能实现很多功能!我将要展示的示例取自一个长期运行良好的真实项目。
但这并不意味着我们不应该仅仅因为已经取得了成效就主动改进!然而,我们也需要务实,避免陷入完美主义的陷阱。总而言之,我们应该找到一个平衡点,让必要的努力获得相应的回报。🕵️
我正在开发一个模块,它有一个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