如何提高代码可读性

文章提倡在编程时避免使用复杂的布尔表达式,建议用有意义的变量替换以提高可读性。推荐使用卫语句来减少嵌套的if语句,提高代码可读性和维护性。强调重复代码的封装,但要注意单一职责原则。此外,文章还讨论了日志记录的重要性,提倡在关键步骤打日志,并提供了日志打印的脚本示例。最后,文章提醒在设计代码时应反映业务语义,使代码更直观易懂。
摘要由CSDN通过智能技术生成

一、避免使用冗长的布尔表达式

工程中有很多冗长的布尔表达式,建议使用有意义的变量,既避免歧义,又可以重复使用,且可以提高可读性

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())

六、如何设计代码

无论是数据表字段的设计还是类、方法的设计,都应该尽量反应业务的语义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值