2010-11-25 9 views
10

Неужели у плохого дизайна есть класс, содержащий коллекцию себя, как в списке <> для C#? Почему это и что является лучшим подходом и почему?Должен ли класс содержать коллекцию?

EDIT: В частности, у меня есть класс Product и метод класса GetProducts(), который возвращает коллекцию List. Хорошо бы хватать продукты из базы данных, плоского файла или xml ... пока не уверен.

Спасибо!

+0

ОК, у меня есть класс под названием product и метод внутри GetProducts, который возвращает список , и я не был уверен, что это правильный подход. – user204588 2010-11-25 18:07:40

+0

Я, возможно, подумал бы написать класс `ProductCollection`, который предоставил бы связанные с коллекцией методы, но я бы не стал об этом беспокоиться. Возможно, достаточно сделать этот метод «GetProducts» статичным для вашего класса «Продукт». Таким образом, ваш класс `Product` будет вести себя как-то как фасад продукта, если можно так выразиться. – 2010-11-25 18:11:32

ответ

10

С обновлением продукта и GetProducts() я думаю, что это может быть не очень хорошо.

Я использую эмпирическое правило типа принципа, которое опирается на логику, которая является доменом, а не языком, конкретным. Поэтому в вашем случае я бы спросил себя: «В моем продукте содержатся другие актуальные продукты?» Если ответ «да», то сбор продуктов является вполне законным для класса Product. Если не спросить, что на самом деле содержит эти продукты. Может, магазин?

Существует исключение из этого правила со статическими методами. Если GetProducts() является статическим, верхняя аргументация не применяется и обычно отлично подходит для использования в классе Product.

0

Возможно, это плохо и хорошо, в зависимости от проблемы, которую вы решаете, и если это обобщенный объект или нет. На такие проектные решения могут влиять многие факторы. В конце концов, это неважно хорошего или плохого дизайна, но если это правильный путь, вы решили пересечь реку.

EDIT # 1

ОК, у меня есть класс с именем продукта и метод внутри называемых GetProducts, который возвращает список, и я не был уверен, что это правильный подход.

В этом случае я бы сделал статический метод Product.GetProducts. Таким образом, если вы хотите, чтобы загрузить продукты, вы будете просто адрес вашего Product класс следующим образом:

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

список само по себе было бы предположить, что продукт может состоять из различных других продуктов, как эти составные продукты. Но, со статическим методом, это, скорее, сделало бы ваш класс Product фабрикой для бизнеса, связанного с продуктом.

+0

Вы говорите о фабричной схеме здесь или вообще как объект, который создает продукты? – user204588 2010-11-25 18:50:26

0

Уверенный, что в целом хорошо. Обычно это разумный способ реализации дерева в ООП-у; a 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 для вызывающего абонента (с использованием IoC контейнер как Ninject или замок Виндзор) , Затем, при необходимости, вы можете легко высмеять IProductRepository для тестирования с вызывающим абонентом.

Таким образом, вы сохраняете фактическую модель (Product) отдельно от «что вы можете делать» с продуктами.

Но, если Product s также необходимо иметь Products (пример: SubProducts), вы могли бы иметь ICollection<Product> на Product, а также.

Смежные вопросы