重构 - java方法参数太多怎么办2

本文探讨了方法参数过多的问题,分析其导致的复杂性和可读性下降,并提供了实用策略来简化方法调用,提高代码质量和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过bob 之前 重构 - java方法参数太多怎么办1,看的我想哭 的一篇文章,大家可以看到 方法参数太多带来的问题

  1. 方法的复杂性上升
  2. 方法的可读性下降
  3. 调用方法容易出错,不易使用等等

当然我们也可以使用一些简单有效方法,来减少参数个数,增强代码的可读性并且降低调用出错的概率

下面是bob在工作中通过不断阅读借鉴和实践整理的方法论,供大家参考。
bob 解读
欢迎大家转发分享,继续关注bob。

/* * 原始需求背景: * 网宿CDN要按月收取客户的服务费用,根据流量的大小、 * 服务的类型等,收取不同的费用,收费规则如下: * web应用:1000元/M * 流媒体应用:1000元/M*0.7 * 下载应用:1000元/M*0.5 * 月末打印报表时,要罗列每个用户每个频道的费用、客户总费用, * 还要打印该客户的重要性指数,重要性指数=网页流/100+下载流量/600; * * 需求变更场景: * 系统已经开发出来了,接下来,运维部门现在希望对系统做一点修改, * 首先,他们希望能够输出xml,这样可以被其它系统读取和处理,但是, * 这段代码根本不可能在输出xml的代码中复用report()的任何行为,唯一 * 可以做的就是重写一个xmlReport(),大量重复report()中的行为,当然, * 现在这个修改还不费劲,拷贝一份report()直接修改就是了。 * 不久,成本中心又要求修改计费规则,于是我们必须同时修改xmlReport() * 和report(),并确保其一致性,当后续还要修改的时候,复制-黏贴的问题就 * 浮现出来了,这造成了潜在的威胁。 * 再后来,客服部门希望修改服务类型和用户重要性指数的计算规则, * 但还没决定怎么改,他们设想了几种方案,这些方案会影响用户的计费规则, * 程序必须再次同时修改xmlReport()和report(),随着各种规则变得越来越复杂, * 适当的修改点越 来越难找,不犯错误的机会越来越少。 * 现在,我们运用所学的OO原则和方法开始进行改写吧。 */
### Java 方法中处理过多参数的策略 当面对Java方法中有太多参数的情况时,可以考虑几种不同的重构技术来提高代码可读性和维护性。 #### 使用构建者模式 对于具有参数方法调用,尤其是其中许可能是可选的情况下,采用构建者模式是一种常见做法。通过创建内部静态类作为原对象的建造器,在这个过程中逐步设置各个属性值,最终完成实例化过程[^1]。 ```java public class AlbumBuilder { private String title; private int year; private Artist artist; public static class Builder { private final String title; public Builder(String title) { this.title = title; } public Builder setYear(int year) { this.year = year; return this; } public Builder setArtist(Artist artist){ this.artist = artist; return this; } public Album build() { return new Album(this); } } private Album(Builder builder) { title = builder.title; year = builder.year; artist = builder.artist; } } ``` #### 参数对象模式 另一种有效的方式是引入参数对象(Parameter Object)。这涉及到定义一个新的类用来封装一组相关联的数据成员,并以此单一实体形式传递给目标函数或方法。这种方法不仅简化了接口设计还增强了模块间的解耦合度[^2]。 ```java class AlbumStatsParams { private ToLongFunction<Album> featureExtractor; public AlbumStatsParams(ToLongFunction<Album> extractor) { this.featureExtractor = extractor; } // Getters and Setters... } // Usage example: long totalDuration = calculateTotalFeature(albums, new AlbumStatsParams(Album::getDuration)); ``` #### 函数式编程特性应用 利用Java 8之后版本所提供的Lambda表达式和函数接口如`ToLongFunction<T>`等特性也可以帮助减少显式的参数数量。例如,可以通过接受泛型化的功能接口代替具体类型的参数列表,从而让API更加灵活通用[^3]。 ```java import java.util.List; import java.util.function.ToLongFunction; public long sumFeatures(List<Album> albums, ToLongFunction<Album> propertySelector) { return albums.stream().mapToLong(propertySelector).sum(); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值