- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
用多种方法实现相同结果的 API 设计是否令人困惑?例如,我有自己的 Date
库(它是 Java Date
/Calendar
类的简单包装器,用于区分 年份-month-day,Date
,来自 instant-in-time,Instant
并提供在两者之间转换的机制) .我从一种创建 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/
我有一个包含两个项目的解决方案,每个项目都生成一个单独的 dll,供另一个 Windows 应用程序使用。这些项目中的每一个都有一个名为 MyActions 的类,只有一个这样的方法 项目 1
我有一个包含两个项目的解决方案,每个项目都生成一个单独的 dll,供另一个 Windows 应用程序使用。这些项目中的每一个都有一个名为 MyActions 的类,只有一个这样的方法 项目 1
所以我在 if 语句中有这段代码如下 if (!inTime || !moment(inTime).format('m') % 15 === 0) { doSomething(); } 传入的 inT
像往常一样,我想做的比我知道的还多:-D 这就是我正在做的事情......我正在写一篇简历。 但是在简介中,我想要一个“长简介”和一个“短简介”按钮。 长传记显然会显示整个传记,但短传记会捕获列表中的
我正在使用物质。 js创建一个二维场景。我在场景中对一个物体施加力,这个物体撞击其他物体,但最终所有物体都因摩擦和能量损失而停止移动。 我需要以某种方式检测场景中的所有物体何时停止移动。我发现这样
谁能快速浏览一下这段代码,让我知道哪里出错了。 在模糊事件中,.textok 类加载正常,但 .textbad 类加载不正常。 .textok { color:#0F0; background
我的情况是这样的:我有一个项目,它使用了一些生成的代码。在生成的代码中,几乎所有文件中都硬编码了某个 URI。 因此,在某些时候我得到了两个生成的代码库:一个针对开发,另一个针对暂存。 我想通过 Gr
这是一个严肃的问题(见我的评论)。 问题很简单:Java 所做的所有 SEO 不友好的事情有哪些会导致您的网站在主要搜索引擎中的排名不如应有的好? 最佳答案 有一个与 JSESSIONID 相关的 s
我正在使用 PHP。我想完成 jQuery AJAX 进程,(完成进程并数据返回主页后)。 然后执行下一个 jQuery 操作。关于如何做到这一点有什么想法吗? $.ajax({ url: "pa
在释放内存之前,我要从 CPU 缓存中逐出内存范围。理想情况下,我只想放弃这些缓存行而不将它们保存到内存中。因为没有人会使用这些值,无论谁再次获得该内存范围(在 malloc()/new/_mm_ma
我不喜欢 jackson 。 我想使用 ajax,但要使用 Google Gson。 所以我试图弄清楚如何实现我自己的 HttpMessageConverter 以将其与 @ResponseBody
我是一名优秀的程序员,十分优秀!