代码CR模板

代码 CR 模板

基础篇

编码风格遵循阿里巴巴 Java 开发手册

大型复杂流程程序必须提供流程图、时序图

被 cr 同学在 cr 开始需简单叙述项目大小及其背景，复杂流程需要 cr 实现逻辑是否 match 技术方案，减少实现跟技术方案的 gap

业务逻辑划分是否合理，是否耦合

业务逻辑涉及领域的逻辑，明显或耦合的业务逻辑建议拆分

代码编码逻辑是否清晰

被 cr 同学需要讲清楚主干逻辑

合理有效的注释

逻辑复杂的代码或 cr 有疑问的逻辑，要求补充合理有效的注释

是否存在冗余代码

多余或者没有引用的代码建议删除

是否存在潜在 NPE

NPE 是日常工作必出现的 bug

上下文字段使用不判空，getXX () 操作，基本类型拆箱，需要防御式判断或 Optional

日志打印规范

强制使用占位符进行日志打印，因为字符串拼接会使用 StringBuilder 的 append () 方式，有一定的性能损耗

logger.info("are u ok : oid 1", oid);
logger.info("are u ok : oid 1", oid);

有没有 maven 依赖冲突

很多时候诡异的运行时 bug，往往由于依赖冲突导致，cr 建议确认是否有 pom 变更

资源释放

无论是网络 io 还是文件 io、资源释放的逻辑需要被 cr 到

统一错误码

禁止统一返回 - 1、500 等错误码，最好定义枚举，方便追溯问题

异常的处理

出现异常的地方需要确认是否需要进行一下操作：直接返回、抛出异常、重试处理、恢复处理、熔断处理、降级处理、关闭业务

初级篇

数据库索引设计是否合理、是否生效

被 cr 同学要讲清楚设计索引的原因以及效果

代码是否可以使用设计模式或者设计模式是否过度设计

if/else 过多或者场景分发类逻辑，建议采用策略模式

不建议小的需求、进行复杂的继承抽象逻辑，良好的设计是模型的合理

不建议引入复杂的框架解决简单问题，有些同学热衷于一个框架搞定所有架构 (比如 ddd cola)， 毕竟代码的历史性、复杂度框架是评估不了的、好的业务框架脚手架更倾向于用这种思想解决问题，而非照搬

中间件使用是否最佳实践

比如 mq 消费是否正确 ack、还是需要重试、还是丢弃

比如 redis 是否存在大 key 设计、需要进行合理设计

比如 es 查询是否设置合理超时时间

线程池使用、参数是否正确、是否业务隔离

是否使用公司框架或 jdk 自带带参线程池构建方法

线程数、队列大小是否配置合理

多业务或调用方、是否配置隔离线程池

如果使用锁，锁范围、粒度是否合适

分布式锁的锁区间需要 check 是否影响其他

事务处理：是否需要事务，事务是否生效

持久化操作是否没有加事务

类内部调用是否导致事务没生效

进阶篇

性能优化

需要缓存的地方是否添加缓存

比如依赖的外部接口性能差、添加合适的缓存解决查询问题

乐观锁代替悲观锁

多接口聚合采用多线程加速

一致性

幂等性

基于状态的幂等

基于状态，也就是是说调用该接口，会导致状态变化，如果状态已经发生变化，那么就直接返回
之前的结果即可

基于某个 key 的幂等

通常使用单独的字段来绑定或者日志表来记录，如果存在，直接返回

重试

接口调用失败重试

存在写操作的的外部接口建议不重试、让外部重新发起请求如果需要发起重试、

check 提供的接口支持幂等返回