博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
code review
阅读量:6905 次
发布时间:2019-06-27

本文共 2697 字,大约阅读时间需要 8 分钟。

hot3.png

我发现平常code review问题主要体现在两个方面:一个是编码习惯问题,另一个是编码质量的问题。编码习惯主要有日志编写、代码注释以及编码风格的问题,而编码质量则与很多方面相关,比如轮子的使用、数据交互、逻辑精简程度等等。

编码习惯问题:

互不相干的change不要放在一个commit中,避免review者不明其意,也可方便后续可能发生的cherry pick。
将风格问题消灭在本地,像换行,空格,javadoc等问题,都可以借助工具来避免,例如IDEA的Alibaba Java Coding Guidelines插件。
重构代码的change不要加入逻辑的变更。
涉及到结构或数据库设计相关的改动,先把设计基础部分编写好,提交一版review,避免做的差不多后发现设计存在缺陷再修改代价就很高。
方法体太长,可考虑抽取成小方法。
注释与实现不符,这对后期维护人员是个伤害。
日志缺失或缺少重要上下文信息输出,一旦发生问题,线上排查困难。
非复杂逻辑,推荐使用stream api,而不是for循环。
尽早结束分支流程,保证方法中主干逻辑清晰。
api路径定义完整mapping在方法上,避免拆开一部分到类上,以方便搜索(controller类一部分,方法一部分)
编码质量问题:
重复造轮子的问题,常见工具类使用不到位,经常自己写方法实现。比如Apache commons,Google Guava等;另一个是共用的业务代码,如果不熟悉容易出现多个版本的实现,后期维护成本上升。
公共数据使用不充分,存在重复调用的情况,而不是一次调用,多次使用,尤其是与其它业务交互的调用损伤更大。(像保险业务那边,经常需要通过接口调用获取用户信息,如果每个人都只管自己的实现,不管其它既有代码内部逻辑,需要信息就粗暴的调用一次,一个前端接口,可能会出现N次用户中心接口请求)
参数过多时,可转化为对象传参。
代码命名,未能见名知意,这其实是一个老生常谈的问题,想个优雅的名字是多么的重要。
多余代码,并无实际意义。比如有些情况下,先查询,再更新,其实完全可以采用以条件更新的方法。
校验逻辑要提前,防止做无用功。
前后逻辑重复,比如Controller中作必输校验,Service无须再次校验。
虽标记了FIXME/TODO,却实际许久未修复。
异常信息处理欠妥当,直接将错误堆栈信息返给前端用户,体验太差。此类信息需要包装,尽量对用户友好。
包结构、文件目录结构、以及功能方法所在的类等安排不合理,存放错乱,让后续开发人员难以理解。
数据库操作先select再update时有时间空档,容易被其它线程更改数据。应直接采用update的方式直接拿数据。
涉及分布式系统间交互数据时,需要有补偿机制来保证数据的最终一致性。也就是说非正常情况下的保障措施缺失。(像活动和保险那边,其实都有这样的处理)
方法定义中的形参取名一定要让使用者知道这个参数要传什么内容,不要用笼统的名字。http://reviewboard.56qq.com/r/27139/#comment14294
使用mybatis-plus更新数据时,应该构造新的对象去更新,而不是在老的对象上修改属性值再传入更新(即只更新需要变化的字段)
domain定义字段时,不要使用基本类型,因为在查询数据时构造查询对象,基本类型会有默认值,导致原本没有设置该字段查询条件,但实际它是有值的,使得查询结果非预期。
开发自用的调试接口安全性问题,例如手动触发定时任务之类的接口,不要裸奔,至少需要时signApi。
实现是否具有扩展性,尽量不要出现定制化的硬代码。
api变更要考虑兼容问题,例如返回数据结构发生变化,那么就要考虑是否要保留老接口不变,新结构在新接口上体现。
测试代码问题:
测试数据不具有代表性,导致主线功能测试覆盖不到,真正提交测试时很容易暴露出问题。
单元测试代码没有断言,只是单纯地走一遍代码,实际执行成功没有都不知道。
单元测试还在调用真实服务,尤其是调用第三方服务。
怎么做好code review?
在有限的工作经验和各个团队切换的经历来看,我觉得code review能做好的几个关键因素:

