You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多版本Hafas模型转换场景下如何避免代码重复?

多版本Hafas模型转换器优化方案

方案1:泛型+抽象类抽离公共逻辑(改造成本最低,推荐)

将完全一致的转换逻辑抽到抽象泛型父类中,把不同版本的POJO类作为泛型参数,仅把少数有差异的逻辑定义为抽象方法,由各版本的转换器子类实现即可,95%以上的公共代码不需要重复编写。

代码示例:

// 通用抽象转换器,泛型T为对应版本Leg类,L为对应版本LegList类
public abstract class AbstractHafasConverter<T, L> {
    // 完全公共的逻辑直接在父类实现,所有版本复用
    public void convertHafasLegsInsideCustomTrip(TripStructure myTrip, L hafasLegs) {
        for (T hafasLeg : getLegList(hafasLegs)) {
            // We have to convert each Hafas Leg to Trias TripLegStructure
            TripLegStructure myTripLeg= convertToTriasTripLeg(hafasLeg);
            if (myTripLeg!= null)
                myTrip.getTripLeg().add(myTripLeg);
            else
                throw new NullPointerException("ERROR: HAFAS TripResult conversion ended up with NULL object");
        }
    }

    // 差异部分抽为抽象方法,由各版本子类实现
    protected abstract List<T> getLegList(L legList);
    protected abstract TripLegStructure convertToTriasTripLeg(T hafasLeg);
}

1.23版本转换器仅需实现差异逻辑:

import com.hafas.v123.Leg;
import com.hafas.v123.LegList;
// 1.23版本转换器继承抽象父类,传入对应版本的POJO类作为泛型参数
public class HafasConverterV123 extends AbstractHafasConverter<Leg, LegList> {
    @Override
    protected List<Leg> getLegList(LegList legList) {
        return legList.getLeg();
    }

    @Override
    protected TripLegStructure convertToTriasTripLeg(Leg hafasLeg) {
        // 仅实现1.23版本Leg转TripLeg的逻辑即可
    }
}

1.29版本转换器同理,仅需替换导入的POJO包路径,实现少量差异方法:

import com.hafas.v129.Leg;
import com.hafas.v129.LegList;
public class HafasConverterV129 extends AbstractHafasConverter<Leg, LegList> {
    @Override
    protected List<Leg> getLegList(LegList legList) {
        return legList.getLeg();
    }

    @Override
    protected TripLegStructure convertToTriasTripLeg(Leg hafasLeg) {
        // 仅实现1.29版本Leg转TripLeg的逻辑即可
    }
}

方案2:适配器模式统一POJO访问接口(适合后续版本差异变大的场景)

为不同版本的POJO定义统一的访问接口,比如HafasLeg、HafasLegList接口,每个版本写对应的适配器类实现该接口,包装对应版本的POJO实例,上层转换逻辑完全依赖统一接口,不需要感知具体版本,连泛型都不需要使用。

方案3:JAXB生成POJO时绑定公共接口(如果POJO是JAXB从XML Schema生成的场景最优)

使用JAXB的inheritance插件,在自动生成不同版本POJO的时候,直接让同名类实现同一个公共接口,上层转换逻辑直接依赖公共接口开发,完全不需要区分版本。

优化收益

  • 原有50个相似度97%的方法仅需保留1份公共实现,代码冗余率降低95%以上
  • 后续新增版本时仅需实现不到5%的差异逻辑,开发效率大幅提升
  • 公共逻辑迭代只需修改抽象父类一处,所有版本同步生效,避免多份重复代码改漏的运维问题

内容的提问来源于stack exchange,提问作者Chuck Nuris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 16:54:01