java中方法的命名_Java方法中的参数太多,第5部分:方法命名

java中方法的命名

在上一篇文章 (有关处理Java方法中过多参数的系列文章的 第4部分 )中,我将方法重载视为一种向客户提供需要较少参数的版本的方法或构造函数的方法。 我描述了该方法的一些缺点,并建议从方法重载中摆脱出来以使用不同名称的方法至少可以部分解决这些缺点。 在本文中,我将更深入地探讨如何使用仔细的方法命名(包括构造方法)来删除冗长的参数列表并避免方法重载的某些问题。

从减少方法和构造函数调用中所需的参数数量的角度来看,与方法重载相关的一些最重要的问题围绕着对大量参数可以重载相同方法名多少次的限制,尤其是在某些情况下的参数共享相同的数据类型。 例如,如果我有一个具有三个String属性的类,并且想编写三个构造函数以分别仅接受这些属性之一,那么我真的不能通过方法重载来做到这一点。 如果我尝试过,则必须将接受单个String的构造函数用于这三个属性之一,并且只有Javadoc注释才能解释单参数构造函数设置的三个属性中的哪一个。 摆脱对所有方法和构造方法使用相同名称的限制,可以使代码在预期和假定参数方面更具表现力。

下面的代码清单包含各种方法的一些示例,这些方法要求一个独立的类(不是Person类)提供Person的实例(在我之前的文章中引用的有关太多Java参数的类)。 这些方法的名称很长,描述了有关参数预期的内容。 这意味着在Javadoc注释中需要描述的内容更少,方法的调用对客户端更易读,并且与方法重载相比,可以支持更多的可能性和参数排列。

命名方法的示例以描述其功能

