爱可深思▼ 2016▼ 内测 重构 坏味 集合 逻辑

A011.内测.重构坏味代码

迷你版的财务记账,包括了余额,交易和明细三块。
能够满足基本的记账要求:对账,红订正,做报表。

@史荣久 / 2016-06-18 / CC-BY-SA-3.0

任务说明

重构的目标是保证功能不变,提升可读性或其他指标,如性能,安全,质量等。

  • 指出以下2段代码的坏味道。
  • 并写出2种以上重构方案。

初级重构,代码语义转换。 代码-1

中级重构,分析业务逻辑。 代码-2

一般认为,能重构以上代码者,应从业一两年,撸码数万行。有代码节操,有逻辑思考力。

坏味代码

初级重构的代码片段

    List<String> list = new ArrayList(Arrays.asList("AZ", "CA", "CO", "ID", "MT", "NM", "NV", "OR", "UT", "WA", "WY"));
    int cnt= 0;
    for(int i = 0; i < list.size() ; i++, cnt= 0){
        if(view.getProvince() != null && view.getProvince().equals(list.get(i))){
            cnt = 1;
            break;
        }
    }
    if(cnt == 1){
        vo.put("wareHouse", "加州仓库");
    } else {
        vo.put("wareHouse", "纽约仓库");
    }

中级重构的代码片段

    // 代码2,需要重建丢失的类或接口
    String type = row.get(11); //服务类型
    int serviceType = 0;
    if (type.equals(GROUND)) {
        serviceType = ServiceTypeEnum.FEDEX_GROUND.code();
    } else if (type.equals(INTERNATIONAL1) || type.equals(INTERNATIONAL2)) {
        continue;
    }

    List<BaggagePo> baggagePos = baggageDao.findByOrderMainId(orderMainPo.getId());
    int k = 0;
    int l = 0;
    List<String> orderNumNoUse = new ArrayList<>();
    List<String> orderNumUse = new ArrayList<>();
    if (orderMainPo.getIsLocal() == 1) {

    for (BaggagePo po : baggagePos) {
        if (po.getStatus() == OrderStatusEnum.USUS_PICK.code()) {
            orderNumNoUse.add(k, po.getTrackNumUs());
            k++;
        }
        if (po.getStatus() != OrderStatusEnum.USUS_PICK.code()) {
            orderNumUse.add(l, po.getTrackNumUs());
            l++;
        }

    }

    List<ImptFedexBillsPo> imptFedexBillsPos = fedexBillsDao.findByOrderMainId(orderMainPo.getId());
    if (DecimalUtil.add(new BigDecimal(imptFedexBillsPos.size()), new BigDecimal(k)).equals(new BigDecimal(baggagePos.size()))) {
        orderMainService.updateStatus(orderMainPo.getId(), OrderStatusEnum.USUS_PAY.code());
        for (BaggagePo po : baggagePos) {
            BaggagePo baggagePo = baggageDao.findById(po.getId());
            baggagePo.setModifyTime(new Date());
            baggagePo.setStatus(OrderStatusEnum.USUS_PAY.code());
            if (orderNumNoUse == null) {
                int cnt = baggageDao.updateBaggage(baggagePo);
                DaoUtil.assertUpdateOne(cnt, baggagePo);
            }
            for(String s : orderNumUse){
                if (s.equals(baggagePo.getTrackNumUs())) {
                    int cnt = baggageDao.updateBaggage(baggagePo);
                    DaoUtil.assertUpdateOne(cnt, baggagePo);
                }
            }
        }
    }
}
}
《A011.内测.重构坏味代码》 一般认为,能重构以上代码者,应从业一两年,撸码数万行。有代码节操,有逻辑思考力。
题图:不忘初心,方得始终。攻城狮精神是,孜孜不倦的,精益求精的"Just Do It"。