第四十条:谨慎设计方法签名

        方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成,不包括返回值类型。

    本条目是若干API设计技巧的总结,它们都还不足以单独开设一个条目。综合来说,这些设计技巧将有助于使你的API更易于学习和使用,并且比较不容易出错。

谨慎地选择方法的名称

不要过于追求提供便利的方法

避免过长的参数列表(三种方式)

对于参数类型,要优先使用接口而不是类

对于boolean参数,要优先使用两个元素的枚举类型

        谨慎地选择方法的名称。方法的名称应该始终遵循标准的命名习惯(见第56条)。首要目标应该是选择易于理解的,并且与同一个包中的其他名称风格一致的名称。第二个目标应该是选择与大众认可的名称(如果存在的话)相一致的名称。如果还有疑问,请参考Java类库的API。尽管Java类库的API中也有大量不一致的地方,考虑到这些Java类库的规模和范围,这是不可避免的,但它还是得到了相当程度的的认可。

    不要过于追求提供便利的方法。每个方法都应该尽其所能。方法太多会使类难以学习、使用、文档化、测试和维护。对于接口而言,这无疑是正确的,方法太多会使接口实现者和接口用户的工作变得复杂起来。对于类和接口所支持的每个动作,都提供一个功能齐全的方法。只有当一项操作被经常用到的时候,才考虑为它提供快捷方式。如果不能确定,还是不提供快捷方式为好。

        避免过长的参数列表。目标是四个参数,或者更少。大多数程序员都无法记住更长的参数列表。如果你编写的许多方法都超过了这个限制,你的API就不太便于使用,除非用户不停地参考它的文档。现代的IDE会有所帮助,但最好还是使用简短的参数列表。相同类型的长参数序列格外有害。API的用户不仅无法记住参数的顺序,而且,当他们不小心弄错了参数顺序时,他们的程序仍然可以编译和运行,只不过这些程序不会按照作者的意图进行工作。

有三种方法可以缩短过长的参数列表。第一种是把方法分解成多个方法,每个方法只需要这些参数的一个子集。如果不小心,这样做会导致方法过多。但是通过提升它们的正交性,还是可以减少方法的数目。例如,考虑java.util.List接口。它并没有提供“在子列表中查找元素的第一个索引和最有一个索引”的方法,这两个方法都需要三个参数。相反,它提供了subList方法,这个方法带两个参数,并返回子列表的一个视图。这个方法可以与indexOf或者lastIndexOf方法结合起来,获得期待的功能,而这两个方法都分别只要一个参数。而且,subList方法也可以与其他任何“针对List实例进行操作”的方法结合起来,在子列表上执行任意的计算。这样得到的API就有很高的“功能-重量”(power-weight)比。

        缩短长参数列表的第二个方式是创建辅助类(helper class),用来保存参数的数组。这些辅助类一般为静态成员类(见第22条)。如果一个频繁出现的参数序列可以被看作是代表了某个独立的实体,则建议使用这些方法。例如,假设正在编写一个表示纸牌游戏的类,你会发现,经常要传递一个两参数的序列来表示纸牌的点数和花色。如果增加辅助类来表示一张纸牌,并且把每个参数序列都转换成这个辅助类的每个参数,那么这个纸牌游戏类的API以及它的内部表示都可以得到改进。

        结合了前两种特征的第三种方法是,从对象构建到方法调用都采用Builder模式(请见第2条)。如果方法带了多个参数,尤其是当他们中有些是可选的时候,最好定义一个对象来表示所有参数,并允许客户端在这个对象上进行多册“setter”调用,每次调用都设置一个参数,或者设置一个较小的相关集合。一旦设置了需要的参数,客户端就调用对象的“执行”(execute)方法,它对参数进行最终的有效性检查,并执行实际的计算。

        对于参数类型,要优先使用接口而不是类(请见52条)。只要有适当的接口可用来定义参数,就优先使用这个接口,而不是使用实现该接口的类。例如,没有理由在编写方法时使用HashMap类作为输入,相反,应当使用Map接口作为参数。这使你可以传入一个Hashtable、HashMap、TreeMap、TreeMap的子映射表(submap),或者任何待于将来编写的Map实现。如果使用的类而不是接口,则限制了客户端只能传入特定的实现,如果碰巧输入的数据是以其他的形式存在,就会导致不必要的、可能非常昂贵的拷贝操作。

        对于boolean参数,要优先使用两个元素的枚举类型。它使代码更易于阅读和编写,尤其当你在使用支持自动完成功能的IDE的时候。它也使以后更易于添加更多的选项。例如,你可能会有一个Thermometer类型,它带有一个静态工厂方法,而这个静态工厂方法的签名需要传入这个枚举的值:

  public enum TemperatureScale{ FARENHEIT, CELSIUS}

Thermometer.newInstance(TemperatureScale.CELSIUS)不仅比Thermometer.newInstance(true)更有用,而且你还可以在未来的发行版本中将KELVIN添加到TemperatureScale中,无需非得给Thermometer添加新的静态工厂。你还可以将依赖于温度刻度单位的代码重构到枚举常量的方法中(见第30条)。例如,每个刻度单位都可以有一个方法,它带有一个double值,并将它规格化成摄氏度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,934评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,887评论 25 707
  • 这是一个约束的代码库,他的底层使用到了NSLayoutConstraint进行约束。那下面就对里面的代码进行一个解...
    阿汤8阿义阅读 6,450评论 2 1
  • 9.20日有感 看到班上的同事忙忙碌碌的,有的说自己腰不舒服,有的说自己头昏昏沉沉的难受,我心里不免替她们难过,是...
    阳光所指阅读 149评论 0 1