buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

【重构的哲学】这个方法调用,我们怎么重构?AI不一定能告诉你!

先上代码。下面代码来自于某外部通道的接口对接实现类,功能是请求该外部通道的查单接口并返回查单结果。

public Result<RechargeResultVO> queryOrder(String orderNo) {

    JSONObject json = ... // 请求通道查单接口

    RechargeResultVO rechargeResultVO = new RechargeResultVO();

    rechargeResultVO.setOrderNo(json.get("sporder_id"));
    rechargeResultVO.setChannelOrderNo(json.get("orderid"));
    rechargeResultVO = checkResult(json, rechargeResultVO);

    return Result.success(rechargeResultVO);
}

public RechargeResultVO checkResult(JSONObject json, RechargeResultVO rechargeResultVO) {
  // 如果充值成功将为1  撤销(充值失败)为9  充值中为0
    switch (json.get("game_state")){
        case "1" :
            rechargeResultVO.setOrderStatus(IPSFStatusEnum.SUCCESS);
            break;
        case "9" :
            rechargeResultVO.setOrderStatus(IPSFStatusEnum.FAIL);
            break;
        default:
            rechargeResultVO.setOrderStatus(IPSFStatusEnum.PROCESSING);
            break;
    }
    return rechargeResultVO;
}

 

 

这段代码的逻辑并不复杂,理解起来也不难。不过,这里面确实存在着一些值得重构的事项。关于  checkResult  方法,你有哪些重构建议呢?

 


重构项1:
checkResult 的第2个参数 rechargeResultVO 是引用类型。
重构项2:
从 checkResult 的方法实现来看,它的职责是 根据 game_state 的不同情况,来给 rechargeResultVO 的 orederStatus 赋值。因此,可以重命名为 convertStatus,以更准确地反映其功能。
重构项3:
关于 checkResult 的第1个参数, 结合方法实现可以看出来, 并不需要传一个json对象, 而是 gameState 变量 就足够了。

 

经过以上3项分析,重构后的代码如下。

public Result<RechargeResultVO> queryOrder(String orderNo) {

    JSONObject json = ... // 请求通道查单接口

    RechargeResultVO rechargeResultVO = new RechargeResultVO();

    rechargeResultVO.setOrderNo(json.get("sporder_id"));
    rechargeResultVO.setChannelOrderNo(json.get("orderid"));
    convertStatus(json.get("game_state"), rechargeResultVO);

    return Result.success(rechargeResultVO);
}

public void convertStatus(String gameState, RechargeResultVO rechargeResultVO) {
  // 如果充值成功将为1  撤销(充值失败)为9  充值中为0
    switch (gameState){
        case "1" :
            rechargeResultVO.setOrderStatus(IPSFStatusEnum.SUCCESS);
            break;
        case "9" :
            rechargeResultVO.setOrderStatus(IPSFStatusEnum.FAIL);
            break;
        default:
            rechargeResultVO.setOrderStatus(IPSFStatusEnum.PROCESSING);
            break;
    }
}

 

 

关于这段代码,你觉得还有哪些地方需要重构的呢?欢迎交流。

 

是的。上面代码还可以提出重构建议:convertStatus 可以不需要 第2个参数。 而是 直接返回 转换后的状态值。另外,convertStatus 可以是 static。这时,重构后的代码如下。是不是更棒了呢!

public Result<RechargeResultVO> queryOrder(String orderNo) {

    JSONObject json = ... // 请求通道查单接口

    RechargeResultVO rechargeResultVO = new RechargeResultVO();

    rechargeResultVO.setOrderNo(json.get("sporder_id"));
    rechargeResultVO.setChannelOrderNo(json.get("orderid"));
    rechargeResultVO.setOrderStatus(convertStatus(json.get("game_state")));

    return Result.success(rechargeResultVO);
}

public static IPSFStatusEnum convertStatus(String gameState) {
  // 如果充值成功将为1  撤销(充值失败)为9  充值中为0
switch (gameState){ case "1" : return IPSFStatusEnum.SUCCESS; case "9" : return IPSFStatusEnum.FAIL; default: return IPSFStatusEnum.PROCESSING; } }

 


关于这段代码,你觉得还有哪些地方需要重构的呢?欢迎交流。

posted on 2024-04-02 09:00  buguge  阅读(69)  评论(0编辑  收藏  举报