2010-11-25 39 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为好。

相关问题