Code Review:代码审查

867 阅读3分钟

--- theme: Chinese-red

1.简介

Code Review是代码审查。锻炼自己CR能力,学习总结。

vscode代码审查插件 CodeGeex

2.CR实践点(代码优化点)

1.判断逻辑优化

1.对象判空

// 深层对象
if (
	store.getters &&
  store.getters.userInfo &&
  store.getters.userInfo.menus
) {}

// 优化:
// 可以使用 可选链进行优化
if (store?.getters?.userInfo?.menus) {}

2.空函数判断

props.onChange && props.onChange(e)

// 优化:
props?.onChange?.(e)

解读: 当前选中的代码是一个 JavaScript 模板表达式,它的作用是在父组件中调用名为 onChange 的 prop。在调用 onChange prop 之前,它使用可选链操作符?. 检查了两个条件: props 是否存在,以及 onChange 是否是 props 的一个方法。如果这两个条件都满足,代码将调用 onChange 方法,并将一个事件对象 e 作为参数传递给它。如果 props 或 onChange 不存在,代码将忽略这行代码,因为可选链操作符会安全地处理空值情况。

3.复杂判断逻辑抽离成单独函数

4.判断处理逻辑正确的梳理方式

采用 “异常逻辑前置,正常逻辑后置” 的方式进行梳理优化。

// 判断逻辑不要嵌套太深
function checkStatus() {
  if (isLogin()) {
    if (isVip()) {
      if (isDoubleCheck()) {
        done();
      } else {
        throw new Error('不要重复点击');
      }
    } else {
      throw new Error('不是会员');
    }
  } else {
    throw new Error('未登录');
  }
}


// 优化:
// 将判断逻辑的异常逻辑提前,将正常逻辑后置
function checkStatus() {
  if (!isLogin()) {
    throw new Error('未登录');
  }

  if (!isVip()) {
    throw new Error('不是会员');
  }

  if (!isDoubleCheck()) {
    throw new Error('不要重复点击');
  }

  done();
}

2.函数参数优化

形参太多,会造成:

  • 传实参是的时候,不仅需要知道传入参数的个数,还得知道传入顺序
  • 有些参数非必传,还要注意添加默认值,且编写的时候只能从形参的后面添加
const getUserInfo = (name, age, gender, address, phone, email) =>{...}

// 优化:

const getUserInfo = (options) => {
  const {name, age, gender, address, phone, email} = options
  ...
}
getUserInfo({name: '张三', age: 18, gender: '男', address: '北京', phone: '123456789', email: '123456789@qq.com'})

3.命名注释优化

1.避免魔法数字

如status的判断

if(status === 1 || status === 2) {...}
优化:
1.加注释 
2.定义常亮
const DRAFT = 1
const FINISH = 2
if(status === DRAFT || status === FINISH) {...}

2.注释别写表面意思

3.利用命名空间缩短属性前缀

// 过长命名前缀
class User {
  userName;
  userAge;
  userPwd;

  userLogin() { };
  userRegister() { };
}

优化:
// 利用命名空间缩短属性前缀
class User {
  name;
  age;
  pwd;

  login() {};
  register() {};
}

4.分支逻辑优化

if else,else if,switch case 等多分支判断

// switch case
const statusMap = (status: string) => {
    switch(status) {
        case 'success':
            return 'SuccessFully'
        case 'fail':
            return 'failed'
        case 'danger':
            return 'dangerous'
        case 'info':
            return 'information'
        case 'text':
            return 'texts'
        default:
            return status
    }
}

策略模式优化:

// 使用映射进行优化
const STATUS_MAP = {
    'success': 'Successfull',
    'fail': 'failed',
    'warn': 'warning',
    'danger': 'dangerous',
    'info': 'information',
    'text': 'texts'
}

return STATUS_MAP[status] ?? status

?? 是 TypeScript 中的 “空值合并操作符”

当前面的值为 null 或者 undefined 时,取后面的值

5.对象赋值优化

如查询参数params,需要新赋值

params.page=1
params.limit=20

优化:

params={
...params, // 重点 插入原属性,否则会被覆盖
page:1,
limit:20
}

6.隐式耦合优化

例如:token这种特殊名词,定义为常量TOKEN方便维护。

参考链接: juejin.cn/post/739479…

16 个 JavaScript 简写神技,提效 60%!

mp.weixin.qq.com/s/seAiN526g…

blog.csdn.net/qq_39249627… blog.csdn.net/qq_39249627…