个人周记丨2019-11-17代码的复用

概述

在编写Java代码的过程中,我们往往会为了完成某一个具体的功能而像类中添加方法,当我们需要使用到该功能时,只需要实例化该类然后调用该方法。方法的封装了内部实现细节的同时提高了代码的复用率。比如我下面遇到的:

需求

上图是我所负责接口截图。在业务流模块中,被标注关键字“personId”的接口都有一个相同的特点,他们都通过personId字段进行分页查询,为了完成这些接口,也就意味着我需要在代码中要编写n多遍逻辑类似的代码。这些代码的业务层逻辑大概是这样的:

    public PageWrapper<OutpDiagnosisDTO> outpDiagnosisByPersonId(String personId, int pageNum, int pageSize) {
        OutpDiagnosis outpDiagnosis = new OutpDiagnosis();
        outpDiagnosis.setPersonId(personId);
        IPage<OutpDiagnosis> outpDiagnosisIPage = outpDiagnosisMapper.selectPage(new Page<>(pageNum, pageSize), new QueryWrapper<>(outpDiagnosis));
        return new PageWrapper<>(outpDiagnosisIPage.getTotal(),DtoTransactionUtil.changeOutpDiagnosisList(outpDiagnosisIPage.getRecords()));
    }

流程大概如下:
1.构建相应的实体
2.设置personId参数
3.调用mybatis-plus封装好的方法
4.获取到分页对象
5.最后自己做个业务需求的实体类转换。
在本项目中,类似的接口有40+个,作为懒惰的程序员,肯定不是会这么干的。为此我们需要封装一个方法来简化自己的代码。

分析

从上面的代码中我们可以看出,代码涉及到很重要的两个部分。
1.设置personId参数
2.调用mybatis-plus封装好的方法。

实现

针对第一个,我们可以设计一个接口,让这些实体类继承这个接口。实现步骤如下:
1.定义接口

/**
 * 统一查询接口
 */
public interface UnionQuery {

    String getPersonId();

    void setPersonId(String personId);

}

2.将使用到personId的类实现该接口
public class OutpDiagnosis extends Model implements UnionQuery{
//略
}
由于相应的实体类已经有对应的get、set方法。故不需要添加其他代码

针对第二个,我们需要将之前继承UnionQuery 的接口结合起来使用。
实现如下:
1.封装personId通用分页查询方法

    private <T extends UnionQuery> IPage<T> getPageByPersonId(T entityClass, BaseMapper<T> mapper, String personId, int current, int pageSize) {
        return mapper.selectPage(new Page(current, pageSize), new QueryWrapper<>(setIdentityFromPersonId(entityClass, personId)));
    }

注意setIdentityFromPersonId方法。该方法为相应的实体类设置相应参数,实现如下
2.通用设置personId方法

    public static <T extends UnionQuery> T setIdentityFromPersonId(T entity, String personId) {
		entity.setPersonId(personId);
        return entity;
    }

最后我们调用方法

    @Override
    public PageWrapper<OutpDiagnosisDTO> outpDiagnosisByPersonId(String personId, int pageNum, int pageSize) {
        IPage<OutpDiagnosis> page = getPageByPersonId(new OutpDiagnosis(), outpDiagnosisMapper, personId, pageNum, pageSize);
        return new PageWrapper<OutpDiagnosisDTO>(page.getTotal(), DtoTransactionUtil.changeOutpDiagnosisList(page.getRecords()));
    }

总结

1.与原来相比少了(2*n)行代码。不过在本项目中,实际上还需要对personId进行分割,然后在设置做多个属性上,因而省的代码更多,本文贴出的为简略版。
2.项目的接口设计中,参数如果传的是相应的对象和分页相应的参数,代码会更简单,但是接口在我接手之前已经定了下来,我只负责实现,如果修改接口,那么前端也需要修改。
3.最后说说“什么时候需要将代码封装成方法?”的看法。
如果你在写项目中,发现有3处逻辑相似,功能相同,意味着我们可以将其封装为方法。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值