您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

CodeReview主要Review什么?

时间:2022-05-31 15:05:10  来源:  作者:零一间

 

CodeReview主要Review什么?

什么是Code Review?

Code Review, 意即代码审查,是指一种有意识和系统的召集其他程序员来检查彼此的代码是否有错误的地方.

通常进行Code Review会有以下效果:

  • 提高代码质量和可维护性, 可读性等.
  • 查漏补缺, 发现一些潜在的问题点等.
  • 最佳实践, 能够更好更快的完成任务的方法.
  • 知识分享, Review他人代码时, 其实也是一个学习的过程, 自己也会反思&总结.

为什么要 Code Review?

要不要Code Review, 需要结合当前的环境和形势来决定. 如果项目组开发任务极其紧张, 此时再进行Code Review可能会收到不利的效果. 因势利导,求同存异是Code Review的核心所在.

Code Review尤其需要和项目组成员沟通和配合, 同时也在检验各成员的技术水平.

尤其需要注意的是, 人都有惰性, 每个人都有自己的一套行为准则和规范, 要想把他们的行为或规范统一起来, 很容易使他们产生抗拒心理.

在Code Review之前, 和项目成员沟通好, 有一个共同的愿景, 并辅助以相应的培训, 把部分人员的短板补齐. 会减轻项目成员的一些不适感, 也会使得项目运行更加顺畅.

同时, 也要注意, 不要事事求完美主义, 一步求成. 要知道"慢即是快".

Code Review的前提条件

Code Review本身属于"事后"工作, 可以起到查漏补缺的作用.

在推行Code Review时, 需要先提前准备以下几个工作, 以便团队能够更快更好的接受和实施.

  • 建立规范, 包含:编码规范, 如变量命名, 文件命名规范等设计原则, 如单一职责原则, 最少知识原则等分支管理策略
  • 完善的文档, 方便查阅. 文档内容最好能共建, 千万不可出现"一言堂"
  • 制定Code Review流程&目标, 以及实施周期.

例如, 当前我所带的项目组, 根据困难程度, Code Review实施分为3个阶段.

  • 第一阶段, 重点关注, 恰到好处的函数注释, "硬编码"问题, 常见变量命名规则等, 预期实施周期为1~3个月
  • 第二阶段, 重点关注, 代码耦合性, 单一职责、最少知识原则, 潜在隐患, 性能问题等, 预期实施周期为3~6个月
  • 第三阶段, 重点关注, 模块实现方案, 设计模式, 最佳实践, 代码重构等.

在实施过程中, 如果遇到比较大的阻力或困难, 推行Code Review所得到的收益较低时, 可以考虑适当"休息"一段时间.

Code Review如何实施?

从当前项目的实施过程的体会, 以及结合其他人的一些经验来看, 在Code Review时建议:

  • 单次查看代码不多于500行, 人的精力有限, 一次审查太多的代码, 收益可能不理想.
  • 单次审查建议不要超过30分钟

常见的Code Review项

git 提交规范

git commit提交规范, 如:

  • 不标注信息
  • 不及时commit
  • 提交时标注的信息不规范等

都是严重阻扰review的因素之一,除了常规的描述信息外,还可以按类型等备注:

  • feat: 新特性
  • fix: 修改问题
  • refactor: 代码重构
  • docs: 文档修改
  • chore: 其他修改
  • test: 测试用例修改
  • style: 代码格式修改等等

当然, 也要以利用一些工具, 来协助我们完成基本的约束和检查. 如: 优雅的使用Git

风格

1. 可读性

衡量可读性, 有很好的实践标准, 即Code Review时能否非常容易的理解代码逻辑, 如果不能, 那意味着代码的可读性要进行改进.

2. 命名

  • 命名对可读性非常重要, 我个人倾向于函数名/类名长一点都没关系, 但必须能清晰的表明函数/类的作用.
  • 英语用词尽量准确, 哪怕需要借助翻译工具, 也是值得的. 但有一点需要注意, 如果使用的单词很冷门, 都没人认识, 那就不要使用.

3. 函数体长度/类长度

  • 函数体太长, 不好阅读, 一般建议不要超过50行
  • 类太长, 如超过10000行, 那可能就要看下是否违反了"单一职责"原则.

4. 参数个数

不要太多, 一般不要超过5个, 超过5个, 建议使用对象

5. 注释

