Java方法命名约定和重载

7
我是一个有用的助手,可以翻译文本。
我有一个服务,必须通过某些属性返回人员。我看到有两种命名这些方法的策略:
第一种:
getPersonById(int id)
getPersonByBirthDate(Date date)
getPersonByBirthDateAndSex(Date date,Sex sex)
getPersonByNameAndSex(String name,Sex sex)
getPersonByBirthDateAndNameAndSex(Date date,String name,Sex sex)
etc..

或者应用重载规则,执行以下操作:

getPerson(int id)
getPerson(Date date)
getPerson(Date date,Sex sex)
getPerson(String name,Sex sex)
getPerson(Date date,String name,Sex sex)

根据Java命名规范,哪个是正确的?

两种方式都可以,但在企业界和按照“Clean Code”原则,最好使用第一种选项,因为名称能够解释其功能。 - Adnan Isajbegovic
是的,我同意@AdnanIsajbegovic的观点,或者您可以使用构造函数来设置重要值,以便更喜欢使用rest getter。 - bananas
第一种方式是代码自我记录。而第二种方式可能需要询问您的IDE实际调用了哪个方法,使得代码不那么容易阅读。 - Boris the Spider
2
@AdnanIsajbegovic,“getPersonByBirthDateAndNameAndSex”看起来不像是干净的代码,对吧?如果我们必须传递5个或更多参数呢? - Andrew Tobilko
如果您有这么多搜索条件,请考虑使用Query类作为参数。否则,您可能需要指数级别的getter来满足所有搜索条件。 - fabian
@AndrewTobilko 另一个问题...根据《Clean Code》,你应该设计你的代码,这样你只有少量参数的函数,最多3个就可以了...而且你应该尽可能地多使用"and",所以类似于getPersonByBdayNameAndSex这样的方式是可以的...这样,你的代码看起来像一篇故事,很容易更新事情并修复可能的问题,甚至不用查看方法实现... - Adnan Isajbegovic
2个回答

11

除了过载问题之外,您的设计还存在组合API爆炸的问题:您开始引入针对所有可能的搜索条件的方法。一种替代方法是引入一个构建器,收集准则,并最终返回人员。

示例:

 queryPerson().byId(5).run();  
 queryPerson().byName("John").bySex(Sex.MALE).run();
 queryPerson().bySex(Sex.FEMALE).run();

服务API现在仅有一个优秀的queryPerson()方法。


@Fabian,好主意,更改为queryPerson - wero

2

重载始终更好。 许多基于Java的知名框架都遵循这种方法。 此外,重载的主要概念是因为您提到的条件。

拥有重载方法简化了开发人员的可读性,因为不需要记住单独的名称。 此外,Eclipse的Ctrl + Space功能将始终建议要使用的方法。


什么是“_已知框架_”? - Boris the Spider
您可以从JDK中提供示例(例如StringBuider#append)。 - Andrew Tobilko
@BoristheSpider ATG(“艺术技术组”),Broadleaf Commerce,甚至Java的库也使用这种方法。 最常用的方法“println()”也是重载的。 :) - Monis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接