当前位置:编程学习 > JAVA >>

求助,下面的代码如果重构

如题,下面的代码该如何重构?sonar检测出来的复杂度有60多,标准是不能超过10,大家给点意见。

 private  String calculateVehicleClassCode(PolicySummary policySummary){
        String vehicleTypeCd = getVehicleTypeCd(policySummary);
        String coverageTypeCd = getCoverageTypeCd(policySummary);
        String vehicleUsageCd = getVehicleUsageCd(policySummary);
        Boolean vintageClassicInd = getVintageClassicInd(policySummary);
        Boolean vintageClassicOrNotUsedDailyInd = getVintageClassicOrNotUsedDailyInd(policySummary);

        String vehicleClassCode = null;
        if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals("PP") && coverageTypeCd.equals(FULL)
                && (vintageClassicInd != null) && vintageClassicInd
                && (vintageClassicOrNotUsedDailyInd != null) && (!vintageClassicOrNotUsedDailyInd)) {
            vehicleClassCode = "PC";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals("PP") && coverageTypeCd.equals(FULL)
                && (vintageClassicInd != null) && (!vintageClassicInd)) {
            vehicleClassCode = "PC";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals("PP") && coverageTypeCd.equals(FULL)
                && (vintageClassicInd != null) && vintageClassicInd
                && (vintageClassicOrNotUsedDailyInd != null) && vintageClassicOrNotUsedDailyInd) {
            vehicleClassCode = "VN";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals(COML) && coverageTypeCd.equals(FULL)) {
            vehicleClassCode = "CC";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals(COML) && coverageTypeCd.equals("TPFT")) {
            vehicleClassCode = "CL";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals(COML) && coverageTypeCd.equals( TPO)) {
            vehicleClassCode = "TC";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals("REST")) {
            vehicleClassCode = "RS";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals("PP") && coverageTypeCd.equals("TPFT")) {
            vehicleClassCode = "PL";
        } else if (vehicleTypeCd.equals(CAR) && vehicleUsageCd.equals("PP") && coverageTypeCd.equals( TPO)) {
            vehicleClassCode = "TP";
        } else if (vehicleTypeCd.equals(TRUCK01) && vehicleUsageCd.equals("PP") && coverageTypeCd.equals( TPO)) {
            vehicleClassCode = "TR";
        } else if (vehicleTypeCd.equals(TRUCK01) && vehicleUsageCd.equals("PP")) {
            vehicleClassCode = "PT";
        } else if (vehicleTypeCd.equals(TRUCK01) && vehicleUsageCd.equals(COML) && coverageTypeCd.equals( TPO)) {
            vehicleClassCode = "TT";
        }else if (vehicleTypeCd.equals(TRUCK01) && vehicleUsageCd.equals(COML)) {
            vehicleClassCode = "CT";
        }else if (vehicleTypeCd.equals(TRUCK01) && vehicleUsageCd.equals("FARO") && coverageTypeCd.equals( TPO)) {
            vehicleClassCode = "TF";
        } else if (vehicleTypeCd.equals(TRUCK01) && vehicleUsageCd.equals("FARO")) {
            vehicleClassCode = "FT";
        } else if (vehicleTypeCd.equals("CA") && vehicleUsageCd.equals("PP")) {
            vehicleClassCode = "CV";
        } else if (vehicleTypeCd.equals("TR") && vehicleUsageCd.equals("PP")) {
            vehicleClassCode = "TL";
        } else if (vehicleTypeCd.equals("TR") && vehicleUsageCd.equals(COML)) {
            vehicleClassCode = "CI";
        } else if (vehicleTypeCd.equals("MC") && vehicleUsageCd.equals("PP") && coverageTypeCd.equals( TPO)) {
            vehicleClassCode = "TM";
        } else if (vehicleTypeCd.equals("MC") && vehicleUsageCd.equals("PP")) {
            vehicleClassCode = "MC";
        } else if (vehicleTypeCd.equals("MC") && vehicleUsageCd.equals("OFRD")) {
            vehicleClassCode = "OM";
        } else if (vehicleTypeCd.equals("MC") && vehicleUsageCd.equals("REST")) {
            vehicleClassCode = "RM";
        } else if (vehicleTypeCd.equals("MH") && vehicleUsageCd.equals("PP")) {
            vehicleClassCode = "MH";
        } else if (vehicleTypeCd.equals("TC") && vehicleUsageCd.equals("PP")) {
            vehicleClassCode = "PR";
        }
        return vehicleClassCode;
    }
--------------------编程问答-------------------- 有一些成员变量没有贴上去,补上:
private static final String VEHICLE_CLASS = "VehicleClass";
    private static final String CAR = "CAR";
    private static final String FULL = "FULL";
    private static final String COML = "COML";
    private static final String TPO =  "TPO";
    private static final String TRUCK01 = "TRUCK01"; --------------------编程问答-------------------- 建个树来匹配这些逻辑 --------------------编程问答-------------------- 求伪代码。。 --------------------编程问答-------------------- 感觉你的代码有很多if else判断,感觉有些条件都是一样的。把条件从大到小来罗列出来,理出各个分支。 --------------------编程问答-------------------- 这个if分支就比较复杂,你看用其他的可以不。 --------------------编程问答-------------------- 这个类不是我写的,只是现在被sonar检测出来了,需要重构下。
想到一种方法,根据if中条件的个数来分类,然后新建类做为key,具体if的返回结果为value来处理。例如if中有2个条件的就使用:
 

 private static Map<VehicleTypeAndUsage,String> VehicleTypeAndUsageMap = new HashMap<VehicleTypeAndUsage,String>();
    static{
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage(CAR,"REST"),"RS");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage(TRUCK01,"PP"),"PT");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage(TRUCK01,COML),"CT");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage(TRUCK01,"FARO"),"FT");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("CA","PP"),"CV");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("TR","PP"),"TL");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("TR",COML),"CI");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("MC","PP"),"MC");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("MC","OFRD"),"OM");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("MC","REST"),"RM");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("MH","PP"),"MH");
        VehicleTypeAndUsageMap.put(new VehicleTypeAndUsage("TC","PP"),"PR");
    }

  private String populateVehicleClassCodeByTypeAndUsagecd(String vehicleTypeCd, String vehicleUsageCd){
        String vehicleClassCode = null;
        if(vehicleTypeCd != null && vehicleUsageCd != null) {
            vehicleClassCode = VehicleTypeAndUsageMap.get(new VehicleTypeAndUsage(vehicleTypeCd, vehicleUsageCd));
        }
        return vehicleClassCode;
    }



不知道大家有没有更好的方法。 --------------------编程问答-------------------- 因为if中的条件有2个所以新建的类有2个成员属性:
class VehicleTypeAndUsage{
   private String vehicleTypeCd;
   private String vehicleUsageCd;
   public VehicleTypeAndUsage(String vehicleTypeCd, String vehicleUsageCd){
        this.vehicleTypeCd = vehicleTypeCd;
        this.vehicleUsageCd = vehicleUsageCd;
   }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        VehicleTypeAndUsage that = (VehicleTypeAndUsage) o;

        if (vehicleTypeCd != null ? !vehicleTypeCd.equals(that.vehicleTypeCd) : that.vehicleTypeCd != null)
            return false;
        if (vehicleUsageCd != null ? !vehicleUsageCd.equals(that.vehicleUsageCd) : that.vehicleUsageCd != null)
            return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = vehicleTypeCd != null ? vehicleTypeCd.hashCode() : 0;
        result = 31 * result + (vehicleUsageCd != null ? vehicleUsageCd.hashCode() : 0);
        return result;
    }
}
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,