// 堆代码 duidaima.com private OrderShoudSettlementAmount getOrderShoudSettlementAmount(OrderDTO orderMain, List<SettlementDetail> details) { OrderShoudSettlementAmount settlementAmount = new OrderShoudSettlementAmount(); // 应结金额=33021-33002-32003+32001-31001 // 货款佣金=33005+33002+32003+31001 long feeMoney33021 = 0; long feeMoney33002 = 0; long feeMoney32003 = 0; long feeMoney32001 = 0; long feeMoney31001 = 0; long feeMoney33005 = 0; for (SettlementDetail settlementDetail : details) { if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_FREIGHT_ZS_NOSETTLE.getVal())) { feeMoney33021 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_FREIGHT_YJ_ZS_NOSETTLE.getVal())) { feeMoney33002 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_GOODS_YJ_WJTZ.getVal())) { feeMoney32003 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_GOODS_NOSETTLE.getVal())) { feeMoney32001 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_BDYJ_YJ_NOSETTLE.getVal())) { feeMoney31001 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_YFYJ_ZS_XSG.getVal())) { feeMoney33005 += settlementDetail.getOassMoney(); } } long settlementMoney = feeMoney33021 - feeMoney33002 - feeMoney32003 + feeMoney32001 - feeMoney31001; long goodCommissionMoney = feeMoney33005 + feeMoney33002 + feeMoney32003 + feeMoney31001; settlementAmount.setSettlementAmount(settlementMoney); settlementAmount.setGoodsCommission(goodCommissionMoney); settlementAmount.setOrderId(orderMain.getOrderId()); settlementAmount.setOrgCode(orderMain.getOrgCode()); settlementAmount.setStationNo(String.valueOf(orderMain.getDeliveryStationNo())); settlementAmount.setBillTime(new Date()); settlementAmount.setRetSuccess(false); return settlementAmount; }该方法逻辑比较简单,就是组装OrderShoudSettlementAmount对象。其中需要计算2个金额,分别是settlementMoney和goodCommissionMoney。
private OrderShoudSettlementAmount getOrderShoudSettlementAmount(OrderDTO orderMain, List<SettlementDetail> details) { OrderShoudSettlementAmount settlementAmount = new OrderShoudSettlementAmount(); // 应结金额=33021-33002-32003+32001-31001+34012-34013 // 货款佣金=33005+33002+32003+31001+34013 long feeMoney33021 = 0; long feeMoney33002 = 0; long feeMoney32003 = 0; long feeMoney32001 = 0; long feeMoney31001 = 0; long feeMoney33005 = 0; // 本次需求新增费项 long feeMoney34012 = 0; // 本次需求新增费项 long feeMoney34013 = 0; for (SettlementDetail settlementDetail : details) { if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_FREIGHT_ZS_NOSETTLE.getVal())) { feeMoney33021 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_FREIGHT_YJ_ZS_NOSETTLE.getVal())) { feeMoney33002 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_GOODS_YJ_WJTZ.getVal())) { feeMoney32003 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_GOODS_NOSETTLE.getVal())) { feeMoney32001 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_BDYJ_YJ_NOSETTLE.getVal())) { feeMoney31001 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_YFYJ_ZS_XSG.getVal())) { feeMoney33005 += settlementDetail.getOassMoney(); } // 本次需求新增费项 if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_CHF_XSG_NOSETTLE.getVal())) { feeMoney34012 += settlementDetail.getOassMoney(); } // 本次需求新增费项 if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_CHF_YJ_XSG.getVal())) { feeMoney34013 += settlementDetail.getOassMoney(); } } // 本次需求新增费项追加计算 + feeMoney34012 - feeMoney34013 long settlementMoney = feeMoney33021 - feeMoney33002 - feeMoney32003 + feeMoney32001 - feeMoney31001 + feeMoney34012 - feeMoney34013; // 本次需求新增费项追加计算 + feeMoney34013 long goodCommissionMoney = feeMoney33005 + feeMoney33002 + feeMoney32003 + feeMoney31001 + feeMoney34013; settlementAmount.setSettlementAmount(settlementMoney); settlementAmount.setGoodsCommission(goodCommissionMoney); settlementAmount.setOrderId(orderMain.getOrderId()); settlementAmount.setOrgCode(orderMain.getOrgCode()); settlementAmount.setStationNo(String.valueOf(orderMain.getDeliveryStationNo())); settlementAmount.setBillTime(new Date()); settlementAmount.setRetSuccess(false); return settlementAmount; }二、嗅出代码的坏味道
1.Duplicated Code(重复的代码)
2.Long Method(过长函数)
3.Large Class(过大类)
4.Long Parameter List(过长参数列)
5.Divergent Change(发散式变化)
6.Shotgun Surgery(霰弹式修改)
7.Feature Envy(依恋情结)
8.Data Clumps(数据泥团)
9.Primitive Obsession(基本型别偏执)
10.Switch Statements(switch惊悚现身)
11.Parallel Inheritance Hierarchies(平行继承体系)
12.Lazy Class(冗赘类)
13.Speculative Generality(夸夸其谈未来性)
14.Temporary Field(令人迷惑的暂时字段)
15.Message Chains(过度耦合的消息链)
16.Middle Man(中间人)
17.Inappropriate Intimacy(狎昵关系)
18.Alternative Classes with Different Interfaces(异曲同工的类)
19.Incomplete Library Class(不完美的程序库类)
20.Data Class(纯稚的数据类)
21.Refused Bequest(被拒绝的遗贈)
22.Comments(过多的注释)
for (SettlementDetail settlementDetail : details) { if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_FREIGHT_ZS_NOSETTLE.getVal())) { feeMoney33021 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_FREIGHT_YJ_ZS_NOSETTLE.getVal())) { feeMoney33002 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_GOODS_YJ_WJTZ.getVal())) { feeMoney32003 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_GOODS_NOSETTLE.getVal())) { feeMoney32001 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_BDYJ_YJ_NOSETTLE.getVal())) { feeMoney31001 += settlementDetail.getOassMoney(); } if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_YFYJ_ZS_XSG.getVal())) { feeMoney33005 += settlementDetail.getOassMoney(); } // 本次需求新增费项 if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_CHF_XSG_NOSETTLE.getVal())) { feeMoney34012 += settlementDetail.getOassMoney(); } // 本次需求新增费项 if (settlementDetail.getExpenseType().equals(FeeInfoEnum.FEE_INFO_CHF_YJ_XSG.getVal())) { feeMoney34013 += settlementDetail.getOassMoney(); } }坏味道2:Divergent Change(发散式变化)
private OrderShoudSettlementAmount getOrderShoudSettlementAmount(OrderDTO orderMain, List<SettlementDetail> details) { OrderShoudSettlementAmount settlementAmount = new OrderShoudSettlementAmount(); Map<Integer, Long> expenseTypeToFeeMoneyMap = Maps.newHashMap(); for (SettlementDetail settlementDetail : details) { long feeMoney = Optional.ofNullable(expenseTypeToFeeMoneyMap.get(settlementDetail.getExpenseType())).orElse(0L); feeMoney += Optional.ofNullable(settlementDetail.getOassMoney()).orElse(0L); expenseTypeToFeeMoneyMap.put(settlementDetail.getExpenseType(), feeMoney); } long settlementMoney = SettlementMoneyCalcFeeInfoEnum.calcSettlementMoney(expenseTypeToFeeMoneyMap); long goodCommissionMoney = GoodCommissionMoneyCalcFeeInfoEnum.calcGoodCommissionMoney(expenseTypeToFeeMoneyMap); settlementAmount.setSettlementAmount(settlementMoney); settlementAmount.setGoodsCommission(goodCommissionMoney); settlementAmount.setOrderId(orderMain.getOrderId()); settlementAmount.setOrgCode(orderMain.getOrgCode()); settlementAmount.setStationNo(String.valueOf(orderMain.getDeliveryStationNo())); settlementAmount.setBillTime(new Date()); settlementAmount.setRetSuccess(false); return settlementAmount; } enum SettlementMoneyCalcFeeInfoEnum { /**计算项*/ FEE_33021(FeeInfoEnum.FEE_INFO_FREIGHT_ZS_NOSETTLE, "+"), FEE_33002(FeeInfoEnum.FEE_INFO_FREIGHT_YJ_ZS_NOSETTLE, "-"), FEE_32003(FeeInfoEnum.FEE_INFO_GOODS_YJ_WJTZ, "-"), FEE_32001(FeeInfoEnum.FEE_INFO_GOODS_NOSETTLE, "+"), FEE_31001(FeeInfoEnum.FEE_INFO_BDYJ_YJ_NOSETTLE, "-"), FEE_34012(FeeInfoEnum.FEE_INFO_CHF_XSG_NOSETTLE, "+"), FEE_34013(FeeInfoEnum.FEE_INFO_CHF_YJ_XSG, "-"); private final FeeInfoEnum feeInfoEnum; private final String symbol; SettlementMoneyCalcFeeInfoEnum(FeeInfoEnum feeInfoEnum, String symbol) { this.feeInfoEnum = feeInfoEnum; this.symbol = symbol; } public static long calcSettlementMoney(Map<Integer, Long> expenseTypeToFeeMoneyMap) { // 应结金额=33021-33002-32003+32001-31001+34012-34013 long settlementMoney = 0L; for (SettlementMoneyCalcFeeInfoEnum calcFeeInfoEnum : SettlementMoneyCalcFeeInfoEnum.values()) { if ("+".equals(calcFeeInfoEnum.symbol)) { settlementMoney += Optional .ofNullable(expenseTypeToFeeMoneyMap.get(calcFeeInfoEnum.feeInfoEnum.getVal())) .orElse(0L); } if ("-".equals(calcFeeInfoEnum.symbol)) { settlementMoney -= Optional .ofNullable(expenseTypeToFeeMoneyMap.get(calcFeeInfoEnum.feeInfoEnum.getVal())) .orElse(0L); } } return settlementMoney; } } enum GoodCommissionMoneyCalcFeeInfoEnum { /**计算项*/ FEE_33005(FeeInfoEnum.FEE_INFO_YFYJ_ZS_XSG), FEE_33002(FeeInfoEnum.FEE_INFO_FREIGHT_YJ_ZS_NOSETTLE), FEE_32003(FeeInfoEnum.FEE_INFO_GOODS_YJ_WJTZ), FEE_31001(FeeInfoEnum.FEE_INFO_BDYJ_YJ_NOSETTLE), FEE_34013(FeeInfoEnum.FEE_INFO_CHF_YJ_XSG); private final FeeInfoEnum feeInfoEnum; GoodCommissionMoneyCalcFeeInfoEnum(FeeInfoEnum feeInfoEnum) { this.feeInfoEnum = feeInfoEnum; } public static long calcGoodCommissionMoney(Map<Integer, Long> expenseTypeToFeeMoneyMap) { // 货款佣金=33005+33002+32003+31001+34013 long goodCommissionMoney = 0L; for (GoodCommissionMoneyCalcFeeInfoEnum calcFeeInfoEnum : GoodCommissionMoneyCalcFeeInfoEnum.values()) { goodCommissionMoney += Optional .ofNullable(expenseTypeToFeeMoneyMap.get(calcFeeInfoEnum.feeInfoEnum.getVal())) .orElse(0L); } return goodCommissionMoney; } }四、总结