2010-11-25 78 views
10

對於C#,擁有一個包含它自己的集合的類的設計很糟糕,如列表<>?爲什麼這是一個更好的方法,爲什麼?類應該包含它自己的集合嗎?

編輯:更具體地說,我有一個名爲Product的類和一個名爲GetProducts()的類中返回List集合的方法。從數據庫,平面文件或xml中抓取產品......還不確定。

謝謝!

+0

好的,我有一個名爲產品的類和一個名爲GetProducts的方法,它返回一個List ,我不確定這是否是正確的方法。 – user204588 2010-11-25 18:07:40

+0

我可能會考慮編寫一個`ProductCollection`類來提供集合相關的方法,但我不會介意太多。也許使這個`GetProducts`方法對你的`Product`類是靜態的就足夠了。這樣,如果我們可以這樣說,那麼您的`Product`類將表現得像某種產品外觀。 – 2010-11-25 18:11:32

回答

10

隨着產品和GetProducts()更新,我認爲這可能不是件好事。

我使用了一種經驗法則,它依賴於域,而不是語言的具體邏輯。所以在你的情況下,我會問自己:「我的產品是否包含其他實際產品?」如果答案是肯定的,那麼產品集合是Product類中的完全合法的東西。如果不詢問實際包含這些產品。一家商店可能?

靜態方法對此規則有個例外。如果GetProducts()是靜態的,那麼上面的推理不適用,並且通常在Product類中它是完美的。

0

這可能既糟糕又好,取決於你正在解決的問題,以及它是否是一個通用對象。許多因素可能會影響此類設計決策。最後,無論設計好壞,但如果這是你選擇過河的正確道路。

編輯#1

行,我有一類叫做產品和方法中調用的GetProducts,返回一個列表,我不知道這是否是正確的做法。

在這種情況下,我會使Product.GetProducts方法靜態。因此,當你要加載的產品,你可以簡單的解決您的Product類,像這樣:

IList<Product> products = Product.GetProducts(); 

自身的名單會認爲一個產品可能由不同的其他產品一樣,這些組件產品。但是,使用靜態方法,更確切地說,您的Product類將成爲產品相關業務的工廠。

+0

你是在說這裏的工廠模式還是隻是一般的創建產品的對象? – user204588 2010-11-25 18:50:26

0

當然這很好。這通常是以OOP-y方式實現樹的明智方式;一個TreeNode必須在其中包含一個List<TreeNode> m_Children字段,以便節點知道它是什麼孩子是樹遍歷。

0

只要它不與單一責任主體衝突,我想這不會是一個問題。

2

就個人而言,我會使用存儲庫模式:

public class IProductRepository 
{ 
    IEnumerable<Product> GetAll(); 
} 

然後寫一個實現:

public class ProductRepository 
{ 
    public IEnumerable<Product> GetAll() 
    { 
     // Database logic or read from an xml file... etc. 
    } 
} 

傳遞一個IProductRepository給調用者(使用像Ninject或溫莎城堡的IoC容器) 。然後,如果有必要,您可以輕鬆地模擬IProductRepository以與來電者進行測試。

通過這種方式,您可以將實際型號(Product)與產品的「可以做什麼」分開。

但是,如果Product S還需要有Products(例如:SubProducts),你可以有一個ICollection<Product>Product爲好。