使用不同返回类型但具有相同功能的命名方法

3
我在谈论Java,但这个概念也适用于其他语言--
我们在同一个类上有两种方法,它们具有相同的基本功能,但提供不同的返回类型。这两个方法都可以获取所有东西,但其中一个获得一个可迭代的对象,该对象可以提供对所有东西的访问,另一个则获取包含所有东西的集合。
我们知道你不能这样做(因为它无法编译):
Iterable getThings()

Collection getThings() 

那么,有没有人对如何命名方法有想法?似乎很容易解决,只需说:

Iterable getIterableOfThings

Collection getCollectionOfThings

然而,这显然有些啰嗦,也许不是最好的解决方案。我所问的问题是否意味着我们的组织/编码方法已经偏离了轨道,还是这个问题是合理的?

还有其他人遇到过这种情况吗?


1
使用 Iterable iterator() 代替 Iterable getThings(),这样做怎么样? - Braj
IterableCollection的超级接口。为什么需要两个getter,当你总是可以将一个转换为另一个呢? - blgt
不应该害怕冗长,因为我们有 IDE 可以为我们节省很多打字时间。你可能想看看 Bob Martin 的《Clean Code...》(http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&qid=1403192998&sr=8-1&keywords=bob+martin+clean+code)。话虽如此,我仍然不知道如何命名事物。 - ajb
3个回答

2
如何考虑以下内容:
Iterable getIterator();
Collection getThings();

1

Iterable是Collection的超级接口。 一般来说,你不需要这样做。

尽管如此,这个问题本身是合理的。一个更好的例子是当你有一个底层资源时,一个函数将其包装在一个访问对象中,而另一个函数将其包装在另一个对象中。当然,这取决于编码风格,但我习惯看到像这样的东西(因此认为它更易读):

class A {
    private Object[] underlying;
    List<Object> getItemsAsList() {
        return Arrays.asList(underlying);
    }
    Object[] getItemsAsArray() {
        return underlying;
    }
}

0

Iterable getThings() 不太正确,因为你实际上没有获取任何东西。Iterable提供了访问一组项目的迭代的方式,但不会给你那些项目。

集合会给你那些项目,所以Collection getThings() 看起来是对的。

例如,你可以为无限长的集合提供一个迭代器,但不能提供这样等价的集合。这能够工作是因为迭代器会逐个返回元素,而集合需要收集无限数量的对象并将它们返回。


“Iterable getItems(){return new ArrayList();}”有什么问题吗? - blgt
@blgt - 这没有什么问题,但 ArrayList 实现的是 Collection 而不仅仅是 Iterable。这就像狗是四条腿的动物一样,但并非所有四条腿的动物都是狗。 - Arturo Aparicio

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