代码重构之重构过长的参数列表

简介: 如何处理过长的函数参数列表
一个函数,往往都需要接收参数,通过参数去完成某些事情,在<<代码整洁之道>>中,作者提出,一个函数的参数应该尽可能的短,最好只有一个,其次是两个,如果出现三个及其以上的参数,那你应该引起注意了。那么如果拿到一段长参数的函数我们应该怎么办?如何去重构呢?

一、过长参数的定义

方法的参数过多,或者存在不必要的参数。

二、过长参数带来的影响

方法不易被理解和使用,方法不稳定,难以维护

三、重构方法

  • 以查询或者计算取代参数:如果参数列表中的某些参数,可以通过现有的其他参数计算得出,那计算的参数就可以省略掉,比如得到一个人的出生日期就能推算出他的年龄。

如下代码是计算某个演出票的基本信息,票只有符合年龄范围才能购买,学生和儿童票有优惠。Performance对象里是演出的基本信息,里面包含了basicPrice基本票价,所以此方法可以去掉basicPrice参数,改成直接从Performance获取

 /**
     * 获取票据信息
     * 
     * @param name 姓名
     * @param age 年龄
     * @param isChild 是否儿童
     * @param isStudent 是否学生
     * @param ageFloor 年龄上限
     * @param ageCeiling 年龄下限
     * @param performance 演出信息
     * @param basicPrice 基本票价
     * @return 票据信息
     */
    public String getTicketInfo(String name, int age, boolean isChild, boolean isStudent, int ageFloor, int ageCeiling,
        Performance performance, double basicPrice) {
        if ((age < ageFloor || age > ageCeiling)) {
            throw new IllegalArgumentException("age is out of valid range, cannot buy ticket!");
        }

        return getPerformanceInfo(performance)
            + getConsumerInfo(name, age, isStudent, isChild)
            + getPriceInfo(isChild, isStudent, basicPrice);
    }

在这里插入图片描述

  • 保持对像的完整:有时候,一个函数的参数,可能就是一个对象的成员变量,为什么不干脆用这个对象做参数呢?下面的函数中,原本是传入年龄的上限和下线,但其他地方其实有相关的对象,那干脆直接用已经定义好的对象就行了。

在这里插入图片描述

  • 引入参数对象,函数中的某些参数,可以自己手动封装到一个对象中,如下,参数中有很多自动都是用户相关的信息,所以重构的时候通过新增一个用户类去简化这些参数

在这里插入图片描述

  • 移动函数到合适的类,将一些参数封装到对象之后,如果某些操作是根据封装的那些字段处理的,不如把这个函数也移动到刚刚封装的对象里边。

在这里插入图片描述

  • 移除标记参数,某些入参属于标记,根据入参执行两种不同的代码逻辑,可以考虑使用三目运算符简化参数

在这里插入图片描述

相关文章
|
SQL 数据可视化 Java
DBeaver数据库可视化工具
DBeaver数据库可视化工具
1026 3
|
IDE Java 测试技术
Mockito 应用指南
Mockito 是一个针对 Java 的 mock 框架。
315 0
postman 传入不同组参数循环调用接口
postman 传入不同组参数循环调用接口
1970 0
postman 传入不同组参数循环调用接口
Postman - 快速分享接口
Postman - 快速分享接口
2207 0
Postman - 快速分享接口
|
缓存 Java Maven
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法!在处理Maven项目问题时,首先检查Maven配置是否正确。接着通过“File--Invalidata Caches”清除IDEA缓存并重启。使用Maven命令`mvn dependency:purge-local-repository`和`mvn dependency:resolve`清除本地依赖缓存。最后,在Terminal中输入`mvn clean install`完成构建。
4163 1
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法
|
开发工具
代码重构之重复代码处理
介绍使用IDEA去重构重复的代码块
代码重构之重复代码处理
|
存储 安全 网络安全
云计算与网络安全:技术融合下的安全挑战与对策
随着云计算技术的飞速发展,其在提供便利和效率的同时,也带来了前所未有的安全风险。本文将深入分析云计算服务中的网络安全威胁,并探讨信息安全领域的应对策略,以期为云服务用户提供一个更加安全的网络环境。
|
消息中间件 存储 Java
图解Kafka:Kafka架构演化与升级!
图解Kafka:Kafka架构演化与升级!
721 0
图解Kafka:Kafka架构演化与升级!
|
前端开发 Java API
看看人家那后端API接口写得,那叫一个优雅!
本文详细介绍了如何构建一个规范且优雅的后端接口体系,包括使用Spring Boot及相关的依赖包。文章首先讨论了参数校验的不同方法,推荐使用Spring Validator和Hibernate Validator进行高效且规范的校验。接着介绍了如何利用全局异常处理机制来统一处理各种异常情况,包括自定义异常的使用。此外,还提出了数据统一响应的概念,通过自定义响应体和响应码枚举来确保前后端交互的一致性和规范性。最后,通过全局处理响应数据进一步简化了接口的响应封装流程。整体而言,这些实践有助于提升后端接口的质量和开发效率。
|
Java API Maven
如何定位、解决maven依赖冲突问题
如何定位、解决maven依赖冲突问题
811 0
如何定位、解决maven依赖冲突问题