一个Jalor5 Service方法的重构过程

举报
开发者学堂小助 发表于 2017/09/07 10:10:33 2017/09/07
【摘要】 一个Jalor5 Service方法的重构过程

 如下是一个重构前的Jalor5 Service方法:

-

Java 代码

001

public IncHeadVO saveInc(IncHeadVO incHeadVO) throws ApplicationException   {

002

        logger.info("created   incentive data start ");

003

        /**

004

         * 1.   获取headseqID   ---Insert前自动生成并赋值到headVO

 

005

         * 2.   获取head的编码 --   通过incHeadDAO.f   indIncHeadAppNO()获取

006

         * 3.   head数据

 

007

         * 4.   入多选的数据(供应商、产品型号、包装指令)

008

         * 5.   循环行数据

009

         *   5.1 获取行数据的seqID ---Insert前自动生成并赋值到lineVO

010

         *   5.2. 入行数据

011

         *   5.3. 循环插 入明细数据

012

         */

 

013

        functionCount   = functionCount + 1;

014

        String   userId = incCommonService.getCurrentUserId();

015

        //记录首次提交时间

016

        DateFormat   format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

 

017

        String   time=format.format(new Date());

018

        if(StringUtils.isNotBlank(incHeadVO.getSubmitFlag())   && StringUtils.isBlank(incHeadVO.getSubmitTime())){

019

            incHeadVO.setSubmitTime(time);

020

        }

 

021

        boolean isUpdate   = false;

022

        if (null !=   incHeadVO && StringUtils.isNotBlank(incHeadVO.getRowId())) {

023

            if(StringUtils.isBlank(incHeadVO.getIsImportFlag())){

024

                //   如果id存在更新操作

 

025

                incHeadVO.setCreatedBy(userId);

026

                incHeadVO.setLastUpdatedBy(userId);

027

                //R1611-0061   start

028

 

 

029

                List<IncLineVO>   result = iIncPrcLineDAO.f I n dIncLinesByHeadId(incHeadVO.getRowId());

030

                for (IncLineVO   incLineVO : result) {

031

                    String   status = null;

032

                    //更新状态为'Y'并且状态为草稿或驳回的情况才更新行数据

 

033

                    if("Draft".equals(incHeadVO.getStatus())   ||"1".equals(incHeadVO.getStatus())){

034

                        status   = "1";

035

                    }else if("Incentive   Returned".equals(incHeadVO.getStatus()) ||"4".equals(incHeadVO.getStatus())){

036

                        status   = "4";

037

                    }

038

                    if("Y".equals(incLineVO.getIsUpdate())   && ("1".equals(status) || "4".equals(status)   )){

 

039

                        isUpdate   = true;

040

                        break;

041

                    }

042

                }

043

                if(isUpdate){

044

                    incPrcHeadDAO.updateIncHeadAndLine(incHeadVO);

045

                }else{

046

                    incPrcHeadDAO.updateIncHead(incHeadVO);

047

                }

048

                //R1611-0061   end

049

            }

050

        } else {

051

            incHeadVO.setCreatedBy(userId);

052

            incHeadVO.setStatus("1");

 

053

            incHeadVO.setAppNo(incPrcHeadDAO.f   I n dIncHeadAppNO());

054

            //   如果id不存在创建操作

055

            incPrcHeadDAO.insertIncAsDraft(incHeadVO);

056

        }

 

057

         

058

        if (null !=   incHeadVO && StringUtils.isNotBlank(incHeadVO.getRowId())) {

059

            List<IncTypeVO>   typeList = incHeadVO.getTypeList();

060

            if (null !=   typeList && !typeList.isEmpty() &&   StringUtils.isBlank(incHeadVO.getIsImportFlag())) {

061

                incPrcHeadDAO.insertHeadTypeAsDraft(typeList,   incHeadVO.getRowId());

062

            }

063

             

064

            //需要保存行数据并且行数据不为空的场合

 

065

            if((null ==   incHeadVO.getIsSaveHead() ||"".equals(incHeadVO.getIsSaveHead()))   && (null != incHeadVO.getLines() &&   !incHeadVO.getLines().isEmpty())){

066

                if(isUpdate){

067

                    //更新Line

068

                    for (IncLineVO   incLineVO : incHeadVO.getLines()) {

 

069

                        if(StringUtils.isNotBlank(incLineVO.getRowId())){

070

                            this.updateIncLine(incHeadVO,incLineVO);

071

                        }else{

072

                            //新增的行

073

                            List<IncLineVO>   incLineVOList = newArrayList<IncLineVO>();

074

                            incLineVOList.add(incLineVO);

075

                            insertIncLine(incHeadVO,   incLineVOList);

076

                        }

 

077

                    }

078

                }else{

079

                    insertIncLine(incHeadVO,   incHeadVO.getLines());

080

                }

081

            }

082

            //R1611-0061   end

083

        }

084

        if(StringUtils.isBlank(incHeadVO.getIsImportFlag())){

 

085

            BatchVO<TeamVO>   paramBatchVO = new BatchVO<TeamVO>();

086

            paramBatchVO.setItems2Update(incHeadVO.getIncTeamList());

087

            incPrcHeadService.batchOperation(paramBatchVO, "PRM_INC",   incHeadVO.getRowId());

088

        }

089

        logger.info("created   incentive data end ");

090

        //重新查询排序

091

        IncHeadVO   headVO = this.fi ndHeadById(incHeadVO.getRowId());

092

        if(headVO!=null){

093

            incHeadVO.setLines(headVO.getLines());

094

        }

095

         

096

        // 待办的场合   WAT START

097

        if(incHeadVO.getWatIds()   != null && !"".equals(incHeadVO.getWatIds().trim()))   {

098

            prmIncIdealPriceTService.updateStatusToComplete(incHeadVO.getWatIds().trim());

099

        }

100

        // 待办的场合   WAT END

101

         

102

        return incHeadVO;

103

    }

 

