专栏首页java达人方法参数过多怎么办

方法参数过多怎么办

我们在编程或阅读前人的代码时,经常会看到多个参数的方法,有的甚至达到二十个,看得人眼花缭乱,不便于阅读和维护,而且参数很容易混淆,如两个参数类型同为short型,传递时相互颠倒,编译期间内不会提示报错,如下面这个方法:

 public void updateUseInfo(String name, String cardNo, String phoneNunmber,String address, String edu, short age,short sex, 
 float height, float weight, Date birthday) {
 // 更新操作
 }

记忆术中有个“魔数之七”的说法,大多数人一次最多只能记忆7个独立的块,我们将短期记忆量控制在7个之内,将大大提高记忆效率,因此建议将方法参数控制在7个以内,在4个以内最好,但是需要传递的方法参数就那么多,该怎么办?

一种方法是将一个方法拆分成多个方法,每个方法传递少量参数,然而有时候这些参数需要同时被使用,我们也可以使用参数对象封装这些参数,如对上面方法进行改造:

class UserInfo {
 private String name;
 private String cardNo;
 private String phoneNunmber;
 private String address;
 private String edu;
 private short age;
 private short sex;
 private float height;
 private float weight;
 private Date birthday;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getCardNo() {
 return cardNo;
 }
 public void setCardNo(String cardNo) {
 this.cardNo = cardNo;
 }
 public String getPhoneNunmber() {
 return phoneNunmber;
 }
 public void setPhoneNunmber(String phoneNunmber) {
 this.phoneNunmber = phoneNunmber;
 }
 public String getAddress() {
 return address;
 }
 public void setAddress(String address) {
 this.address = address;
 }
 public String getEdu() {
 return edu;
 }
 public void setEdu(String edu) {
 this.edu = edu;
 }
 public short getAge() {
 return age;
 }
 public void setAge(short age) {
 this.age = age;
 }
 public short getSex() {
 return sex;
 }
 public void setSex(short sex) {
 this.sex = sex;
 }
 public float getHeight() {
 return height;
 }
 public void setHeight(float height) {
 this.height = height;
 }
 public float getWeight() {
 return weight;
 }
 public void setWeight(float weight) {
 this.weight = weight;
 }
 public Date getBirthday() {
 return birthday;
 }
 public void setBirthday(Date birthday) {
 this.birthday = birthday;
 }
}

新方法:

public void updateUseInfo(UserInfo uInfo) {

// 更新操作

}

参数对象对参数进行了封装,后期还可以往对象中添加新的相关参数,方便阅读,维护和功能扩展,但是需要花费一部分精力来设计这些对象,否则很容易被滥用。

比如你写一个方法,通过用户名称和证件号查询相关信息:

public void queryUserRelatedInfo(UserInfo uInfo){

//查询相关信息

}

这样写调用方不知道要往对象中设置哪些必要参数,实际上要使用这个方法,他还得进入方法内部查看实际使用了哪些参数,这个方法反而显得不够友好,如果直接改写为:

public void queryUserRelatedInfo(String name, String cardNo){

//查询相关信息

}

这个方法虽然多了个参数,但耦合度更低,对调用方更加友好。

随着用户信息的扩展,有的人会偷懒往userInfo对象中添加新的属性,如fatherName,motherName,这些属性缺乏紧密的联系,对象日渐庞大,整个就是一锅大杂烩,在可读性上反而不如直接传递基本类型参数的方法,这时候,我们需要对对象内部属性进行分类,将其中紧密联系的几个属性提取出来,构造成新的对象,如针对用户地址信息可以设计Address类,针对用户家人信息可以设计一个Family类,参数对象是一把双刃剑,关键是要考察代码实际情况,不滥用,要用就要提前设计好,用得恰到好处。

本文分享自微信公众号 - java达人(drjava),作者:卍极客

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Latke 快速上手指南

    欢迎投稿 黑客派作品 Latke 在设计原理上非常类似 Spring,是 Spring 的极简版,该文档适合 Java Web 应用 框架初学者 以及Latke...

    java达人
  • 运用适配器模式应对项目中的变化

    作者:张纪刚 链接: http://blog.csdn.net/zhangjg_blog/article/details/18779607 (点击文末阅读原文...

    java达人
  • 数据字典项实现方案

    在应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这些数据字典项一...

    java达人
  • Java微信公众平台开发(四)--回复消息的分类及实体的创建

    前面有说道对接收到微信服务器消息后对消息的分类,当时主要分为普通消息和事件消息,这里我们要讲述的是我们在给用户回复的消息类型,在这里也可以大致分为两类:一种为不...

    用户2417870
  • Java设计模式学习记录-建造者模式

    今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发...

    纪莫
  • Spring Boot 实现定时任务的动态增删启停等管理!

    在spring boot项目中,可以通过@EnableScheduling注解和@Scheduled注解实现定时任务,也可以通过SchedulingConfig...

    业余草
  • Java微信公众平台开发(三)--接收消息的分类及实体的创建

    前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实体以方便我们后面的使用!

    用户2417870
  • 18.手写Spring MVC

    Serviet 的生命周期由 init()到 service()再到 destory()组成, destory()方法我们 不做实现。

    编程之心
  • 设计模式(一) 支付策略模式

    公司最近在做直播功能,底层原来有一套直播API,现在新增一套网宿直播API。 考虑以后的扩展性,需要将两套API进行统一管理。现在以网上的支付方式演示我对策略模...

    用户1518699
  • 设计模式(一) 支付策略模式

    公司最近在做直播功能,底层原来有一套直播API,现在新增一套网宿直播API。 考虑以后的扩展性,需要将两套API进行统一管理。现在以网上的支付方式演示我对策略模...

    用户1518699

扫码关注云+社区

领取腾讯云代金券