2011-08-29 59 views
8

通常我覺得需要使用可配置功能來設計對象。java配置/參數傳遞設計

爲了舉例說明,假設我正在創建一個DateIterator。可配置選項可能是迭代關閉間隔[start, end]或開放式間隔[start, end)


  • (1),在我看來,非正常的解決方案 - 僅限於一個真/假配置選項
new DateIterator(boolean openInterval); 
  • (2)類型安全枚舉方法 - 通常是有點笨重
new DateIterator(Interval.OPEN_END); 
  • (3)unconv entional嘗試 - 不錯,但不要太直截了當
new DateIterator().openEnd(); 
  • (4)繼承方法 - 往往過度工程
new OpenEndedDateIterator(); 

爲了這個來,我認爲不如幾個備選方案,如基於整數的配置new DateIterator(Interval.OPEN_END);或基於屬性的配置。

還有其他方法嗎?你更喜歡哪種方法?

回答

6

我想說的Builder模式是有道理的位置:

DateIterator di = 
    DateIterator.builder() 
       .withStartDate(new Date()) 
       .withOpenEnd() 
       .build(); 

這樣,你的實際DateIterator可以是不可變的,而由DateIterator.builder()返回的建設者做的配置工作。

1

雖然沒有很好的答案,這在很大程度上是口味的問題,我做跟隨拇指以下規則,以大空間爲例外,以避免過度工程:

  1. 如果只配置你有是一個「參數」,採取一個固定的集合,並改變行爲(如你的例子),去與子類。雖然它可能過度設計,但如果類中的許多方法都以「if(this.parameter == x)... else if(this.parameter == y)」開頭,則會使代碼無法讀取。
  2. 如果你的參數不是一個固定的集合,而是一個字符串或數字,並且你需要它讓這個類正常工作,如果它不是強制性的,我喜歡解決方案編號(3),非常規嘗試: )
  3. 如果在固定集中有多個參數(如START_OPEN_ENDED和STOP_OPEN_ENDED),則創建子類可能意味着爲每個排列創建一個子類。在這種情況下,考慮封裝。例如(我可能不會在這個特定的情況下這樣做,但它是一個很好的例子),創建一個類DateComparator,其中包含一個用於開放式的子類,並封裝一個DateComparator作爲開始,一個作爲結束,只有一個DateIterator。

再說一次,這些都是我使用的經驗法則,絕不是強制性的,而且我經常發現自己並沒有逐字地尊重他們。