背景
因为涉及业务开发,经常遇到一些id需要翻译成名称,例如:“机构id”翻译为“机构名称”,“用户id”翻译为“用户名称”,以及一些业务id需要翻译为业务名称。经常遇到大量的重复代码填写。
常用
List<VoucherWarehouse> list();
Paging<VoucherWarehouse> paging();
List<VoucherDelivery> list();
Paging<VoucherDelivery> paging();
经常需要把单据的相关操作人、所述机构都需要转换,但是这些内容都是通用的,但是不同的Dto或者方法中,需要特殊处理翻译,这样影响了开发效率和增加了代码的冗余。
第一版
为了解决上述问题,提高团队的开发效率,因此萌发了翻译工具的开发。当时只是简单的考虑通过公共接口,每个Dto实现接口,提供id和设置name方法。
定义接口
public interface OrgTransform{
/**提供id*/
public Long transOrgId();
/**设置name*/
public void transOrgName(String name);
}
Dto定义
public class VoucherWarehouse implements OrgTransform{
private Long orgId;
private String orgName;
public Long transOrgId(){
return this.orgId;
}
public void transOrgName(String name){
this.setOrgName(name);
}
}
定义翻译者
public class OrgTranlator{
public void tranlate(List<OrgTransform> list){
if(CollectionUtils.isEmpty(list)){
return ;
}
List<Long> idList = new ArrayList();
for(OrgTransform form : list){
if(form.transOrgId()!=null){
idList.add(form.transOrgId());
}
}
Map<Long,String> orgMap =search(idList);
for(OrgTransform form : list){
String orgName = orgMap.get(form.transOrgId());
if(StringUtils.isNotEmpty(orgName )){
form.transOrgName(orgName);
}
}
}
private Map<Long,String> orgSearch(List<Long> idList){
//查询数据库获取机构信息
return new HashMap();
}
}
方法调用
@Autwired
private OrgTranlator orgTranlator ;
List<VoucherWarehouse> list(){
//查询获取单据
List<VoucherWarehouse> voucherList = serarchList();
//手动调用翻译工具。
orgTranlator.tranlate(voucherList);
}
缺点
- 不同的Dto需要实现相同的OrgTransform,代码重复性也有点高。
- 如果VoucherWarehouse如果再增加去向单位id,就需要重新定义一个Transform接口,专门处理同一个Dto存在多个相同业务的字段。
- 对已有代码有一定的侵入性,使用起来不太简单。
第二版
使用一段时间后,第一版的代码重复率也比较高,同时使用比较繁琐,经过参考其他的代码,针对第一版的3个缺点,确定了AOP+自定义注解+公共代码的抽取(jdk反射),生成了第二版,见:自动翻译工具-第二版