善用工具,把风格问题消灭在本地,及时解决IDE就能提示你的问题。

checkList很有用,避免review时一头雾水,但需要在实践中逐渐累积总结。
提交适量的代码review,代码太多,容易让review者丧失耐心,也容易遗漏问题。
团队的支持。
我code review的过程:
粗读:先看commit message,大概知道在做什么,然后扫描一遍代码量,改了哪些文件,是不是大量新增?
抽取重点:粗读之后大概明白编码人的目的,那么就抽取重点来看,看下是否在设计上合理。
细读:重点节点浏览一遍没有太大问题,那么可以顺着设计思路看一遍代码,或者从每个文件开始浏览,根据脑袋中缓存的checkList检查代码问题。
如果是自己熟悉的业务,会再确认业务逻辑上是否存在明显不对的地方,有没有更好的办法;对老功能是否有侵害。
需要避免的做法:
作为reviewer,不要刻意寻找代码的bug:有些代码的逻辑是比较复杂的,如果是很容易发现的错误,在编码的过程大多数都会发现,那么剩下的不容易发现的错误可以交给测试人员去发现;如果参与者刻意去找Bug将会是顾此失彼,忽略更重要的东西,花费更多的时间,当然如果有些Bug你一眼就看到了就再好不过了。
reviewer最好不要自己都没想明白就提意见:如果自己没有想明白的事情就去提意见,那么评审者反问的时候会浪费大家的时间;reviewer可以先将自己的想法大致记下来,在有空闲的时间想清楚了在提给评审者也是节省时间的办法。
不要认为只有@了自己的才可以review,我觉得只要有空,都可以取review团队所有成员的代码。
code review后带来的实际好处:
自身能力的提升,相比于自己闷声写代码,把代码拿出去供大家品读,吸收他人的技巧;编程的时候会跳出来思考,这样做是不是最好。
团队效率提升,review让团队成员都互相熟悉各自负责的部分,定位问题,开发新功能时更迅速。
让单元测试成为了习惯,没人监督的话潜意识会偷懒,会越来越随意,有了review,会自觉地让代码加上单元测试表示让review人更放心。
偶尔休假,不用担心总有人,因为团队其它成员也可以协助你的部分。

转载于:https://my.oschina.net/lifei123/blog/2252007

你可能感兴趣的文章
SQL Server中数据库文件的存放方式
查看>>
西部光伏电站不景气 屋顶光伏春天将至
查看>>
计算机取证如何追踪网络罪犯?
查看>>
Ignite 内存数据组织框架进入 Apache 基金会孵化
查看>>
《思科绿色数据中心建设与管理》——1.1 绿色定义
查看>>
《Linux设备驱动开发详解 A》一一
查看>>
《Windows 8 权威指南》——1.2 Windows 8平板模式下IE浏览器网页
查看>>
Ubuntu Touch 已经支持 USB Tethering 上网功能
查看>>
《人工智能:计算Agent基础》——2.7 参考文献及进一步阅读
查看>>
《iOS创意程序设计家》——第6.4节事件检测
查看>>
《数据科学:R语言实战》一1.4 问题
查看>>
《HTML5实战》——1.5 小结
查看>>
Linux管理常见错误的解决方法
查看>>
MySQL架构优化实战系列3:定时计划任务与表分区
查看>>
kafka - advertised.listeners and listeners
查看>>
Hadoop YARN学习监控JVM和实时监控Ganglia、Ambari(5)
查看>>
ECharts:免费,开源,超炫的可视化作品
查看>>
跨界 +赋能——互联网的下一个关键词
查看>>
活动干货|基于Docker的DevOps实现
查看>>
C语言OJ项目参考(1030)求奖金总数
查看>>