2009-06-03 193 views
0

假設人們有一個像Person這樣的類,它在Setting類中實現了一些默認設置。這些設置可能是諸如「默認標題」或「需要名字」之類的東西。相應地,像Address類的其他類也可能有一些默認設置。 Setting類將每個設置保存到持久存儲中。靜態方法或OO替代方法?

應該在每個類中實現一個靜態方法,如包含這些設置的「SetDefaults()」,以便外部方法可以針對每個對象類型調用SetDefaults()?例如Person.SetDefaults()然後Address.SetDefaults()?

或者是否有一些更好的面向對象的方式來做到這一點?

[更新:這不可能是在構造因爲SetDefaults()應該從外部類在特定時間點被調用,而不是每一個對象被構造時間]

+0

我認爲你需要解釋SetDefaults的行爲 - 如果當一個對象被超過的IoC構建這些默認值都是隻讀/工廠顯然是一個好答案。如果預計在施工後使用時會出現重置或其他狀態變化的影響,那麼我認爲Mark的擴展建議是最好的答案,但我真的質疑當時的設計 - 這聽起來像是兩種截然不同的方法。 – annakata 2009-06-03 08:38:28

回答

3

我不能想到很多場合默認是真正的跨越......給所有不同的使用情況,對象可能會經歷(並非最不重要的,像反序列化 - 這可能最終設置即使這不是預期的)。

這裏的一個選項是IoC;像StructureMap這樣的IoC容器可以在初始化後設置屬性,然後從調用代碼中抽象出來。

另一種選擇可能是某種模板實例(靜態),該實例可以從中複製值。但我認爲這在一些情況下是有風險的。如果不同的線程(可能是Web服務器上的請求)需要不同的默認值,您也會遇到問題。 [ThreadStatic]不是選項(雖然它是一個選項)。

另一種選擇(它提供了最大的靈活性)將提供用戶設定的工廠......也許通過委託或事件機制 - 但我很難看到爲什麼您可能希望這種情況。這不是我經常見到的...


重新更新:如果它只被外部類使用;可它或許使用類似的擴展方法(不必知道這事,而不是Person類):

public static class PersonExt { 
    public static void SetDefaults(this Person person) { 
     // your code 
    } 
} 

因爲它聽起來像原來Person類不關心SetDefaults,這離婚的邏輯從整齊地。

1

爲什麼不設置這些默認值在創建對象時(在構造函數中)。 默認值是-imho - 當沒有爲該屬性賦予特定值時應該分配給屬性的值,因此,我認爲在創建對象時設置這些默認值是一個好主意(在構造函數中或者通過工廠)。

或者,我錯過了什麼?

+0

因爲SetDefaults()方法需要由外部類來調用,而不是每次構造對象。 – Aryeh 2009-06-03 08:15:25

+1

@JBadda - 你的意思是設置這些默認值的值是什麼?不是重置實例?我認爲一個靜態(即元方法)是有道理的,但不會比依賴注入一個配置對象更有意義 - 如果需要,接口 – annakata 2009-06-03 08:22:10

-1

您也可以實施Abstract factory pattern並使用您的設置配置工廠。或者,您也可以使用IoC作爲injecting dependency進入此工廠類。對於Preson

簡單工廠類可以看看以下內容:

public class PersonFactory 
{ 
    private readonly ISettings settings; 

    public PersonFactory(ISettings settings) 
    { 
    this.settings = settings; 
    } 

    public Person Create() 
    { 
    Person p = new Person(); 
    // ... you code for populating person's attributes form settings. 
    return p; 
    } 
} 
+0

我不確定這些直接解決了這個問題。 – Aryeh 2009-06-03 08:22:59

0

我把它們放在構造函數。

class Person 
{ 
    public Person() 
    { 
    this.Settings = MakeDefault(); 
    } 

    public Person(Settings settings) 
    { 
    this.Settings = settings; 
    } 
} 
+0

不能在構造函數中 - 請參閱主題的更新。 – Aryeh 2009-06-03 08:27:28

0

您可以創建一個設置類來封裝所有類(人員,地址)的設置。

您可以爲說人所設定的默認設置:

// Injected 
Settings settings; 
Setting personSetting = new ...; 

... 
settings.StoreSettingsFor(typeof(Person), personSettings); 
0

你也可以使用一個單來存儲這些數據,如果你願意,尤其是如果從存儲的地方檢索的值,因爲這會降低對訪問存儲的次數。

(在這種情況下存儲可以是數據文件,註冊表,數據庫)。