
本文探讨了在java中如何重构具有相同业务逻辑但接受不同参数类型的多个方法。通过引入通用接口实现多态,或利用私有助手方法封装核心逻辑,可以有效消除代码冗余,提高代码的可维护性和可读性。文章将详细介绍这两种策略的实现方式及适用场景。
在软件开发中,我们经常会遇到这样的场景:多个方法执行着几乎相同的业务逻辑,但它们接受的输入参数类型却不尽相同。这种代码模式,虽然在功能上是正确的,但却引入了大量的代码重复,严重影响了代码的可维护性、可读性,并增加了未来修改时引入错误的风险。
考虑以下三个方法,它们都用于计算金额,但分别接受 QRequest、CState 和 RState 三种不同的请求对象:
public static String calculateAmount(QRequest qRequest) { if (qRequest.getValue() == null) { return "300_VALUE"; // 常量占位符 } // ... 其他核心逻辑 if (qRequest.getValue().getOptionalCodes().contains(125)) { return "125_VALUE"; } else if (qRequest.getValue().getOptionalCodes().contains(600)) { return "600_VALUE"; } else { return "300_VALUE"; }}public static String calculateAmount(CState cState) { if (cState.getValue() == null) { return "300_VALUE"; // 常量占位符 } // ... 其他核心逻辑 if (cState.getValue().getOptionalCodes().contains(125)) { return "125_VALUE"; } else if (cState.getValue().getOptionalCodes().contains(600)) { return "600_VALUE"; } else { return "300_VALUE"; }}public static String calculateAmount(RState rState) { if (rState.getValue() == null) { return "EXCESS_300_VALUE"; // 注意这里与前两者不同 } // ... 其他核心逻辑 if (rState.getValue().getOptionalCodes().contains(125)) { return "125_VALUE"; } else if (rState.getValue().getOptionalCodes().contains(600)) { return "600_VALUE"; } else { return "300_VALUE"; }}
可以看到,除了参数类型和 getValue() 返回的 Value 对象外,这些方法的内部逻辑几乎完全相同。这种重复是重构的理想目标。本文将介绍两种有效的重构策略来解决这个问题。
策略一:引入通用接口
当多个不相关的类共享相同的行为或数据访问方式时,引入一个通用接口是实现代码复用的最佳实践。这种方法利用了面向对象编程的多态特性。
立即学习“Java免费学习笔记(深入)”;
法语写作助手
法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。
31 查看详情
实现步骤
定义接口: 创建一个接口,声明所有相关类都应具备的公共方法。在这个例子中,所有请求对象都提供一个 getValue() 方法来获取核心的 ValueType 对象。
import java.util.Set;// 假设 ValueType 是一个具体的类,例如:class ValueType { private Set optionalCodes; // ... constructor and other methods public Set getOptionalCodes() { return optionalCodes; }}interface HasValue { ValueType getValue();}
实现接口: 让所有需要统一处理的类实现这个新定义的接口。
class QRequest implements HasValue { private ValueType value; // ... constructor and other methods @Override public ValueType getValue() { return value; }}class CState implements HasValue { private ValueType value; // ... constructor and other methods @Override public ValueType getValue() { return value; }}class RState implements HasValue { private ValueType value; // ... constructor and other methods @Override public ValueType getValue() { return value; }}
重构核心方法: 将原有的多个方法合并为一个,使其接受新定义的接口类型作为参数。
// 假设 ServiceException 是自定义的异常类class ServiceException extends RuntimeException { public ServiceException(String message) { super(message); }}// 假设常量已定义final class Constants { public static final String DEFAULT_300_VALUE = "300_VALUE"; public static final String EXCESS_300_VALUE = "EXCESS_300_VALUE"; // RState 特有的默认值 public static final String VALUE_125 = "125_VALUE"; public static final String VALUE_600 = "600_VALUE"; public static final int CODE_125 = 125; public static final int CODE_600 = 600;}public static String calculateAmount(HasValue hasValue) { ValueType value = hasValue.getValue(); // 处理 RState 特有的默认值逻辑 if (value == null) { if (hasValue instanceof RState) { return Constants.EXCESS_300_VALUE; } else { return Constants.DEFAULT_300_VALUE; } } Set optionalCodes = value.getOptionalCodes(); if (optionalCodes.contains(Constants.CODE_125) && optionalCodes.contains(Constants.CODE_600)) { throw new ServiceException("Multiple options received"); } if (optionalCodes.contains(Constants.CODE_125)) { return Constants.VALUE_125; } else if (optionalCodes.contains(Constants.CODE_600))
以上就是Java方法重构:通过接口或助手方法统一处理多参数类型逻辑的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/570816.html
微信扫一扫
支付宝扫一扫