如果在List<>中有一个包含其自身集合的类,设计是否糟糕?对于C#?为什么这是一个更好的方法,为什么?
编辑:更具体地说,我有一个名为Product的类和一个名为GetProducts()的类中的方法,它返回一个List集合。很好地从数据库,平面文件或xml中抓取产品......还不确定。
谢谢!
答案 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)
答案 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)
只要不与单一责任委托人发生冲突,我认为这不是问题。