Какую архитектуру я могу использовать для обработки корзины покупок, где каждый продукт требует сохранения различных атрибутов - PullRequest
4 голосов
/ 13 ноября 2008

Я создаю приложение, очень похожее на корзину. Пользователь выбирает продукт из списка, а затем на основе этого продукта необходимо установить и сохранить несколько свойств.

Пример.

Если пользователь выбирает тип краски, который позволяет настраивать совпадения цветов, я должен разрешить им вводить номер формулы, полученный им в процессе сопоставления цветов. Итак, у меня есть элемент Order Order для Product, который является типом Paint, и у этого sku есть атрибут «AllowsCustomColorMatch», но мне нужно также где-то хранить номер формулы.

Я не уверен, как элегантно справиться с этим в моем коде. Должен ли я создавать подклассы или продукты? Прямо сейчас я сохраняю данные, которые пользователь вводит в объект OrderDetails, имеющий ссылку на продукт, с которым он связан.

Ответы [ 4 ]

5 голосов
/ 13 ноября 2008

У вас может быть класс Product с набором свойств продукта

    public class Product
    {
        private Dictionary<string, string> properties;

        /// <summary>
        /// Gets or sets the name.
        /// </summary>
        /// <value>The name.</value>
        public string Name
        {
            get;
            set;
        }

        /// <summary>
        /// Gets or sets the price.
        /// </summary>
        /// <value>The price.</value>
        public double Price
        {
            get;
            set;
        }

        public Dictionary<string, string> Properties
        {
            get;
        }

        public Product()
        {
            properties = new Dictionary<string, string>();
        }

    }

В источнике данных у вас может быть таблица, которая определяет свойства для каждого типа продукта. Затем, когда вы отображаете страницу, вы знаете, какие свойства показывать и какое имя давать в словаре.

2 голосов
/ 13 ноября 2008

Я бы не стал делать уроки для каждого продукта. Каждый из ваших продуктов - экземпляров того же класса продукта.

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

0 голосов
/ 29 ноября 2008

Поскольку вы ищете элегантное решение, вы можете взглянуть на архитектурный стиль адаптивной объектной модели. Вы можете искать здесь или здесь . По сути, вашу проблему можно решить, просто используя шаблон TypeSquare, возможно, с шаблоном интерпретатора для бизнес-правил (если он когда-либо усложняется).

0 голосов
/ 29 ноября 2008

В зависимости от того, какие у вас текущие настройки объектов; Я бы создал 2 класса рисования. Первый класс Paint принимает все общие свойства / поля, найденные в paint. Я бы тогда создал второй класс, назовем его PaintSpecialize. PaintSpecialize наследует от Paint (предоставляя этому классу все свойства и методы Paint). В PaintSpecialize вы можете добавить свойство Formula к классу. После чего это просто вопрос приведения объектов. C # ex:

public class Paint {
private decimal _price;
private bool _allowFormula;

public Paint() { ... }
public Paint(int price) {
   _price = price;
}
public ChangePrice(decimal p) {
      _price = p;
   }
}

и т. Д.

PaintSpecialize будет выглядеть примерно так:

public class PaintSpecialize : Paint {
string _formula;
[...]
public PaintSpecialize(int price, string formula) : base(price) {
   _formula=formula;
}

После кода можно:

PaintSpecialize ps  = new PaintSpecialize(15.00, "FormulaXXYY");
ps.ChangePrice(12.00);
List<Paint> plist = new List<Paint>();
plist.Add((Paint)ps);
foreach(Paint p in plist) {
if(p.AllowFormula) {
  PaintSpecialize tmp = (PaintSpecialize)p;
  MessageBox.Show(tmp._formula);
}

Приведенный выше код дает простой (и не очень полный) взгляд на то, что вы можете сделать с краской. Теперь список может содержать как Paint, так и PaintSpecialize, если последний приведен правильно. Вы можете в любое время манипулировать PaintSpecialize в списке простым преобразованием из простой Paint в PaintSpecialize.

Так что, если клиент хочет обычную рисование, создайте объект Paint, если он хочет пользовательскую рисование, создайте PaintSpecialize. Если клиент хочет обычную и нестандартную краску, создайте одну из них. Обращайтесь к ним обоим как к Paint, пока вам не понадобится что-то из класса PaintSpecialize.

Обратите внимание, что атрибут AllowsCustomColorMatch должен быть установлен в базовом классе, иначе вам, вероятно, придется потрудиться, чтобы выяснить, относится ли класс к типу PaintSpecialize.

...