idea 将代码块抽取为方法 快捷键

前言

遇到业务逻辑很复杂的模块,有时候一个方法一写就好几百行。这个时候很多代码可以抽成一个方法,从而使业务逻辑很复杂的方法变得易读。当然,你必须要在关键的地方写上注释,方便后面的人维护。
Idea提供了一个抽取功能,可以将变量、代码块等抽取出来,减少重复代码,提高代码可读性。
用来重构代码,非常方便快捷。开发效率也会提高!!

具体操作

抽取方法的快捷键是 Ctrl + Alt + M,其中 M 代表 Method,即方法。
以下代码分别演示了抽取前,抽取后的变化,可以看出抽取后的代码结构更清晰简单,阅读性更好。

提取前:

// 大转盘 设置某用户下次必中某商品
public void updateTurntableNextAward(Integer userId, Integer awardId, HttpServletRequest request) {
    //验证奖品
    BsTurntableAward award = turntableAwardMapper.selectByPrimaryKey(awardId);
    if (award == null) {
        throw new BusiException(E.INVALID_PARAMETER, "奖品不存在");
    }
    if (award.getState() != 1) {
        throw new BusiException(E.INVALID_PARAMETER, "奖品已停售");
    }

    Jedis jedis = RedisPool.getJedis();
    SysUser sysUser = (SysUser) request.getSession().getAttribute(R.LOGIN_USER);
    try {
        if (jedis.hexists(Rkey.USER_INFO, userId.toString())) {
            String hget = jedis.hget(Rkey.TURNTALE_NEXT_AWARD, userId.toString());
            if (StringUtils.isEmpty(hget)) {
                //第一次设置
                BsTurntableNextAward record = new BsTurntableNextAward();
                record.setAwardId(awardId);
                record.setState(0);
                record.setUserId(userId);
                record.setSysUser(sysUser.getUserName());
                turntableNextAwardMapper.insert(record);

                //修改必中商品的已抽取库存总量:extractAmount + 1
                turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);

                //新增操作,redis 对应商品总投放量加一
                jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);
                //操作数据库 商品对应投放库存加一 
                //下面这部分可以抽取为1个方法,选中这部分,按下快捷键 Ctrl + Alt + M,填写方法名称即可抽取
                Date now = new Date();
                String formatDate = DateUtil.formatDate(now, "yyyy-MM-dd HH:mm");
                BsTurntableActivity nowPeriodActivity = turntableActivityMapper.queryNowPeriodActivity(formatDate);
                String curActivityId = nowPeriodActivity.getId().toString();
                BsTurntableActivity turntableActivity = new BsTurntableActivity();
                turntableActivity.setId(curActivityId;
                if (nowPeriodActivity.getAwardId1().equals(awardId)) {
                    turntableActivity.setAmount1(nowPeriodActivity.getAmount1() + 1);
                } else if (nowPeriodActivity.getAwardId2().equals(awardId)) {
                    turntableActivity.setAmount2(nowPeriodActivity.getAmount2() + 1);
                } else if (nowPeriodActivity.getAwardId3().equals(awardId)) {
                    turntableActivity.setAmount3(nowPeriodActivity.getAmount3() + 1);
                } else if (nowPeriodActivity.getAwardId4().equals(awardId)) {
                    turntableActivity.setAmount4(nowPeriodActivity.getAmount4() + 1);
                } else if (nowPeriodActivity.getAwardId5().equals(awardId)) {
                    turntableActivity.setAmount5(nowPeriodActivity.getAmount5() + 1);
                } else if (nowPeriodActivity.getAwardId6().equals(awardId)) {
                    turntableActivity.setAmount6(nowPeriodActivity.getAmount6() + 1);
                }

            } else {
                //替换操作
                Integer oldAwardId = Integer.valueOf(hget);
                // 查询用户是否有 没有抽取的必中记录
                BsTurntableNextAward record = turntableNextAwardMapper.queryDataByUserAndState(userId, 0);
                if (record != null) {
                    record.setAwardId(awardId);
                    record.setSysUser(sysUser.getUserName());
                    turntableNextAwardMapper.updateByPrimaryKeySelective(record);

                    //修改之前设置的必中商品已抽取库存总量:extractAmount - 1
                    turntableAwardMapper.updateExtractAmountReduceOneByAwardId(oldAwardId);
                    //修改必中商品的已抽取库存总量:extractAmount + 1
                    turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);
                }

                //更新替换操作,原有商品总投放量减一
                jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, oldAwardId.toString(), -1);
                //更新替换操作,替换商品总投放量加一
                jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);


            }
            jedis.hset(Rkey.TURNTALE_NEXT_AWARD, userId.toString(), awardId.toString());
            //数据库
        } else {
            throw new BusiException(E.CUSTOM_ERROR_MSG, "用户不存在");
        }
    } finally {
        RedisPool.returnJedis(jedis);
    }
}