public Person createPersonWithFirstAndLastNameOnly(final String firstName, final String lastName){// implementation goes here ...}public Person createEmployedHomeOwningFemale(final FullName name, final Address address){// implementation goes here ...}public Person createEmployedHomeOwningMale(final FullName name, final Address address){// implementation goes here ...}public Person createUnemployedHomeOwningFemale(final FullName name, final Address address){// implementation goes here ...}public Person createEmployedRentingMale(final FullName name, final Address address){// implementation goes here ...}

上面代码中显示的较长的方法名称具有描述性,可为客户端提供一个良好的起点,让他们知道要提供哪些参数。 当然,我可以编写更多类似上述方法的方法来介绍参数的各种排列,但是我列出的小集合可以说明这一点。 注意,在这些代码示例中,我还使用了参数对象 (在我的参数对象文章中定义的FullNameAddress )来进一步减少参数的数量。

我上面的代码示例演示了为实例方法提供不同的描述性名称,以暗示要传递的参数,甚至在某些情况下还暗示不需要提供哪些参数,因为它们隐含在方法名称中。 Java的新手可能会认为此方法不能与对象实例化/构造一起使用,因为Java类构造函数必须使用与该类相同的名称来命名。 这意味着只能基于方法签名重载构造函数。 幸运的是, Josh Bloch在Effective Java的两个版本的第一篇中谈到了这一点。 正如Bloch在此处所述,我们可以采用静态初始化工厂方法来提供类的实例。 Bloch在第1项中引用的好处之一是能够按我们认为合适的方式命名这些方法。

下一个代码清单演示了这些静态初始化工厂的功能。 当我实现这些时,我喜欢实现仅由静态初始化工厂调用的一个或很少数量的private构造函数(无法由外部类实例化)。 这使我可以将构造函数的方法签名留给潜在的不足,因为只有我的类必须使用它,而其他人使用的静态初始化工厂更易于使用,并且隐藏了许多参数构造函数的丑陋之处。 更具体地说,如果构造函数对可选参数采用null,则可以编写各种静态初始化工厂,以便我的客户端不需要传递null,但是我的工厂方法可以将null传递给构造函数。 简而言之,静态初始化工厂方法使我能够为客户端提供更简洁,更愉悦的界面,并在类的内部隐藏丑陋之处。 由于无法用解释性细节给它们命名,因此我不能轻松地直接为它提供多个构造函数。 这些静态初始化方法的另一个优点是,如果需要,我可以让它们接受“原始”类型并将其内置到自定义类型和参数对象中。 所有这些情况在下一个代码清单中显示。

静态初始化工厂展示

/*** Parameterized constructor can be private because only my internal builder* needs to call me to provide an instance to clients.* * @param newName Name of this person.* @param newAddress Address of this person.* @param newGender Gender of this person.* @param newEmployment Employment status of this person.* @param newHomeOwner Home ownership status of this person.*/private Person(final FullName newName, final Address newAddress,final Gender newGender, final EmploymentStatus newEmployment,final HomeownerStatus newHomeOwner){this.name = newName;this.address = newAddress;this.gender = newGender;this.employment = newEmployment;this.homeOwnerStatus = newHomeOwner;}public static Person createInstanceWithNameAndAddressOnly(final FullName newName, final Address newAddress){return new Person(newName, newAddress, null, null, null);}public static Person createEmployedHomeOwningFemale(final FullName newName, final Address newAddress){return new Person(newName, newAddress, Gender.FEMALE, EmploymentStatus.EMPLOYED, HomeownerStatus.HOME_OWNER);}public static Person createEmployedHomeowningMale(final FullName newName, final Address newAddress){return new Person(newName, newAddress, Gender.MALE, EmploymentStatus.EMPLOYED, HomeownerStatus.HOME_OWNER);}public static Person createUnemployedMaleRenter(final FullName newName, final Address newAddress){return new Person(newName, newAddress, Gender.MALE, EmploymentStatus.NOT_EMPLOYED, HomeownerStatus.RENTER);}public static Person createPersonWithFirstNameLastNameAndAddress(final Name newFirstName, final Name newLastName, final Address newAddress){return new Person(new FullName.FullNameBuilder(newLastName, newFirstName).createFullName(),newAddress, null, null, null);}public static Person createPersonWithFirstNameLastNameAndAddress(final String newFirstName, final String newLastName, final Address newAddress){return new Person(new FullName.FullNameBuilder(new Name(newLastName), new Name(newFirstName)).createFullName(),newAddress, null, null, null);}

如以上示例所示,这些方法的客户可以使用可读性强的方法,而不必担心提供大量参数。 前面的代码清单中的最后两个方法是将方法重载与静态初始化工厂方法结合在一起的示例。

优势与优势

使用适当命名的方法(在这些方法的名称中包含有关预期参数和隐含参数的信息)会带来一些优于简单方法/构造函数重载的优点。 由于可以根据每种方法的预期和假设自定义方法的名称,因此调用代码的意图更加清晰。 如上面的示例所示,这些方法可能意味着不需要显式提供哪些参数,因为它们被假定为该方法的一部分(并且意图是通过方法的名称而不是通过Javadoc进行通信的)。

在这里,我没有明确地关注它,但是与简单的方法重载相比,精心选择的方法名称的另一个优点是能够在方法名称中包含单元或其他上下文信息。 例如,我可以提供setWholeLengthInMeters(int)setFractionalLengthInFeet(double)方法,而不是使用接受intdouble setLength()方法。

成本与劣势

使用不同命名的实例方法和静态初始化工厂方法肯定比方法重载提供了一些优势,但是不幸的是,从参数减少的角度来看,仍然具有方法重载的一些缺点。 不同名称的方法与重载方法共享的一个缺点是可能必须编写许多方法来支持可能使用的参数的各种组合和排列。 如果在以上示例中仅针对性别,房主身份和就业身份的每种组合编写了一种方法,则将需要八个方法(第2到第3次幂)。 如果任何一个单独的参数可以具有2种以上的可能性,则命名方法的不同组合的数量仅用于处理该增加的不同可能性。 当然,没有有限可能性的参数不能为每个可能的值编写方法,因此必须传入而不是假定。

尽管描述性很强的方法名称很容易阅读,但是拥有很多潜在方法名称的问题可能会降低总体可读性,因为客户端在调用类时必须经过一长串方法。 同样,有些人可能不喜欢长的方法名称以及在屏幕上占用大量空间。 我个人不介意长名,因为我认为它们提供的可读性值得在屏幕上添加其他文本。 IDE和代码完成功能意味着很少有人再输入这些名称,并且开发人员使用了很多监视器,这使得长方法名称的问题不再那么麻烦。

结论

方法的名称可用于向客户传达重要意义。 在我们努力澄清要传递给特定方法的参数(包括减少参数数量)的情况下,适当地命名方法可以隐含默认设置,从而无需提供参数,并且可以解释参数的顺序和其他特征。其他确实需要应用的参数。

参考: Java方法中的参数太多,第5部分: JCG合作伙伴 Dustin Marx在《 实际事件的启发》博客上的方法命名 。

翻译自: https://www.javacodegeeks.com/2013/10/too-many-parameters-in-java-methods-part-5-method-naming.html

java中方法的命名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle lms进程 内存,Oracle RAC 内存融合(Cache Fusion)

原标题:Oracle RAC 内存融合(Cache Fusion)内存融合核心进程LMS(Global Cache Service Process):这个进程负责完成GCS的大部分工作,它会维护GRD中数据块资源的信息,完成数据块在实例之间的传递工作,相关消息的发送和接…

sougou ubuntu 优麒麟_搜狗输入法 Linux – V2.3 版发布,完美适配优麒麟 19.10

搜狗输入法 Linux – V2.3 版发布,完美适配优麒麟 19.10fenshezhuiyi2 2019年10月19日 暂无评论 阅读 4,346 次昨天已发布优麒麟操作系统 19.10 版本,该版本集成了全新的控制面板和软件商店,不知道大家是否已下载体验。今天小编要为大家介绍一…

oracle多条sql语句常量,如何在Oracle中一次执行多条sql语句

有时我们需要一次性执行多条sql语句,而用来更新的sql是根据实际情况用代码拼出来的解决方案是把sql拼成下面这种形式:beginupdate TB_VG set seq 1, vessel_id Jin14, vessel_type TRACK where batch_number 20837 and train_id 0233086;update TB_…

JDK 11:新的默认收集方法toArray(IntFunction)

“ JDK 11 Early-Access发行说明 ”表明JDK 11的Early Access Build 20在Collection接口上包括一个新的默认方法 ,该方法 “允许将集合的元素转移到所需运行时类型的新创建的数组中”。 这个新的默认方法 [ Collection.toArray(IntFunction) …

获取清空textarea的文字内容_运用|你会做 词云图(文字云) 吗?

词云图,也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者只要一眼扫过文本就可领略文本的主旨。今天,兰色就分享一下词云图的做法。制作步骤:1、打开词云图网站打开网页https://wordart…

oracle today函数,oracle日期函数集锦

一、 常用日期数据格式1.Y或YY或YYY 年的最后一位,两位或三位SQL> Select to_char(sysdate,Y) from dual;TO_CHAR(SYSDATE,Y)--------------------7SQL> Select to_char(sysdate,YY) from dual;TO_CHAR(SYSDATE,YY)---------------------07SQL> Select to_…

kali查看共享 linux_在Linux下访问Windows共享文件夹

在Linux下访问Windows共享文件夹说明以下操作以Ubuntu为例,大家可以参考。我在Ubuntu 14.04和16.04都试过了。Windows共享文件夹如果局域网内有一台Windows主机,将指定文件夹设为共享,就可以在局域网内访问了。如果要从Linux下访问该如何操作…

oracle 11gdata guard,Oracle 11g Data Guard配置

操作环境说明:两台服务器使用相同的Redhat 5.5内核版本为:2.6.18-194.el5在主库(primary database)中提前安装好了Oracle 11gR2软件,通过DBCA创建了数据库,实例名为PRIMARY备库(standby database)中只安装了Oracle 11gR2软件&…

java 可变参数方法_Java方法中的参数太多,第7部分:可变状态

java 可变参数方法在我的系列文章的第七篇中,有关解决Java方法或构造函数中过多参数的问题 ,我着眼于使用状态来减少传递参数的需要。 我等到本系列的第七篇文章来解决这个问题的原因之一是,它是我最不喜欢的减少传递给方法和构造函数的参数的…

联想笔记本e480恢复出厂设置_联想e480进入bios设置_thinkpade480进入bios的方法

ThinkPad E480笔记本win10改win7如何修改BIOS设置?想要将预装win10系统换成win7系统,最重要的一步就是修改bios设置,这样才能在装机过程中不受到报错困扰,所以今天快启动小编为大家分享了详细图文教程,一起来看看吧。ThinkPad E4…

oracle一页显示15行,oracle rownum分页与显示记录小测

同事问及关于rownum表记录不显示问题,经查阅官方手册,附上测试笔记:SQL> insert into t_rownum select level from dual connect by level<5;5 rows insertedSQL> commit;Commit completeSQL> select * from t_rownum;A---------------------------------------123…

自动化用户特定实体的访问控制

实际上&#xff0c;每个Web应用程序都应该有多个用户&#xff0c;每个用户都有一些数据-帖子&#xff0c;文档&#xff0c;消息等等。 最明显的事情是保护这些实体免遭非这些资源合法所有者的用户获取。 不幸的是&#xff0c;这不是最容易的事情。 我并不是说很难&#xff0c;…

sqlserver安装显示句柄无效_Sqlserver 2016 R Service环境安装的各种错误(坑)解决办法...

相信很多朋友都会慕名Sqlserver 2016的R语言功能&#xff0c;将自己的数据库升级到Sqlserver 2016&#xff0c;但是当你安装完Sqlserver 2016的R语言组件之后&#xff0c;你会发现并不能直接使用&#xff0c;比如当你在SSMS中执行下面这段测试R语言命令的时候&#xff0c;Sqlse…

oracle用一个字段往上递归,深入sql oracle递归查询

获取数据库所有表名&#xff0c;表的所有列名 select name from sysobjects where xtypeuselect name from syscolumns where id(select max(id) from sysobjects where xtypeu and name表名)查询数据sql语句里的递归查询 sqlServer2005和Oracle 两个版本以前使用Oracle&#x…

如何在Spring Boot App中集成H2数据库

你好朋友&#xff0c; 在本教程中&#xff0c;我们将尝试探索如何在Spring Boot应用程序中与H2数据库集成。 在进行检查之前&#xff0c;让我们了解有关H2数据库的一些基础知识&#xff0c;如下所述&#xff0c;然后我们将讨论H2数据库与Spring Boot的集成。 什么是H2数据库…

python在路径里添加变量_想学Python?那就先从头开始吧!

作为人工智能和大数据时代最具竞争力的 Python 语言&#xff0c;越来越多的出现在各大编程热搜排行榜上。首先你要了解什么是python了解Python语言Python是一种解释型, 面向对象, 动态数据类型的高级程序设计语言.Python由Guido van Rossum&#xff08;荷兰&#xff09; 于1989…

php生成16位不重复随机码,PHP n个不重复的随机数生成代码

复制代码代码如下://range是将1到100列成一个数组$numbersrange(1,100);//shuffle将数组顺序随即打乱shuffle($numbers);//array_slice取该数组中的某一段$no6;$resultarray_slice($numbers,0,$no);for($i0;$iecho$result[$i]."";}print_r($result);?>复制代码代…

ant 走马灯面板指示显示不出来_触摸屏报警信息显示设置方法

人机界面(HMI)是自动化设备中非常常用的器件&#xff0c;用于替代操作面板上的实体按钮或者显示指示。人机界面的适用极大的减小了设备操作面板的尺寸&#xff0c;提升了设备的整体美观度。随着自动化设备的自动化程度的提高&#xff0c;也对设备的报警信息提出了更高的要求。如…

oracle bbed 使用,Oracle BBED使用 四步快速启动Oracle BBED

Oracle BBED使用&#xff0c;四步快速启动Oracle BBED&#xff0c;环境&#xff1a;Oracle 10g RHEL 5.8&#xff0c;介绍&#xff1a;BBED全称为数据块浏览和编辑。用于对Oracle blo环境&#xff1a;Oracle 10g RHEL 5.8介绍&#xff1a;BBED全称为数据块浏览和编辑。用于对Or…

python打包加版本信息_使用pyi-set_version为PyInstaller打包出来的程序附加版本信息...

本文将讲述如何使用 pyi-grab_version获取版本信息的模板文件&#xff0c;以及使用 pyi-set_version为打包好的程序附加版本信息。当然了&#xff0c;在开始前&#xff0c;需要你已经安装好了 PyInstaller 这个工具。如果已经安装&#xff0c;你可以在 Python 的安装目录&#…