对于C#,拥有一个包含它自己的集合的类的设计很糟糕,如列表<>?为什么这是一个更好的方法,为什么?类应该包含它自己的集合吗?
编辑:更具体地说,我有一个名为Product的类和一个名为GetProducts()的类中返回List集合的方法。从数据库,平面文件或xml中抓取产品......还不确定。
谢谢!
对于C#,拥有一个包含它自己的集合的类的设计很糟糕,如列表<>?为什么这是一个更好的方法,为什么?类应该包含它自己的集合吗?
编辑:更具体地说,我有一个名为Product的类和一个名为GetProducts()的类中返回List集合的方法。从数据库,平面文件或xml中抓取产品......还不确定。
谢谢!
随着产品和GetProducts()更新,我认为这可能不是件好事。
我使用了一种经验法则,它依赖于域,而不是语言的具体逻辑。所以在你的情况下,我会问自己:“我的产品是否包含其他实际产品?”如果答案是肯定的,那么产品集合是Product类中的完全合法的东西。如果不询问实际包含这些产品。一家商店可能?
静态方法对此规则有个例外。如果GetProducts()是静态的,那么上面的推理不适用,并且通常在Product类中它是完美的。
这可能既糟糕又好,取决于你正在解决的问题,以及它是否是一个通用对象。许多因素可能会影响此类设计决策。最后,无论设计好坏,但如果这是你选择过河的正确道路。
编辑#1
行,我有一类叫做产品和方法中调用的GetProducts,返回一个列表,我不知道这是否是正确的做法。
在这种情况下,我会使Product.GetProducts
方法静态。因此,当你要加载的产品,你可以简单的解决您的Product
类,像这样:
IList<Product> products = Product.GetProducts();
自身的名单会认为一个产品可能由不同的其他产品一样,这些组件产品。但是,使用静态方法,更确切地说,您的Product
类将成为产品相关业务的工厂。
你是在说这里的工厂模式还是只是一般的创建产品的对象? – user204588 2010-11-25 18:50:26
当然这很好。这通常是以OOP-y方式实现树的明智方式;一个TreeNode
必须在其中包含一个List<TreeNode> m_Children
字段,以便节点知道它是什么孩子是树遍历。
只要它不与单一责任主体冲突,我想这不会是一个问题。
就个人而言,我会使用存储库模式:
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
为好。
好的,我有一个名为产品的类和一个名为GetProducts的方法,它返回一个List,我不确定这是否是正确的方法。 –
user204588
2010-11-25 18:07:40
我可能会考虑编写一个`ProductCollection`类来提供集合相关的方法,但我不会介意太多。也许使这个`GetProducts`方法对你的`Product`类是静态的就足够了。这样,如果我们可以这样说,那么您的`Product`类将表现得像某种产品外观。 – 2010-11-25 18:11:32