【问题标题】:Refactor this function to reduce its Cognitive Complexity from 18 to the 15 allowed重构此函数以将其认知复杂度从 18 降低到允许的 15
【发布时间】:2021-07-01 22:18:26
【问题描述】:

在 Sonarqube 上,我将此视为关键问题,有人可以帮助我解决此问题。 这是代码详细信息,请告诉我如何使用 switch case 重构此代码:

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 '';
  }
};

【问题讨论】:

  • 你可以把每个返回相同的case放在一行,只返回一个“COMMON_MAIL”

标签: javascript reactjs react-native sonarqube


【解决方案1】:

通过收集返回相同值的常见案例,让您的代码更加干燥和简化。我不认为 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 '';
  }
};

【讨论】:

    【解决方案2】:

    您可以将相关的案例陈述并排放置,如下所示:

    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 '';
       }
    };
    

    【讨论】:

      【解决方案3】:

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

      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]
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 2018-06-08
        • 2021-03-14
        • 2020-11-02
        • 2021-10-31
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 2018-09-19
        相关资源
        最近更新 更多