2014-06-19 60 views
3

我談論的Java相同的功能,但這個概念也適用於其他語言 -命名方法具有不同的返回類型,但

我們有相同的類中的兩個方法,將具有相同的基本功能,但提供不同的返回類型。這兩種方法都可以爲你提供所有的東西,但是有一個方法可以獲得一個可以提供所有東西的迭代器,並且可以得到一個包含所有東西的集合。

我們知道你不能做到這一點(因爲它不會編譯):

Iterable getThings() 

Collection getThings() 

因此,沒有人有關於如何命名方法的想法?這似乎是一個簡單的修復說:

Iterable getIterableOfThings 

Collection getCollectionOfThings 

但是,這顯然有些冗長,也許不是最好的解決方案。我所問的問題是否意味着我們的組織/編碼方法在某種程度上不符合標準,或者這是一個有效的問題?

是否有其他人處理過這種情況?

+1

「Iterable iterator()'而不是'Iterable getThings()'' – Braj

+0

['Iterable'是'Collection'的超級接口。](http://docs.oracle.com/javase/7/docs/ api/java/util/Collection.html)爲什麼你總是需要兩個getter,而你總是可以彼此投一個? – blgt

+0

不應該擔心冗長,因爲我們有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&關鍵字=鮑勃+馬丁+乾淨+代碼)。話雖如此,我仍然不知道如何命名。 – ajb

回答

2

如何:

Iterable getIterator(); 
Collection getThings(); 
1

​​一般來說你應需要這樣做。

儘管如此,問題本身是有效的。一個更好的例子是當你擁有一個底層資源時,一個函數將其包裝在一個訪問對象中,而另一個函數將其包裝在另一個訪問對象中。這取決於編碼過程的風格,但我來說,我看慣了這樣的事情(從而找到更易讀):

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

可迭代getThings()似乎不正確的,因爲你沒有實際得到任何東西。 Iterable提供對迭代一組項目的訪問,但不會給你這些項目。

一個集合會給你這些項目,所以收集getThings()似乎是正確的。

例如,你可以給一個無限長集合的迭代器,但不能給出這樣的等價集合。這是可行的,因爲迭代器會在時間返回一個元素,但是一個集合需要收集無限量的對象並返回它們。

+0

有什麼問題,比如'可迭代的getItems(){return new ArrayList();}'? – blgt

+0

@blgt - 沒有什麼錯,但是ArrayList實現了Collection不僅僅是Iterable。這是一隻狗的問題,是一隻四條腿的動物,但並非所有的四條腿動物都是狗。 –

相關問題