抽取之后,代码如下:

public void updateTurntableNextAward(Integer userId, Integer awardId, HttpServletRequest request) {
    //验证奖品
    BsTurntableAward award = turntableAwardMapper.selectByPrimaryKey(awardId);
    if (award == null) {
        throw new BusiException(E.INVALID_PARAMETER, "奖品不存在");
    }
    if (award.getState() != 1) {
        throw new BusiException(E.INVALID_PARAMETER, "奖品已停售");
    }

    Jedis jedis = RedisPool.getJedis();
    SysUser sysUser = (SysUser) request.getSession().getAttribute(R.LOGIN_USER);
    try {
        if (jedis.hexists(Rkey.USER_INFO, userId.toString())) {
            String hget = jedis.hget(Rkey.TURNTALE_NEXT_AWARD, userId.toString());
            if (StringUtils.isEmpty(hget)) {
                //第一次设置
                BsTurntableNextAward record = new BsTurntableNextAward();
                record.setAwardId(awardId);
                record.setState(0);
                record.setUserId(userId);
                record.setSysUser(sysUser.getUserName());
                turntableNextAwardMapper.insert(record);

                //修改必中商品的已抽取库存总量:extractAmount + 1
                turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);

                //新增操作,redis 对应商品总投放量加一
                jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);
                //操作数据库 商品对应投放库存加一
                //下面这部分可以抽取为1个方法,选中这部分,按下快捷键 Ctrl + Alt + M,填写方法名称即可抽取
                updateAmountAddOneWhenSettingBizhong(awardId);

            } else {
                //替换操作
                Integer oldAwardId = Integer.valueOf(hget);
                // 查询用户是否有 没有抽取的必中记录
                BsTurntableNextAward record = turntableNextAwardMapper.queryDataByUserAndState(userId, 0);
                if (record != null) {
                    record.setAwardId(awardId);
                    record.setSysUser(sysUser.getUserName());
                    turntableNextAwardMapper.updateByPrimaryKeySelective(record);

                    //修改之前设置的必中商品已抽取库存总量:extractAmount - 1
                    turntableAwardMapper.updateExtractAmountReduceOneByAwardId(oldAwardId);
                    //修改必中商品的已抽取库存总量:extractAmount + 1
                    turntableAwardMapper.updateExtractAmountAddOneByAwardId(awardId);
                }

                //更新替换操作,原有商品总投放量减一
                jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, oldAwardId.toString(), -1);
                //更新替换操作,替换商品总投放量加一
                jedis.hincrBy(Rkey.BRANCH_AWARD_ACTIVE_STOCK, awardId.toString(), 1);


            }
            jedis.hset(Rkey.TURNTALE_NEXT_AWARD, userId.toString(), awardId.toString());
            //数据库
        } else {
            throw new BusiException(E.CUSTOM_ERROR_MSG, "用户不存在");
        }
    } finally {
        RedisPool.returnJedis(jedis);
    }
}

// 操作数据库 设置必中 对应商品库存加一
private void updateAmountAddOneWhenSettingBizhong(Integer awardId) {
    Date now = new Date();
    String formatDate = DateUtil.formatDate(now, "yyyy-MM-dd HH:mm");
    BsTurntableActivity nowPeriodActivity = turntableActivityMapper.queryNowPeriodActivity(formatDate);
    String curActivityId = nowPeriodActivity.getId().toString();
    BsTurntableActivity turntableActivity = new BsTurntableActivity();
    turntableActivity.setId(curActivityId);
    if (nowPeriodActivity.getAwardId1().equals(awardId)) {
        turntableActivity.setAmount1(nowPeriodActivity.getAmount1() + 1);
    } else if (nowPeriodActivity.getAwardId2().equals(awardId)) {
        turntableActivity.setAmount2(nowPeriodActivity.getAmount2() + 1);
    } else if (nowPeriodActivity.getAwardId3().equals(awardId)) {
        turntableActivity.setAmount3(nowPeriodActivity.getAmount3() + 1);
    } else if (nowPeriodActivity.getAwardId4().equals(awardId)) {
        turntableActivity.setAmount4(nowPeriodActivity.getAmount4() + 1);
    } else if (nowPeriodActivity.getAwardId5().equals(awardId)) {
        turntableActivity.setAmount5(nowPeriodActivity.getAmount5() + 1);
    } else if (nowPeriodActivity.getAwardId6().equals(awardId)) {
        turntableActivity.setAmount6(nowPeriodActivity.getAmount6() + 1);
    }
    turntableActivityMapper.updateByPrimaryKeySelective(turntableActivity);
}

ps:
1.选中要提取的部分,按下快捷键 Ctrl + Alt + M,填写方法名称即可抽取
2.有可能提取的时候,提取的参数不够(不满足我们的期望),可以等提取结束后手动修改,加入需要的参数。

猜你喜欢

转载自blog.csdn.net/qq_22638399/article/details/81241124