方法参数过多怎么办
我们在编程或阅读前人的代码时,经常会看到多个参数的方法,有的甚至达到二十个,看得人眼花缭乱,不便于阅读和维护,而且参数很容易混淆,如两个参数类型同为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类,参数对象是一把双刃剑,关键是要考察代码实际情况,不滥用,要用就要提前设计好,用得恰到好处。
- CDA数据分析师学习之路第3期 | Spark RDD的转换操作举例
- 通过Temboo实现从Arduino获取雅虎天气信息
- 自动化模式中的MySQL
- 通过Pandas实现快速别致的数据分析
- R语言中的非线性分类
- 用SPSS做数据分析?先弄懂SPSS的基础知识吧
- 学习笔记CB001:NLTK库、语料库、词概率、双连词、词典
- 时序列数据库武斗大会之 OpenTSDB 篇
- 应当使用 SQLite 的五个原因
- Apache Spark作为编译器:深入介绍新的Tungsten执行引擎
- DC/OS 的安装与部署
- Go语言实践:从新手入门到上线真实的小型服务所遇到的那些坑
- 4个简单的数据管理技巧
- MongoDB的设计模式策略
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入了解Python 变量作用域
- Laravel5.5 数据库迁移:创建表与修改表示例
- python代码能做成软件吗
- php适配器模式简单应用示例
- Python 解析简单的XML数据
- Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
- Python分类测试代码实例汇总
- Swoole 5将移除自动添加Event::wait()特性详解
- laravel 数据验证规则详解
- JS操作XML中DTD介绍及使用方法分析
- PHP设计模式之迭代器(Iterator)模式入门与应用详解
- PHP FileSystem 文件系统常用api整理总结
- laravel框架之数据库查出来的对象实现转化为数组
- php apache开启跨域模式过程详解
- laravel5.6实现数值转换