恰到好处的注释, 能够帮助我们理解函数/类的作用.

架构/设计

1. 单一职责原则

这是经常被违背的原则, 也是最难运用好的原则.

  • 一个类只做一类相关的事情
  • 一个函数/方法, 最好只做一件事情

2. 行为是否统一

1) 什么是行为统一? 例如:

  • 错误处理是否统一
  • 错误提示是否统一
  • 弹出框是否统一
  • ...

2) 同一逻辑/行为, 有没有执行同样的代码路径

低质量的代码一个特征是, 同一逻辑/行为, 在不同的地方或不同的方式触发时, 没有执行同样的代码路径(产生出不同的结果), 或者是各处copy一份实现, 导致非常难以维护.

3. 代码污染

代码有没有对其他模块强耦合

4. 重复代码

主要看有没有把公用组件, 可复用的代码、函数抽取出来

5. 开放-封闭原则

简单理解是, 看代码好不好扩展

6. 健壮性

  • 核心数据有没有强制校验?
  • 对业务有没有考虑完整, 逻辑是否健壮
  • 有没有潜在的bug?
  • 有没有内存泄露?有没有循环依赖?

7. 错误处理

有没有很好的Error Handling? 如网络出错, IO出错等.

8. 面向接口编程/面向对象接口编程

主要看有没有进行合适的抽象, 把一些行为抽象为接口

9. 效率/性能

  • 客户端程序对频繁的消息和较大数据等耗时操作是否处理得当
  • 关键算法的时间复杂度是多少? 有没有潜在的性能瓶颈?

10. 代码重构

  • 新的改动是打补丁, 让代码质量继续恶化, 还是对代码质量提升有帮助?

低质量代码的常见特征

  • 违反"单一职责"原则
  • 同一逻辑/行为, 通过不同的方式触发时, 不会执行同样的代码路径
  • 缺少注释
  • 函数/类命名乱, 词不达意, 或"挂羊头卖狗肉", 例如
export function setDefaultImg(res) {    let imgUrl = getImagePrefixUrl()    let previewImgSrc = require('@/asserts/images/icon.png')    if(res.imgId) {        previewImgSrc = `${imgUrl}${res.imgId}.${res.type}?t=${+new Date()}`    }    return previewImgSrc}复制代码

上例函数, 其实是想对传入的参数进行判断, 如果值无效, 取默认图片, 否则返回拼接地址好的img src相对地址. 从函数的实现来看, 有如下几个问题:

  • 函数名setDefaultImg并不合适, 无任何对数据的更新/修改, 最终目的是想拿到img的拼接地址(或者默认图片)
  • 形参res是一个对象, 实际使用到的属性只有两个基本类型, 遵循最少知识原则, 应修改形参.
  • let imgUrl, 其实是拼接url的前缀, 取名如 imgPrefixUrl会比较合适.
  • let 使用不当, 如 let imgUrl, 因涉及不到变量再赋值, 使用const是比较合适的
  • res.imgId, 即异常情况的处理, 少了对res.type的处理
  • 变量命名, 如previewImgSrc, 取此名也不太合适, 该src使用的目的并不确定, 建议使用有比较通用涵义的名字.

可考虑重构为:

export function getImgSrc(imgId, imgType) {    if(typeof imgId !== 'string' || typeof imgType !== 'string') {        return require('@/asserts/images/icon.png')    }    return `${getImagePrefixUrl()}${imgId}.${imgType}?t=${+new Date()}`}

作者:JamesZhang80078
链接:
https://juejin.cn/post/6844904009065578510
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



Tags:CodeReview   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一文浅谈 CodeReview 中的一些思考
作 者 | 古 训导语:CodeReview在日常的开发过程中越来越被重视,它在提高代码质量同时促进团队成员之间的知识共享和技能提升方面发挥了诸多作用,本文将主要围绕CodeReview展开,...【详细内容】
2023-12-18  Search: CodeReview  点击:(63)  评论:(0)  加入收藏
CodeReview主要Review什么?
CodeReview主要Review什么?什么是Code Review?Code Review, 意即代码审查,是指一种有意识和系统的召集其他程序员来检查彼此的代码是否有错误的地方.通常进行Code Review会...【详细内容】
2022-05-31  Search: CodeReview  点击:(230)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(3)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(3)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(2)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(5)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(9)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(16)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(14)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(9)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(15)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条