概述
在编写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处逻辑相似,功能相同,意味着我们可以将其封装为方法。