这个方法的重构,从以下几个方面入手:

1、入参一开始就要进行空值判断,为空的逻辑第一步处理(要么抛异常,要么特殊处理后返回),不要后面一堆的重复判断;

2、对于VO特定字段的判断,下沉到VO,即在VO里有一个对应的实例方法,专门用于判断字段是否合法,例如下面的代码:

-

Java 代码

1

if (null != incHeadVO && StringUtils.isNotBlank(incHeadVO.getRowId()))

这么长的一个判断代码,完全可以在VO中加一个方法 isValidRowId,在业务代码中,上面的判断就可以这么写:

-

Java 代码

1

if(incHeadVO.isValidRowId())

这样,代码既简洁又具有鲜明的业务意义,可读性很高,代码也不容易出错;

3、去掉代码中的字面值(魔术数值),要么提升为类常量,要么提升为Enum类型,如下代码:

-

Java 代码

1

"4".equals(incHeadVO.getStatus())

4是一个status值,业务上代表什么呢?一点都不直观,可以声明一组常量,说明每个数值代表的具体业务意义;

4、集合类用工具类进行空或者空值判断,如:

-

Java 代码

1

CollectionUtil.isNullOrEmpty(typeList)StringUtils.isNullOrEmpty(str)

少一个判断,就少一个复杂度,代码也更简洁;

5、复杂代码按处理逻辑抽取成private方法;

6、深层次的if、循环嵌套通过相反条件,把复杂代码从if中提出来,独立成块。

 

对应VO新增如下方法:

-

Java 代码

01

    public boolean isValidSubmitFlag(){

02

        return StringUtils.isNotBlank(getSubmitFlag());

03

    }

04

     

 

05

    public boolean isValidSubmitTime(){

06

        return StringUtils.isBlank(getSubmitTime());

07

    }

08

    

09

    public boolean isValidRowId(){

10

        return StringUtils.isNotBlank(getRowId());

11

    }

12

    

13

    public boolean isValidIsImportFlag()   {

14

        return StringUtils.isBlank(getIsImportFlag());

15

    }

16

    

17

    public boolean isEmptyIsSaveHead()   {

18

        return (null ==   getIsSaveHead() || StringUtil.EMPTY.equals(getIsSaveHead()));

19

    }

20

    

21

    public boolean isValidWatIds()   {

22

        return getWatIds()   != null && !"".equals(getWatIds().trim());

23

    }

24

     

 

25

    public boolean isEmptyLines()   {

26

        return CollectionUtil.isNullOrEmpty(getLines());

27

    }

 

重构后的代码如下:

-

Java 代码

001

     

002

    /**

003

    草稿

004

    */

005

    private static final String   DRAFT = "Draft";

006

    /**

007

    驳回

008

    */

009

    private static final String   REJECTED = "1";

010

    /**

011

    已更新

012

    */

013

    private static final String   IS_UPDATED = "Y";

014

    /**

015

    激励被驳回

016

    */

017

    private static final String   INCENTIVE_RETURNED = "Incentive Returned";

018

    /**

019

    审批通过

020

    */

021

    private static final String   APPROVED = "4";

022

 

023

    /**

024

     * 1. 获取headseqID   ---Insert前自动生成并赋值到headVO

025

     * 2. 获取head的编码 --   通过incHeadDAO.fi   ndIncHeadAppNO()获取

026

     * 3. head数据

027

     * 4. 入多选的数据(供应商、产品型号、包装指令)

028

     * 5. 循环行数据

029

     * 5.1 获取行数据的seqID ---Insert前自动生成并赋值到lineVO

030

     * 5.2. 入行数据

031

     * 5.3. 循环插 入明细数据

032

     */

