一、避免使用冗长的布尔表达式
工程中有很多冗长的布尔表达式,建议使用有意义的变量,既避免歧义,又可以重复使用,且可以提高可读性
logger.info("实际下单参数为 reqDto:{}",JSON.toJSONString(reqDto));
//构建订单请求vo
CreateOrderProcessVo vo = this.buildCreateOrderProcessVo(reqDto, userId);
// 是否云店订单
boolean isCstoreOrder = Objects.nonNull(vo.getCstoreId());
// 校验订单来源
validService.validateOrderSource(vo.getReqDto().getOrderSource());
// 校验下单入口
validService.validateSubmitMethod(vo.getReqDto().getSubmitEntranceMethod(),
vo.getReqDto().getOrderType());
二、推荐使用卫语句
大家平常写代码的时候,都是习惯于考虑正常情况之下代码怎么写,如果逻辑条件很多的情况下,就会嵌套很多层if语句,把代码搞的很臃肿,很难读,也不好维护。
在逻辑代码比较多的时候,可以使用卫语句,就是反过来思考,把不符合的条件提前找出来过滤掉,把核心逻辑的代码放在代码的主线中,这样可以显著提高整段代码 的可读性
@Override
public RestResponse<List<BizCstoreRecommandApplicationUiRespDto>> queryListByProjectIdWithDefault(@RequestParam(name ="projectId",required = false ) Long projectId) {
BizCstoreRecommandUiEo bizCstoreRecommandUiEo = bizCstoreRecommandUiService.findByProjectIdAndRecommandTypeWithDefault(projectId, RecommandTypeEnum.RECOMMAND_APPLICATION);
if(Objects.isNull(bizCstoreRecommandUiEo)){
return new RestResponse<>(null);
}
Long recommandId = bizCstoreRecommandUiEo.getId();
List<BizCstoreRecommandApplicationUiEo> applicationUiEoList = bizCstoreRecommandApplicationUiDas.findByRecommandId(recommandId);
if(CollectionUtils.isEmpty(applicationUiEoList)){
return new RestResponse<>(null);
}
log.info("find BizCstoreRecommandApplicationUiRespDto by recommandId:{}", recommandId);
List<BizCstoreRecommandApplicationUiRespDto> applicationUiRespDtoList = new ArrayList<>();
CubeBeanUtils.copyCollection( applicationUiRespDtoList,applicationUiEoList, BizCstoreRecommandApplicationUiRespDto.class);
return new RestResponse<>(applicationUiRespDtoList);
}
三、封装重复的代码
很多重复逻辑的代码,注意应该封装在方法中,可以可以提高可维护性,也有助于自己整理代码逻辑,因为很多重复代码往往比较重要的部分。但是也不应该无脑封装,一定要注意单一职责,单个方法做单一的事情,提炼的越小越好,这样才能做到维护一个地方,不至于影响其他的方法
除了完全一样的代码,逻辑一样的代码也是重复代码,消除这些重复的代码的常用的几招:工厂设计模式、模板方法设计模式,反射等。熟练使用泛型,没有清不掉的重复代码
四、代码如何编写
代码编写之前,应该先梳理逻辑,做到主次区分,前后有序,以创建订单接口为例:
可以先定义好创建订单需要完成的几个步骤
1、参数校验
2、构建填充订单请求(可选)
3、商品校验
4、处理活动信息
5、处理运费
6、校验库存
7、扣减库存
8、创建订单
代码经过这样整理,往往可以做到逻辑清晰,没有无效代码
五、如何打日志
我们每个工程中,都会有controller层、service层、dao层,是不是每个层都需要打上日志呢,日志应该打多点还是打少点。
打日志的宗旨是,可以通过看日志,就能了解系统当时在代码中是如何运行的,整个运行的过程和步骤都可以了解的很清楚,还是以下单流程为例:
首选入参的时候建议首先打上日志,重要的分支也肯定需要打上日志
备注:大家打日志对象的时候都是使用JSON.toJsonString()方法,这个需要序列化,有一定的性能损耗,也很容易忘记,当然把对象打成json字符串也不是完全没有好处,如果是入参,可以直接拷贝过来格式化。大家在定义实体类的时候可以加上@data或者@toString()注解,这样不用使用序列化Json也会直接打印出对象内容。
推荐一个日志脚本方法,可以节省不少时间
1、loge 异常日志打印
log.error($content$,$params$);
content 参数:
groovyScript("def params = _2.collect {'【'+it+' = {}】'}.join(', '); return '\"' + _1 + '() called with parameters => ' + (params.empty ? '' : params) + ', exception = 【{}】' + '\"'" , methodName(), methodParameters())
params参数:
groovyScript("def params = _1.collect {it}.join(', '); return (params.empty ? '' : params) + ',e' ", methodParameters())
2、logi 参数日志打印
log.info($content$,$params$);
content参数:
groovyScript("def params = _2.collect {'【'+it+' = {}】'}.join(', '); return '\"' + _1 + '() called with parameters => ' + (params.empty ? '' : params) + '\"'", methodName(), methodParameters())
params参数:
groovyScript("def params = _1.collect {it}.join(', '); return (params.empty ? '' : params) ", methodParameters())
3、logr 结果日志打印
log.info("$METHOD_NAME$() returned: " + $result$);
METHOD_NAME参数:
methodName()
result参数:
variableOfType(methodReturnType())
六、如何设计代码
无论是数据表字段的设计还是类、方法的设计,都应该尽量反应业务的语义