Code Review是软件开发过程中非常重要的一个环节,
其主要的目的是在项目早期找到和修正错误、提升软件质量。
本文主要关注的是在做Code Review的时候,我们主要在关心代码的哪些方面来进行说明。
每个人的关注点不尽相同,于我而言,我的关注点一般在下面的几个部分上:
接下来,我们逐一来看一下。
基本编码规范
日志规范
logger.info("方法xxx执行");
... ...
logger.error("方法xxx出错~");
#合并前s
logger.info("name={}", name);
logger.info("type={}", type);
logger.info("timeCosted={} ms", timeCosted);
#合并后
logger.info("name={},type={},timeCosted={}", name,type,timeCosted);
经验性检查
private static final SimpleDateFormat DEFAULT_FOMAT
= new SimpleDateFormat("yyyy-MM-dd");
public static Date formatDefaultDate(String date) {
try {
return DEFAULT_FOMAT.parse(date);
} catch (ParseException e) {
return null;
}
}
SimpleDateFormat更多的信息请参考《SimpleDateFormat线程不安全示例及其解决方法》
另外,BigDecimal对象创建,如果没有使用好,也可能出现问题。比如下面的示例:
//0.299999999999999988897769753748434595763683319091796875
BigDecimal v1 = new BigDecimal(0.3d);
System.out.println(v1);
//0.3
BigDecimal v2 = new BigDecimal("0.3");
System.out.println(v2);
//0.3
BigDecimal v3 = BigDecimal.valueOf(0.3d);
System.out.println(v3);
超时问题
代码职责和调用关系
public class UserRpcServiceImpl implements UserRpcService {
public int update(xxx) {
//调用query,而query也是一个rpc接口
query(xxx);
}
public int query(xxx) {
}
}
不建议在rpc接口,再调用自身的rpc接口,如本示例的update和query。
线程池创建线程
数据库方面检查
<if test="xxx !=null ">
安全渗透方面检查
接口保护检查
模式应用
1、参数校验
2、检查是否有流量
3、执行业务逻辑
4、记录调用日志
5、流量扣减
6、... ...
如果每个服务都自己写一遍,不是很合适,也不不容易维护和扩展。在这种情况下,不同的服务调用主要是步骤#1和步骤#3有个性化的处理,可以抽象出来。
比如写一个简单的模版,步骤#1和步骤#3使用abstract方法,由子类具体实现。
抽象类
public abstract class AbstractServiceHandler<T extends ServiceRequest> {
/**
* 模版方法
*/
public void handle(T param) {
// 1、验证
this.doValidate(param);
// 2、校验是否有流量
// 3、执行业务逻辑
doBusiness(param);
// 4、记录调用日志
// 5、流量扣减
// 6、 ... ...
}
// 子类做校验
protected abstract void doValidate(T param);
// 子类做业务逻辑
protected abstract void doBusiness(T param);
}
服务请求参数
import java.io.Serializable;
public class ServiceRequest implements Serializable {
private static final long serialVersionUID = 4314529075012784996L;
// 属性省略
}
决策流服务处理类
public class DecisionFlowHandler extends AbstractServiceHandler<ServiceRequest> {
@Override
protected void doValidate(ServiceRequest param) {
// TODO Auto-generated method stub
}
@Override
protected void doBusiness(ServiceRequest param) {
// TODO Auto-generated method stub
}
}
决策工具服务处理类
public class DecisionToolHandler extends AbstractServiceHandler<ServiceRequest> {
@Override
protected void doValidate(ServiceRequest param) {
// TODO Auto-generated method stub
}
@Override
protected void doBusiness(ServiceRequest param) {
// TODO Auto-generated method stub
}
}
可以参考《设计模式几大原则》
在这个篇章部分,我们要对一些“失败”的场景,方案&应急有一定的考虑。
重试和幂等
方案和应急
更多缓存的一些知识,读者可以从之前的文章《啊哈!缓存》了解更多内容。
本文主要从关注代码本身,对Code Review做了简易的说明,想到啥就写了点啥。
Code Review对代码的关注点,远不止这些,本文也算是一个简单的抛砖引玉,有兴趣的读者可以一起留言探讨。