发表于: 2017-12-26 21:29:33

0 557


一.今天完成的主要事情

1.对之前写的接口进行重构

比如新增提现订单时要在提现表中新增一条记录,这时要新建一个对象,然后初始化该对象,最后将该对象添加到数据库中,这时就有一个问题,一个对象通常都有七八个甚至十几个字段,如果在接口中初始化该对象,接口中的代码会变得非常长,代码非常冗余,而且有的接口需要插入不止一个对象,大段大段的对象初始化代码会让代码变得又臭又长,难以阅读,比如这样:

@RequestMapping(value = "/a/u/withdrawal", method = RequestMethod.POST)

    public String addWithdrawOrder(HttpServletRequest request, HttpServletResponse response, ModelMap model,

                                   @RequestParam Long[] idArray, Long schoolId, String schoolName, BigDecimal withdrawAmount) throws Exception {

        //打印参数

        log.info("Inteface POST /a/u/withdrawal, Method addWithdrawOrder() parameters: schoolId is : " + schoolId +

                ", schoolName: " + schoolName + ", withdrawAmount: " + withdrawAmount + ", idArray: " + idArray);

        //校验参数

        if (DataUtils.isNullOrEmpty(schoolId)) {

            log.info("parameter schoolId can not be null, schoolId: " + schoolId);

            model.addAttribute("code", -1000);

            return "/common/failure";

        }

        if (DataUtils.isNullOrEmpty(schoolName)) {

            log.info("parameter schoolName can not be null, schoolName: " + schoolName);

            model.addAttribute("code", -1000);

            return "/common/failure";

        }

        if (DataUtils.isNullOrEmpty(withdrawAmount)) {

            log.info("parameter withdrawAmount can not be null, withdrawAmount: " + withdrawAmount);

            model.addAttribute("code", -1000);

            return "/common/failure";

        }

        if (DataUtils.isNullOrEmpty(idArray)) {

            log.info("parameter idArray can not be null or empty, idArray: " + idArray);

            model.addAttribute("code", -1000);

            return "/common/failure";

        }

        //实现逻辑

        //TODO 该部分功能写好后打开注释

        /*String managerIdStr = CookieUtil.getKeyIdentity(request, CookieUtil.UserID);

        Long managerId = Long.parseLong(managerIdStr);

        */

        //1.先生成Withdraw对象

        Withdraw withdraw = new Withdraw();

        withdraw.setSchoolId(schoolId);

        withdraw.setSchoolName(schoolName);

        withdraw.setWithdrawAmount(withdrawAmount);

        withdraw.setStatus(1);

        withdraw.setCreateBy(-1L);

        withdraw.setUpdateBy(-1L);

        /*withdraw.setCreateBy(managerId);

        withdraw.setUpdateBy(managerId);*/

        try {

            //2.将该对象插入的withdrw表中,获取该条记录的withdrawId

            Long withdrawId = withdrawService.insert(withdraw);

            log.info("insert withdraw success, withdraw Id is : " + withdrawId);

            //3.根据传入进来的IdList,查enrollment_detail表,获取enrollmentDetail对象List.

            List<EnrollmentDetail> enrollmentDetailList = new ArrayList<>();

            List<Long> idList = Arrays.asList(idArray);

            enrollmentDetailList = enrollmentDetailService.getObjectsByIds(idList);

            if (CollectionUtils.isEmpty(enrollmentDetailList)) {

                log.info("Can not query data by idList, idList is : " + idList);

                model.addAttribute("code", -1001);

                return "/common/failure";

            }

            log.info("get enrollmentDetail list by idList, list size is : " + enrollmentDetailList.size());

            //4.将该List中的每个元素的withdrawId的值改为withdrawId

            for (int i = 0; i < enrollmentDetailList.size(); i++) {

                enrollmentDetailList.get(i).setWithdrawId(withdrawId);

               /* enrollmentDetailList.get(i).setUpdateBy(managerId);*/

            }

            //5.批量更新enrollment_detail表

            enrollmentDetailService.updateList(enrollmentDetailList);

            log.info("update enrollmentDetailList success, list size is " + enrollmentDetailList.size());

            model.addAttribute("code", 0);

            model.addAttribute("id", withdrawId);

            return "/common/insert";

        } catch (Throwable t) {

            log.error(t.getMessage());

            log.error("Method addWithdrawOrder() failed, schoolId: " + schoolId + ", schoolName: " +

                    schoolName + ", withdrawAmount: " + withdrawAmount + ", idArray: " + idArray);

            model.addAttribute("code", -1);

            return "/common/failure";

        }

    }


今天回忆了一波老大之前讲的重构代码的知识,老大说可以通过提取共同功能类,以及抽取函数到service来实现接口中代码量的减少,根据这个观点,自己尝试了将添加一条记录的功能抽取出来,放在servicve中,因为该功能不属于所有项目中可以复用的部分,但是属于在该项目中可以复用,将初始化并插入记录的代码放在service中之后,将可变的属性当作参数传入方法,这样就可以实现方法的复用,以后在该项目中,不论哪里需要初始化并插入记录,都可以使用这个方法.

重构后service的代码如下:

 public Long generateWithdraw(School school, BigDecimal withdrawAmount, Long managerId, Integer status) throws ServiceException, ServiceDaoException {

        log.info(" generate withdraw data : school : " +  school + ", withdrawAmount: " + withdrawAmount +

                ", managerId: " + managerId + ", status: " + status);

        Withdraw withdraw = new Withdraw();

        withdraw.setSchoolId(school.getId());

        withdraw.setSchoolName(school.getName());

        withdraw.setWithdrawAmount(withdrawAmount);

        withdraw.setStatus(status);

        withdraw.setCreateBy(managerId);

        withdraw.setUpdateBy(managerId);

        long currentTimeMillis = System.currentTimeMillis();

        withdraw.setCreateAt(currentTimeMillis);

        withdraw.setUpdateAt(currentTimeMillis);

        Long result = null;

        try {

            result = (Long) dao.save(withdraw);

        } catch (DaoException e) {

            log.error(" generate withdraw wrong : " + withdraw);

            log.error(e);

            e.printStackTrace();

            throw new ServiceDaoException(e);

        }

        log.info(" generate withdraw success : " + result);

        return result;

    }


然后接口中的代码如下:

只要简单的一行代码,就可以完成初始化并插入一条记录的功能,而且也没有额外的调用service,不存在性能上的额外开销.

至于校验参数,还是引用在复盘项目时的做法,用一个方法实现参数的校验,这里就不再重复贴出来了,因为以自己的水平,重构的还不够完全,重构的质量还不高,这个需要后续继续学习.


二.明天计划完成的事情

1.开始进行今天又分配给自己的登陆,注册,模块


三.遇到的问题

暂无


四.收获

以上


五.项目进度情况

暂无延期风险


返回列表 返回列表
评论

    分享到