我应该创建一个应该是值间隔容器的类(比如数学)。我已经决定在内部使用SortedSet
。
我应该实现的一个方法是“获取包含区间中所有元素的有序集合”的方法。
class Interval {
private SortedSet sortedSet = new something();
...
<<method that should return an ordered set of values>>
}
我的问题在于方法的返回类型和名称应该是什么。出现了几个假设:
SortedSet getSortedElements();
我在内部使用SortedSet
,所以我应该返回该类型。我应该在方法名称中声明意图。SortedSet getElements();
我在内部使用的是SortedSet
,但是在方法名称中没有任何意义(我没有看到这一点中的重点)。Set getElements();
我应该尝试始终返回最基本的类型,因此我返回一个Set。通过合同和方法的定义,人们已经知道所有元素都是有序的。 Set getSortedElements();
对于方法返回类型,与上面相同。关于方法名称,您清楚地说明了此方法将返回的内容:一组已排序的元素。我倾向于使用4.
,但其他人也似乎没问题。有明显的赢家吗?为什么呢?
答案 0 :(得分:4)
SortedSet
是与合同的接口,元素已排序。它还公开了Set
中没有的一些方法(例如first()
)。如果你应该返回一个遵守该契约的对象(例如,在iterator()上返回有序值),那么你应该返回一个Sorted Set
。如果没有,您应该返回Set
(或Collection
)。
根据您希望如何使用结果,找出要返回的内容。想想“获得一个包含区间中所有元素的有序集合”意味着首先,然后担心实现。
顺便提一下代码
private SortedSet sortedSet = new SortedSet();
是非法的,因为SortedSet
是一个接口。由于这是作业,我将留给你找出为什么这是一个问题。
答案 1 :(得分:1)
我认为返回Set
是可维护性的正确方法 - 但我不喜欢任何方法名称。为什么不是更具描述性的东西:
Set getIntervalValues();
或其中的东西。
答案 2 :(得分:0)
如果该方法应该返回一个SortedSet,那应该是该方法的返回类型。调用者可以将结果分配给SortedSet或Set,具体取决于他们是否关心排序。 如果您的方法javadoc或名称暗示您正在返回已排序的集合,但您的方法返回类型仅为Set,那就像告诉您的管道工您将为他的服务支付100美元,但随后在合同中写下您将付给他&#34;至少50美元&#34;。
返回SortedSet
1)你承诺你的客户,你将返回一个排序集。在不破坏客户代码的情况下(无法编译),您无法更改该合同(设置)。
如果您的方法返回类型是Set,那么您在javadoc或方法名称中承诺您的客户端/调用者并不重要,您仍然可以随时更改实现以返回未排序的集合。如果返回类型是Set并且调用者想要SortedSet功能,他们可以将返回的值转换为SortedSet(丑陋),但如果您决定要返回一个未排序的(仍然)Set,那么有一天,您的调用者代码将在运行时中断(对您的客户来说风险很大。想象您的客户端代码运行正常,然后他们升级您提供的库...)。
2)呼叫者可能需要一组有序的结果。如果你要返回Set,他们可能会试图重新排序你的结果(你想要阅读你的javadoc吗?)。如果您要返回SortedSet,他们知道他们不需要重新排序。