优秀的后端应该有哪些开发习惯?( 二 )


if (CollectionUtils.isEmpty(list) || CollectionUtils.isNotEmpty(list)) {return null;}复制代码集合类型返回值不要 return null当你的业务方法返回值是集合类型时,请不要返回 null,正确的操作是返回一个空集合 。你看 mybatis 的列表查询,如果没查询到元素返回的就是一个空集合,而不是 null 。否则调用方得去做 NULL 判断,多数场景下对于对象也是如此 。
映射数据库的属性尽量不要用基本类型我们都知道 int/long 等基本数据类型作为成员变量默认值是 0 。现在流行使用 mybatisplus 、mybatis 等 ORM 框架,在进行插入或者更新的时候很容易会带着默认值插入更新到数据库 。我特么真想砍了之前的开发,重构的项目里面实体类里面全都是基本数据类型 。当场裂开......
封装判断条件【优秀的后端应该有哪些开发习惯?】public void method(LoanAppEntity loanAppEntity, long operatorId) {if (LoanAppEntity.LoanAppStatus.OVERDUE != loanAppEntity.getStatus()&& LoanAppEntity.LoanAppStatus.CURRENT != loanAppEntity.getStatus()&& LoanAppEntity.LoanAppStatus.GRACE_PERIOD != loanAppEntity.getStatus()) {//...return;}复制代码这段代码的可读性很差,这 if 里面谁知道干啥的?我们用面向对象的思想去给 loanApp 这个对象里面封装个方法不就行了么?
public void method(LoanAppEntity loan, long operatorId) {if (!loan.finished()) {//...return;}复制代码LoanApp 这个类中封装一个方法,简单来说就是这个逻辑判断细节不该出现在业务方法中 。
/** * 贷款单是否完成 */public boolean finished() {return LoanAppEntity.LoanAppStatus.OVERDUE != this.getStatus()&& LoanAppEntity.LoanAppStatus.CURRENT != this.getStatus()&& LoanAppEntity.LoanAppStatus.GRACE_PERIOD != this.getStatus();}复制代码控制方法复杂度推荐一款 IDEA 插件 CodeMetrics,它能显示出方法的复杂度,它是对方法中的表达式进行计算,布尔表达式,if/else 分支,循环等 。

优秀的后端应该有哪些开发习惯?

文章插图
 
点击可以查看哪些代码增加了方法的复杂度,可以适当进行参考,毕竟我们通常写的是业务代码,在保证正常工作的前提下最重要的是要让别人能够快速看懂 。当你的方法复杂度超过 10 就要考虑是否可以优化了 。
使用 @ConfigurationProperties 代替 @Value之前居然还看到有文章推荐使用 @Value 比 @ConfigurationProperties 好用的,吐了,别误人子弟 。列举一下 @ConfigurationProperties 的好处 。
  • 在项目 application.yml 配置文件中按住 ctrl + 鼠标左键点击配置属性可以快速导航到配置类 。写配置时也能自动补全、联想到注释 。需要额外引入一个依赖 org.springframework.boot:spring-boot-configuration-processor。

优秀的后端应该有哪些开发习惯?

文章插图
 
  • @ConfigurationProperties 支持 NACOS 配置自动刷新,使用 @Value 需要在 BEAN 上面使用 @RefreshScope 注解才能实现自动刷新
  • @ConfigurationProperties 可以结合 Validation 校验,@NotNull、@Length 等注解,如果配置校验没通过程序将启动不起来,及早的发现生产丢失配置等问题 。
  • @ConfigurationProperties 可以注入多个属性,@Value 只能一个一个写
  • @ConfigurationProperties 可以支持复杂类型,无论嵌套多少层,都可以正确映射成对象
相比之下我不明白为什么那么多人不愿意接受新的东西,裂开......你可以看下所有的 springboot-starter 里面用的都是 @ConfigurationProperties 来接配置属性 。
推荐使用 lombok当然这是一个有争议的问题,我的习惯是使用它省去 getter、setter、toString 等等 。
不要在 AService 调用 BMapper我们一定要遵循从 AService -> BService -> BMapper,如果每个 Service 都能直接调用其他的 Mapper,那特么还要其他 Service 干嘛?老项目还有从 controller 调用 mapper 的,把控制器当 service 来处理了 。。。
尽量少写工具类为什么说要少写工具类,因为你写的大部分工具类,在你无形中引入的 jar 包里面就有,String 的,Assert 断言的,IO 上传文件,拷贝流的,Bigdecimal 的等等 。自己写容易错还要加载多余的类 。
不要包裹 OpenFeign 接口返回值搞不懂为什么那么多人喜欢把接口的返回值用 Response 包装起来......加个 code、message、success 字段,然后每次调用方就变成这样
CouponCommonResult bindResult = couponApi.useCoupon(request.getCustomerId(), order.getLoanId(), coupon.getCode());if (Objects.isNull(bindResult) || !bindResult.getResult()) {throw new AppException(CouponErrorCode.ERR_REC_COUPON_USED_FAILED);}复制代码


推荐阅读