一个类应该包含自己的集合吗?

时间:2010-11-25 18:01:11

标签: c#

如果在List<>中有一个包含其自身集合的类,设计是否糟糕?对于C#?为什么这是一个更好的方法,为什么?

编辑:更具体地说,我有一个名为Product的类和一个名为GetProducts()的类中的方法,它返回一个List集合。很好地从数据库,平面文件或xml中抓取产品......还不确定。

谢谢!

6 个答案:

答案 0 :(得分:10)

使用Product和GetProducts()更新,我认为这可能不是一件好事。

我在这里使用经验法则,这种原则依赖于域的逻辑,而不是语言,具体。因此,在您的情况下,我会问自己:“我的产品是否包含其他实际产品?”如果答案是肯定的,那么产品集合在Product类中是完全合法的。如果不知道实际包含这些产品的是什么。商店可能吗?

静态方法对此规则有例外。如果GetProducts()是静态的,则上层推理不适用,并且通常可以很好地将它放在Product类中。

答案 1 :(得分: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或Castle Windsor这样的IoC容器)。然后,如有必要,您可以轻松模拟IProductRepository以便与调用者进行测试。

通过这种方式,您可以将实际模型(Product)与产品的“您可以做什么”分开。

但是,如果Product还需要Products(例如:SubProducts),那么ICollection<Product>上也可以Product。< / p>

答案 2 :(得分:1)

这很好。您已经想出了treegraph

答案 3 :(得分:0)

它可能既贫穷又好,取决于您正在解决的问题,以及它是否是一般化对象。许多因素可能会影响此类设计决策。最后,无论设计好坏,如果这是正确的道路,你选择过河。

编辑#1

  

好的,我有一个名为product的类和一个名为GetProducts的方法,它返回一个List,我不确定这是否是正确的方法。

在这种情况下,我会将Product.GetProducts方法设为静态。因此,当您要加载产品时,您只需简单地处理Product类:

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

自己的列表会假设产品可能由不同的其他产品组成,例如那些组件产品。但是,使用静态方法,更可靠地使您的Product课程成为产品相关业务的工厂。

答案 4 :(得分:0)

当然这很好。这通常是以OOP-y方式实现树的合理方式; TreeNode必须在其中包含List<TreeNode> m_Children字段,以便节点知道它的子节点是否为树遍历。

答案 5 :(得分:0)

只要不与单一责任委托人发生冲突,我认为这不是问题。