如题,下面的代码该如何重构?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;
    }

解决方案 »

  1.   

    有一些成员变量没有贴上去,补上:
    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";
      

  2.   

    感觉你的代码有很多if else判断,感觉有些条件都是一样的。把条件从大到小来罗列出来,理出各个分支。
      

  3.   

    这个类不是我写的,只是现在被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;
        }不知道大家有没有更好的方法。
      

  4.   

    因为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;
        }
    }