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

[复制链接]
发表于 2024-5-16 03:51:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
先上代码。
  1. public Result<RechargeResultVO> queryOrder(String orderNo) {
  2.     JSONObject json = ... // 查询外部通道
  3.     RechargeResultVO rechargeResultVO = new RechargeResultVO();
  4.     rechargeResultVO.setOrderNo(json.get("sporder_id"));
  5.     rechargeResultVO.setChannelOrderNo(json.get("orderid"));
  6.     rechargeResultVO = checkResult(json, rechargeResultVO);
  7.     return Result.success(rechargeResultVO);
  8. }
  9. public RechargeResultVO checkResult(JSONObject json, RechargeResultVO rechargeResultVO) {<br>  // 如果充值成功将为1  撤销(充值失败)为9  充值中为0
  10.     switch (json.get("game_state")){
  11.         case "1" :
  12.             rechargeResultVO.setOrderStatus(IPSFStatusEnum.SUCCESS);
  13.             break;
  14.         case "9" :
  15.             rechargeResultVO.setOrderStatus(IPSFStatusEnum.FAIL);
  16.             break;
  17.         default:
  18.             rechargeResultVO.setOrderStatus(IPSFStatusEnum.PROCESSING);
  19.             break;
  20.     }
  21.     return rechargeResultVO;
  22. }
复制代码
 
这段代码的逻辑并不复杂,理解起来也不难。不过,这内里确实存在着一些值得重构的事项。
 

重构项1:
checkResult 的第2个参数 rechargeResultVO 是引用范例。
重构项2:
从 checkResult 的方法实现来看,它的职责是 根据 game_state 的差异情况,来给 rechargeResultVO 的 orederStatus 赋值。因此,可以重定名为 convertStatus,以更正确地反映其功能。
重构项3:
关于 checkResult 的第1个参数, 联合方法实现可以看出来, 并不需要传一个json对象, 而是 gameState 变量 就充足了。
 
经过以上3项分析,重构后的代码如下。
  1. public Result<RechargeResultVO> queryOrder(String orderNo) {
  2.     JSONObject json = ... // 查询外部通道
  3.     RechargeResultVO rechargeResultVO = new RechargeResultVO();
  4.     rechargeResultVO.setOrderNo(json.get("sporder_id"));
  5.     rechargeResultVO.setChannelOrderNo(json.get("orderid"));
  6.     convertStatus(json.get("game_state"), rechargeResultVO);
  7.     return Result.success(rechargeResultVO);
  8. }
  9. public void convertStatus(String gameState, RechargeResultVO rechargeResultVO) {<br>  // 如果充值成功将为1  撤销(充值失败)为9  充值中为0
  10.     switch (gameState){
  11.         case "1" :
  12.             rechargeResultVO.setOrderStatus(IPSFStatusEnum.SUCCESS);
  13.             break;
  14.         case "9" :
  15.             rechargeResultVO.setOrderStatus(IPSFStatusEnum.FAIL);
  16.             break;
  17.         default:
  18.             rechargeResultVO.setOrderStatus(IPSFStatusEnum.PROCESSING);
  19.             break;
  20.     }
  21. }
复制代码
 
 
关于这段代码,你以为还有哪些地方需要重构的呢?欢迎交流。
 
是的。上面代码还可以提出重构建议:convertStatus 可以不需要 第2个参数。 而是 直接返回 转换后的状态值。另外,convertStatus 可以是 static。这时,重构后的代码如下。是不是更棒了呢!
  1. public Result<RechargeResultVO> queryOrder(String orderNo) {
  2.     JSONObject json = ... // 查询外部通道
  3.     RechargeResultVO rechargeResultVO = new RechargeResultVO();
  4.     rechargeResultVO.setOrderNo(json.get("sporder_id"));
  5.     rechargeResultVO.setChannelOrderNo(json.get("orderid"));
  6.     rechargeResultVO.setOrderStatus(convertStatus(json.get("game_state")));
  7.     return Result.success(rechargeResultVO);
  8. }
  9. public static IPSFStatusEnum convertStatus(String gameState) {<br>  // 如果充值成功将为1  撤销(充值失败)为9  充值中为0
  10.     switch (gameState){
  11.         case "1" :
  12.             return IPSFStatusEnum.SUCCESS;
  13.         case "9" :
  14.             return IPSFStatusEnum.FAIL;
  15.         default:
  16.             return IPSFStatusEnum.PROCESSING;
  17.     }
  18. }
复制代码
 

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

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表