java - 人们是否提供多种机制来在 API 中做同样的事情?

标签 java api

用多种方法实现相同结果的 API 设计是否令人困惑?例如,我有自己的 Date 库(它是 Java Date/Calendar 类的简单包装器,用于区分 年份-month-dayDate,来自 instant-in-timeInstant 并提供在两者之间转换的机制) .我从一种创建 Date 实例的方法开始:

Date.valueOfYearMonthDay(int year, int month, int day);

但后来我发现使用 API 生成的代码可读性不是很好。所以我补充说:

Date.yearMonthDay(int year, int month, int day)
Date.ymd(int year, int month, int day)
Date.date(int year, int month, int day)

然后我开始变得流利:

Date.january().the(int day).in(int year);

(我发现 fluent 版本对于进行可读测试非常有用)。所有这些方法都做同样的事情并且有准确的 JavaDoc。我想我已经读到,perl 的一个优点是每个程序员都可以准确地选择他/她喜欢用哪种方法来解决问题。 Java 的一个优点是通常只有一种做事的方式:-)

人们的意见是什么?

最佳答案

在过去的 10 年里,我一直在研究与 Java API 可用性有关的不同问题。

我可以告诉您,关于在 Java 中有一种做事方式的说法是相当不正确的。在 Java 中通常很多方法可以做同样的事情。不幸的是,它们通常不一致或没有记录。

使用便捷方法使类的接口(interface)膨胀的一个问题是,您会让人更难理解该类以及如何使用它。您的选择越多,事情就会变得越复杂。

在对一些开源库的分析中,我发现了冗余功能的实例,它们是由不同的人使用不同的术语添加的。显然是个坏主意。

更大的问题是名字所承载的信息已经没有意义了。例如,swing 中的 putLayer 与 setLayer 之类的东西,其中一个只更新层,另一个也刷新(猜猜哪个?)是一个问题。同样,getComponentAt 和 findComponentAt。在其他方面,做某事的方法越多,您就越能混淆其他所有内容并减少现有功能的“熵”。

这是一个很好的例子。假设您希望在 Java 中用另一个字符串替换字符串中的子字符串。您可以使用 String.replace(CharSequence, CharSequence) ,它可以像您期望的那样完美工作,字面意思。现在假设您想进行正则表达式替换。您可以使用 Java 的 Matcher 并进行基于正则表达式的替换,任何维护人员都会理解您所做的事情。但是,您可以只编写 String.replaceAll(String, String),它调用 Matcher 版本。但是,您的许多维护人员可能不熟悉这一点,也没有意识到后果,包括替换字符串不能包含“$”的事实。因此,用“$”符号替换“USD”在 replace() 中效果很好,但在 replaceAll() 中会导致疯狂的事情。

然而,也许最大的问题是“做同样的事情”很少是使用相同方法的问题。在 Java API 的许多地方(我相信在其他语言中也是如此),您会找到做“几乎相同的事情”的方法,但在性能、同步、状态更改、异常处理等方面有所不同。例如,一个调用会直接工作,而另一个会建立锁,另一个会更改异常类型,等等。这会带来麻烦。

所以底线:做同一件事的多种方法不是一个好主意,除非它们是明确的并且非常简单,并且您非常小心以确保一致性。

关于java - 人们是否提供多种机制来在 API 中做同样的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/551500/

相关文章:

C# 通过浏览器自动登录gmail/hotmail

java - 基于 OSGi 的应用程序 (Karaf) 中同步方法的线程死锁

java - 如何在方法中使用其他类的整数?

php - 无法通过 API 将文件从 Wordpress 插件上传到 symfony 后端服务器?

macos - 在许多 Mac API 中,PB 前缀代表什么?

api - Twitter 流 api 与 F# 中的代理

java - 转移到maven后,我编译的jar文件无法运行

java - 来自十六进制颜色值的光强度

java - 如何使用 JSTL 遍历字符串中的每个字符?

sql - 寻找包装在用户定义的 SQL 函数中的外部 SQL 存储过程中的任何 OS/400 API 的工作示例