2010-09-02 40 views
0

爲了把這個簡潔的語言......一流的設計問題

目的:
要創建一個類可以載入和保存對象/列表從數據源。

電流法:
我創建了接受兩個委託施工參數類:

private class Foo 
{ 
    public delegate List<object> LoadObjectsDelegate(); 
    public delegate void SaveObjectsDelegate(List<object> data); 

    private LoadObjectsDelegate _loadDelegate; 
    private SaveObjectsDelegate _saveDelegate; 

    public Foo(LoadObjectsDelegate loadDelegate, SaveObjectsDelegate saveDelegate) 
    { 
     _loadDelegate = loadDelegate; 
     _saveDelegate = saveDelegate; 
    } 

    public List<object> Objects {get; private set;} 

    public void Load() 
    { 
     Objects = _loadDelegate.Invoke(); 
    } 

    public void Save() 
    { 
     _saveDelegate.Invoke(Objects); 
    } 
} 

我想知道是否有這樣做一個更清潔的方式。

回答

2

通過它的外觀我會說你試圖實現存儲庫模式,並具有一些擴展功能。我也沒有看到嘗試注入加載和保存邏輯的意義,因爲它是存儲庫實現它們的工作。如果加載和保存對象的邏輯對於您的域中的所有對象都是相同的,請將其在基類中實現,並在需要時在派生類中重寫它。 This關於SO的文章可以給你一些關於如何處理這種模式的想法。

+0

幹得好!我試圖實現一個我不知道存在的模式..所以謝謝你告訴我它的存在。這確實正是我所追求的! – TerrorAustralis 2010-09-02 07:02:11

0

對於一件事,我會說它是通用的(Foo<T>) - 如果您的呼叫者真的想要,他們總是可以指定object,這意味着如果需要,他們可以以更強類型的方式使用它。

目前我不確定班級是否真的增加了很多價值,說實話。這實際上只是將三個價值組合在一起 - 就這些了。如果這就是你的意圖,那很好,但對我來說感覺有些貧乏。

+0

John,謝謝你的評論。這確實是正確的,但是類有額外的功能來處理這些對象<它們並不是真正的對象,它們是你所建議的類型T>。它包含分組,匹配和操作的功能,我沒有在這裏複製重點關注手頭上的問題:) – TerrorAustralis 2010-09-02 06:26:52

0

它不是更乾淨,只是另一種方法。如果您在代表中指定的行爲變化不大,請考慮Template Pattern

private abstract class AbstractFoo 
{ 
    public List<object> Objects { get; private set; } 

    public List<object> Load(); 

    public abstract void Save(List<object> data); 

    // add common functionality 
} 


private class ConcreteFoo : AbstractFoo 
{ 
    public override List<object> Load() 
    { 
     // do specific stuff 
    } 

    public override void Save(List<object> data) 
    { 
     // do specific stuff 
    } 
} 

缺點是你需要每個特定行爲的類。因此:如果委託人給出的行爲差異很大,或者需要動態加載不同的行爲,我發現你的委託方法是合適的。我通常會發現模板模式更容易理解,並且更容易進行單元測試。

您可以更進一步:行爲由模板模式中的繼承指定。而是繼承的,如果你選擇使用的接口一個更抽象的方法,你可以指定參考的行爲:

private interface IRepository 
{ 
    List<object> Load(); 
    void Save(List<object> data); 
} 


private class FooBar 
{ 
    private IRepository repository; 
    public List<object> Objects { get; private set; } 

    public FooBar(IRepository repository) 
    { 
     this.repository = repository; 
    } 

    public void Load() 
    { 
     Objects = repository.Load(); 
    } 

    public void Save() 
    { 
     repository.Save(Objects); 
    } 
} 

如果你需要,你需要實現從IRepository派生的類一些特定的行爲。這種方法比模板模式更容易理解和單元測試。我經常最終用後一種方法替換模板模式。