2010-05-21 53 views
1

我應該創建一個類,該類應該是值的區間的容器(如數學)。我已經決定在內部使用SortedSet麻煩決定返回SortedSet的方法的返回類型

我應該實現的一個方法是「獲取一個有序集合,包含間隔中的所有元素」。

class Interval { 
    private SortedSet sortedSet = new something(); 

    ... 

    <<method that should return an ordered set of values>> 
} 

我的問題在於什麼應該是方法的返回類型和名稱。幾個假說產生:

  1. SortedSet getSortedElements();我在內部使用SortedSet,所以我應該返回類型。我應該在方法名稱中聲明這個意圖。
  2. SortedSet getElements();我在內部使用SortedSet,但沒有必要說明在方法名稱中(我沒有看到這方面的重點)。
  3. Set getElements();我應該試着總是返回最基本的類型,因此我返回一個Set。通過合同和方法的定義,人們已經知道所有元素都是有序的。
  4. Set getSortedElements();對於方法返回類型,與上面相同。關於方法名稱,您明確說明了此方法將返回的內容:一組已排序的元素。

我傾向於使用4.,但其他人似乎也沒事。有明確的贏家嗎?爲什麼?

+0

我不明白你的問題。 SortedSet已經用'public SortedSet subSet(E fromElement,E toElement)' – Pyrolistical 2010-05-21 22:52:04

+0

Re實現了你需要的東西。該方法的名稱「元素」太泛化。該方法的名稱應該更具描述性,然後「元素」...特別是如果有一天你需要添加另一個集合的類,然後getElements變得模糊 – inor 2014-08-26 10:49:02

回答

4

SortedSet是與元素排序合約的接口。它還暴露了Set(例如first())中不可用的一些方法。如果您應該返回遵守該合同的對象(例如,返回iterator()上的有序值),則應返回Sorted Set。如果不是,則應返回Set(或Collection)。

根據您希望如何使用結果計算出要返回的內容。想想「得到一個有序集合中的所有元素」的意思是第一個,然後擔心實現。

順便說一句代碼

private SortedSet sortedSet = new SortedSet(); 

是非法的,因爲SortedSet是一個接口。既然這是作業,我會讓你找出爲什麼這是一個問題。

+1

+1返回的值類型和參數類型應該儘可能地反映合同。順便說一下,使參數類型更具體和更具體的返回類型通常方便調用者。 – 2010-05-21 22:26:04

+0

是的,當你在寫帖子時,我切換到「某些東西」,雖然我會使用TreeSet。 – 2010-05-21 22:47:33

1

我認爲返回Set是可維護性的正確方法 - 但我不喜歡任何方法名稱。爲什麼不是更具描述性的東西,如:

Set getIntervalValues(); 

什麼都有。

+0

我喜歡方法的名稱。 – 2010-05-21 22:13:36

+0

當方法返回一個SortedSet時,爲什麼Set方法對調用者更方便?我會想相反的:如果調用者想要使用結果作爲SortedSet,她只需要將結果分配給SortedSet。如果她不關心訂單,她可以將結果分配給一個Set。現在,如果方法的返回類型是Set,那麼一個想把它用作SortedSet的調用者(例如call first()等)將需要投它 - 看起來醜陋而且冒險 - 如果實現者決定將實現更改爲非排序集? – inor 2014-08-26 10:53:56

+0

我給你+1,因爲我同意關於方法名稱的部分 – inor 2014-08-26 11:27:24

0

如果方法應該返回一個SortedSet,那應該是該方法的返回類型。調用者可以將結果分配給SortedSet或Set,取決於他們是否關心排序。 如果你的方法javadoc或name暗示你正在返回一個有序集合,但是你的方法返回類型只是Set,這就好像告訴你的水管工你將爲他的服務支付他100美元,但是然後在合同中寫下你將支付他「至少50美元」。

通過返回SortedSet
1)你是承諾你的客戶,你是和將返回一個排序集。你不能在不破壞你的客戶端代碼的情況下(不會編譯)更改該合同(設置)。
如果您的方法返回類型是Set,那麼在您的javadoc或方法名稱中承諾給您的客戶端/調用者的內容並不重要,您仍然可以隨時更改實現以返回非排序集。如果返回類型是Set,並且調用者需要SortedSet功能,他們可以將返回的值轉換爲SortedSet(醜陋),但如果您決定返回未排序的(仍然)Set,那麼有一天,您的調用者代碼將在運行時中斷(對您的客戶非常危險,想象您的客戶端代碼運行正常,然後升級您提供的庫)。
2)調用者可能需要一個有序結果集。如果你正在返回Set,他們可能會試圖重新排序你的結果(你是否想要讀取你的javadoc?)。如果你正在返回SortedSet,他們知道他們不需要重新排序。