2009-04-08 28 views
3

我不確定這兩個「模式」中哪一個最好。目前我使用選項A(與提供者一起實現持久性),但是現在我正在向B發展,特別是單元測試能夠使用「依賴注入」模型。哪個類結構更可取?

選項A:

class ClassA 
{ 
    ClassA() { } 
    Save(); 
    static List<ClassA> GetClassAs(); 
}  

選項B:

class ClassA 
{ 
    ClassA() { } 
    Save(); 
} 

class ClassARepository 
{ 
    ClassARepository() { } 
    List<ClassA> GetClassAs();  
} 

我覺得我問的是,它是一類很好的做法,暴露返回靜態方法自己的實例集合?

編輯

似乎有一個普遍的共識是選項B是更好的選擇。看起來我有很多重構:S

回答

4

選項B看起來有點像ActiveRecord模式(我假設ClassA中的Save方法將使用ClassARepository?),這在某些情況下很好,但是如果您有相當複雜的域模型,我不會使用'ActiveREcord'模式。

相反,我會用這樣的模式:

public class ClassA 
{ 
    public int Id {get; private set;} 
    public string Name {get; set;} 
} 

public class ClassARepository 
{ 
    public ClassA Get(int id); 

    public void Save(ClassA item); 
} 

這意味着所有的持久性相關的邏輯被放入ClassARepository類,並ClassA的也有到倉庫沒有直接聯繫。

+0

我不知道名稱,但是是的,它似乎我使用這種模式。我會給你最好的答案:) – 2009-04-09 11:02:35

2

您或者將數據和邏輯中的對象的完全持久性或全部保留在一個類中。將'Save'移動到'ClassARepository'或將'GetClassAs'保留在'ClassA'內。

0

不,我不會認爲那種不好的做法是一條硬而快的規則,儘管我假設這是用於某種實例跟蹤或資源監視?如果是這樣,請記住在幕後必須有邏輯來確保超出範圍的對象不會僅僅停留在靜態集合中。我不確定您使用的是哪種語言,但如果是C#,則可以考慮將其存儲爲List<WeakReference>

1

選項B看起來更好,因爲A混合了兩種想法,兩種功能。 A類的實際功能和管理A的集合的單獨功能。

隨着應用程序的增長,您可能還需要在存儲庫中使用其他功能 - findById,檢索子集等。把它放到A類中會變得雜亂無章。

而且,正如你所說的,選項B更容易測試。

0

選項B更靈活。

  • 它允許有多個存儲庫的可能性。
  • 它允許存儲庫類被分類。
  • 它允許您將存儲庫作爲參數傳遞給另一個類或函數,而不是將該類或函數顯式耦合到全局靜態變量。
0

我覺得我問的是,它是一類很好的做法,暴露的是返回自己的實例集合的靜態方法?

一般沒有 - 這樣的藏品往往是單身人士,如果他們是(在你的例子),那麼被認爲是antipattern對於單身的通常的原因,以及該原因而static is considered harmful