代码优化系列:1.多个if语句并行复杂度过高

项目组的代码经历过外包,后又从小组成立的后端人员,再然后有了前端开发人员,一直到我们这一批,有点一言难尽。一直想重构一下,奈何一直没时间。

问题:代码静态扫描,发现有如下代码需要优化:

public loginSubmit() {
    // 一些校验代码
    ...
    ...
    this.userService.postLogin(loginReqData)
      .subscribe((resData: UserServiceNs.AuthAnyResModel) => {
        this.loading = false;
        // **************************需要优化片段**************************

        if (resData.code != 0) {
          if (resData.code == 7) {
            resData.value = 'User or password error';
          }
          if (resData.code == 11) {
            resData.value = 'The user is locked';
          }
          if (resData.code == 38) {
            resData.value = 'User expired';
          }
          if (resData.code == 41) {
            resData.value = 'This account has been deleted, does not exist';
          }
          if (resData.code == 42) {
            resData.value = 'The account has been disabled';
          }
          if (resData.code == 45) {
            resData.value = 'Tenant or superior tenant administrator account has expired';
          }
          // ***********************以上片段需要优化**************************

          this.createNotification('error', resData.value);
          return;
        }

        ...

      }, (error: UserServiceNs.HttpError) => {
        // 错误处理
        ...
      });
  }

此类代码在后续开发中难以维护,代码冗长,复杂度高,影响性能。

解决办法: 

1. 可以通过switch:

  switch(val){
    case 7:
      ...
      break
    case 11:
      ...
      break
    ...
    ...
    case 42:
      ...
      break
    case 45:
      ...
      break
  }

2. 通过对象枚举key-value方式

虽然switch语句在逻辑上确实比else if语句简单,但是代码量也不算少,如果后续扩展,代码会不断累加。

代码如下:

public loginSubmit() {
    // 一些校验代码
    ...
    ...
    this.userService.postLogin(loginReqData)
      .subscribe((resData: UserServiceNs.AuthAnyResModel) => {
        this.loading = false;
          // **************************优化后代码**************************
          if (resData.code != 0) {
                // 创建对象,以键值对的方式存储
                const codeArr = {
                    7: 'User or password error',
                    11: 'The user is locked',
                    38: 'User expired',
                    41: 'This account has been deleted, does not exist',
                    42: 'The account has been disabled',
                    45: 'Tenant or superior tenant administrator account has expired'
                 };
                // 通过统一处理函数返回值赋值
                resData.value = this.handleReturnType(codeArr, resData.code);
       
          // ***********************以上片段优化后**************************

          this.createNotification('error', resData.value);
          return;
        }

        ...

      }, (error: UserServiceNs.HttpError) => {
        // 错误处理
        ...
      });
  }

  // 处理返回不同类型值中英文切换显示
  handleReturnType(codeArr, value) {
    return codeArr[value];
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时间复杂度: 1. 打开文件并读取数据,时间复杂度为O(n)。 2. csv.reader() 函数的时间复杂度为O(1)。 3. 列表推导式的时间复杂度为O(n)。 4. 创建一个空的有向图,时间复杂度为O(1)。 5. 循环遍历数据,时间复杂度为O(n)。 6. 判断当前行是否为第一行,时间复杂度为O(1)。 7. 添加根节点,时间复杂度为O(1)。 8. 更新根节点的属性,时间复杂度为O(1)。 9. 如果不是第一行,则继续执行下面的代码,时间复杂度为O(1)。 10. 添加节点 a,时间复杂度为O(1)。 11. 添加节点 b,时间复杂度为O(1)。 12. 添加一条从 a 到 b 的有向边,时间复杂度为O(1)。 13. 更新节点 a 和节点 b 的属性,时间复杂度为O(1)。 14. 结束 if 语句,时间复杂度为O(1)。 15. 结束 for 循环,时间复杂度为O(1)。 因此,总的时间复杂度为 O(n)。 空间复杂度: 1. 打开文件并读取数据,空间复杂度为O(n)。 2. csv.reader() 函数的空间复杂度为O(1)。 3. 列表推导式的空间复杂度为O(n)。 4. 创建一个空的有向图,空间复杂度为O(1)。 5. 循环遍历数据,空间复杂度为O(1)。 6. 判断当前行是否为第一行,空间复杂度为O(1)。 7. 添加根节点,空间复杂度为O(1)。 8. 更新根节点的属性,空间复杂度为O(1)。 9. 如果不是第一行,则继续执行下面的代码,空间复杂度为O(1)。 10. 添加节点 a,空间复杂度为O(1)。 11. 添加节点 b,空间复杂度为O(1)。 12. 添加一条从 a 到 b 的有向边,空间复杂度为O(1)。 13. 更新节点 a 和节点 b 的属性,空间复杂度为O(1)。 14. 结束 if 语句,空间复杂度为O(1)。 15. 结束 for 循环,空间复杂度为O(1)。 因此,总的空间复杂度为 O(n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值