033

    public IncHeadVO   saveInc(IncHeadVO incHeadVO) throws ApplicationException {

034

        if(incHeadVO   == null){

035

            return null;

036

        }

037

         

038

        logger.info("created   incentive data start ");

039

         

040

        functionCount   = functionCount + 1;

041

        String   userId = incCommonService.getCurrentUserId();

042

        //记录首次提交时间

043

        DateFormat   format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

044

        String   time=format.format(new Date());

045

        if(incHeadVO.isValidSubmitFlag()   && incHeadVO.isValidSubmitTime()){

046

            incHeadVO.setSubmitTime(time);

047

        }

048

        boolean isUpdate   = false;

049

        if (incHeadVO.isValidRowId())   {

050

            isUpdate   = updateIncHead(incHeadVO, userId);

051

        } else {

052

            incHeadVO.setCreatedBy(userId);

053

            incHeadVO.setStatus("1");

054

            incHeadVO.setAppNo(incPrcHeadDAO.f   I nd IncHeadAppNO());

055

            //   如果id不存在创建操作

056

            incPrcHeadDAO.insertIncAsDraft(incHeadVO);

057

        }

058

        

059

        if (incHeadVO.isValidRowId())   {

060

            List<IncTypeVO>   typeList = incHeadVO.getTypeList();

061

            if (!CollectionUtil.isNullOrEmpty(typeList)   && incHeadVO.isValidIsImportFlag()) {

062

                incPrcHeadDAO.insertHeadTypeAsDraft(typeList,   incHeadVO.getRowId());

063

            }            

064

            //需要保存行数据并且行数据不为空的场合

065

            saveOrUpdateIncLine(incHeadVO,   isUpdate);

066

            //R1611-0061   end

067

        }

068

        if(incHeadVO.isValidIsImportFlag()){

069

            BatchVO<TeamVO>   paramBatchVO = new BatchVO<TeamVO>();

070

            paramBatchVO.setItems2Update(incHeadVO.getIncTeamList());

071

            incPrcHeadService.batchOperation(paramBatchVO, "PRM_INC",   incHeadVO.getRowId());

072

        }

073

        logger.info("created   incentive data end ");

074

        

075

        //重新查询排序

076

        IncHeadVO   headVO = this.fi ndHeadById(incHeadVO.getRowId());

077

        if(headVO   != null){

078

            incHeadVO.setLines(headVO.getLines());

079

        }        

080

        // 待办的场合   WAT START

081

        if(incHeadVO.isValidWatIds())   {

082

            prmIncIdealPriceTService.updateStatusToComplete(incHeadVO.getWatIds().trim());

083

        }

084

        // 待办的场合   WAT END

085

         

086

        return incHeadVO;

087

    }

088

 

089

    /**

090

    保存或者更新行

091

    */

092

    private void saveOrUpdateIncLine(IncHeadVO   incHeadVO, boolean isUpdate) throwsApplicationException {

093

        if(!incHeadVO.isEmptyIsSaveHead()   || incHeadVO.isEmptyLines()){

094

            return;

095

        }

096

         

 

097

        if(isUpdate){

098

            //更新Line

 

099

            updateIncLine(incHeadVO);

100

        }else{

101

            insertIncLine(incHeadVO,   incHeadVO.getLines());

102

        }

103

    }

104

    

105

    /**

106

    更新头

107

    */

108

    private boolean updateIncHead(IncHeadVO   incHeadVO, String userId) {

109

        if(!incHeadVO.isValidIsImportFlag()){

110

            return false;

111

        }

112

        

113

        boolean isUpdate   = false;

114

        // 如果id存在更新操作

115

        incHeadVO.setCreatedBy(userId);

116

        incHeadVO.setLastUpdatedBy(userId);

117

        List<IncLineVO>   result = iIncPrcLineDAO.fi ndIncLinesByHeadId(incHeadVO.getRowId());

118

        for (IncLineVO   incLineVO : result) {

119

            String   status = null;

120

            //更新状态为'Y'并且状态为草稿或驳回的情况才更新行数据

121

            if(DRAFT.equals(incHeadVO.getStatus())   || REJECTED.equals(incHeadVO.getStatus())){

122

                status   = REJECTED;

 

123

            }else if(INCENTIVE_RETURNED.equals(incHeadVO.getStatus())   || APPROVED.equals(incHeadVO.getStatus())){

124

                status   = APPROVED;

125

            }

126

            if(IS_UPDATED.equals(incLineVO.getIsUpdate())   && (REJECTED.equals(status) || APPROVED.equals(status) )){

127

                isUpdate   = true;

128

                break;

129

            }

130

        }

131

        if(isUpdate){

132

            incPrcHeadDAO.updateIncHeadAndLine(incHeadVO);

133

        }else{

134

            incPrcHeadDAO.updateIncHead(incHeadVO);

135

        }

136

        //R1611-0061   end

137

     

138

        return isUpdate;

139

    }

140

 

141

    /**

142

    更新行

143

    */

144

    private void updateIncLine(IncHeadVO   incHeadVO) throws ApplicationException {

145

        for (IncLineVO   incLineVO : incHeadVO.getLines()) {

146

            if(incLineVO.isValidRowId()){

147

                this.updateIncLine(incHeadVO,incLineVO);

148

            }else{

149

                //新增的行

150

                List<IncLineVO>   incLineVOList = new ArrayList<IncLineVO>()

151

                incLineVOList.add(incLineVO);

152

                insertIncLine(incHeadVO,   incLineVOList);

153

            }

154

        }

155

    }

如需本文转载,如需转载请与云社区联系。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。