项目组的代码经历过外包,后又从小组成立的后端人员,再然后有了前端开发人员,一直到我们这一批,有点一言难尽。一直想重构一下,奈何一直没时间。
问题:代码静态扫描,发现有如下代码需要优化:
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];
}