重构此函数以将其认知复杂度从18降低到允许的15



在Sonarqube上,我认为这是一个关键问题,有人能帮我解决这个问题吗。以下是代码的详细信息,请让我知道如何使用switchcase重构此代码:

const getEmailTo = (subject) => {
switch (subject) {
case 'POWERUP_REWARDS':
return COMMON_EMAIL;
case 'GAME_INFORMER':
return COMMON_EMAIL;
case 'ONLINE_ORDER':
return 'test@gmail.com';
case 'STORE_EXPERIENCE':
return 'test@gmail.com';
case 'APP_REVIEW':
return COMMON_EMAIL;
case 'SOMETHING_ELSE':
return COMMON_EMAIL;
default:
return '';
}
};

通过收集返回相同值的常见情况,使代码更加干燥和简化。我不认为SonarQube验证可读性,但正确使用空白可以大大提高不熟悉代码的可读性。这是固执己见,但我喜欢案件回报之间的界限。

const getEmailTo = (subject) => {
switch (subject) {
case 'POWERUP_REWARDS':
case 'GAME_INFORMER':
case 'APP_REVIEW':
case 'SOMETHING_ELSE':
return COMMON_EMAIL;
case 'ONLINE_ORDER':
case 'STORE_EXPERIENCE':
return 'test@gmail.com';
default:
return '';
}
};

您可以使用对象将主题映射到电子邮件地址,并返回与主题对应的电子邮件地址。

const TEST_EMAIL = 'test@gmail.com'
const emails = {
POWERUP_REWARDS: COMMON_EMAIL,
GAME_INFORMER: COMMON_EMAIL,
APP_REVIEW: COMMON_EMAIL,
SOMETHING_ELSE: COMMON_EMAIL,
ONLINE_ORDER: TEST_EMAIL,
STORE_EXPERIENCE: TEST_EMAIL,
}
const getEmailTo = (subject) => emails[subject] || ''

当受试者不在映射中时,我不确定返回''是否可以。我建议抛出一个错误,让调用者知道主题无效。

const getEmailTo = (subject) => {
if (!(subject in emails)) {
throw new Error(`Invalid subject: ${subject}`)
}
return emails[subject]
}

您可以将相关的case语句放在一起,如下所示:

const getEmailTo = (subject) => {
switch (subject) {
case 'POWERUP_REWARDS':
case 'GAME_INFORMER':
case 'APP_REVIEW':
case 'SOMETHING_ELSE':
return COMMON_EMAIL;
case 'ONLINE_ORDER':
case 'STORE_EXPERIENCE':
return 'test@gmail.com';
default:
return '';
}
};

最新更新