2010-08-04 3 views
0

Мне нужен совет по моделированию этой простой категоризации (?) Пример:
У меня есть продукт. Продукт может быть разных типов, например ProductType 1, ProductType 2 и ProductType 3. Все продукты имеют номер детали и имя. Там, где они различаются, это способ расчета их цен.Моделирование вопрос о категоризации. Подтип или нет?

  • Изделия в цене типа 1 зависят от количества продукта. Поэтому, если у меня есть 5 продуктов, цена равна $ x. Если у меня 20 продуктов, цена $ y и так далее.
  • Изделия в цене типа 2 зависят от веса каждого продукта. Если вес составляет 5 кг, цена равна $ x и так далее.
  • Изделия типа 3 имеют простую цену, например, $ x для каждого продукта.

Как я вижу, каждая «ценовая структура» должна иметь выделенный стол/класс. Затем продукт будет ссылаться на свою ценовую структуру в зависимости от типа продукта. Вы бы просто создали таблицу «тип продукта» и получили атрибут «Тип» в классе «Продукт», или вы бы использовали обобщение, так что продукт 1/2/3 является подтипом продукта? Будет 5 различных ценовых структур, а способ расчета цены отличается от каждого типа. Таким образом, логика расчета общей цены заказа зависит от каждого типа продукта.

Можете ли вы дать мне несколько советов о том, как смоделировать это наилучшим образом? Если я выберу подход, в котором есть атрибут Type в классе Product, я предполагаю, что в моем коде будет получено множество инструкций if-else. Если я захочу подклассифицировать их, каждый класс может нести ответственность за расчет правильной цены или за то, что просят сделать.

+0

Для продуктов определенного класса, зависит ли цена от фактического номера детали или она одинакова для всех продуктов этого класса? Например, все продукты типа 3 оцениваются точно в $ x, или вы просто подразумеваете, что они фиксированы и не зависят от веса/количества? – samitgaur

+0

Предположим, что я продаю 2000 штук одного продукта. Если продукт относится к типу 1, цена будет рассчитываться с использованием ценовой структуры типа 1. И если он находится в типе 2, нужно будет использовать другой расчет и так далее. Отвечает ли это на ваш вопрос? –

+0

Я не согласен с тем, что подклассификация наилучшего подхода к этому дизайну (см. Мой ответ ниже).В стороне, это обсуждение stackoverflow имеет много хороших отзывов о сопоставлении иерархии объектов в реляционной БД: http://stackoverflow.com/questions/3413459/designing-sql-database-to-represent-oo-class-hierarchy/3427434# 3427434 – mikemanne

ответ

1

Это звучит для меня как прекрасный пример того, когда следует использовать Strategy pattern. Если вы используете наследование класса, чтобы определить, как оценивается продукт, вам придется перекомпилировать всю систему, если кто-то позже решит, что WidgetXYZ теперь должен быть оценен по весу, вместо простой цены.

Я бы определил каждый продукт как имеющий «ценовую стратегию» - в вашем случае это будет либо «volumeDiscount», «byWeight», либо «simple». Затем вы можете использовать Factory, чтобы обеспечить правильный объект PriceCalculator в зависимости от стратегии продукта, и что priceCalculator рассчитает цену продукта соответствующим образом.

+0

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

+0

Я успешно реализовал стратегию и заводские шаблоны для решения моей проблемы, и это похоже на хорошее решение. Спасибо! –

1

Мое предложение состоит в том, что в вашей реляционной модели данных у вас будет столбец типа, чтобы отличить тип записи. В коде вы должны обязательно использовать подкласс. Модель домена должна быть как можно больше независима от базовой модели данных, и ваше описание хорошо поддерживает необходимость совместного использования атрибутов (с использованием ABC - абстрактного базового класса для продукта), подтипа P1, P2, P3 (дать ему значимое имя домена) и полиморфизм для изменения расчета цены.

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

+0

Благодарим вас за комментарий. Почему бы не моделировать подклассы, как описано здесь? http://www.tomjewett.com/dbdesign/dbdesign.php?page=subclass.php –

+0

Подкласс подкласса в db не подходит для вашего сценария. Когда ваш подкласс имеет отличительный набор атрибутов, вы затем рассмотрите это как в приведенной ссылке примера. В вашем случае единственным вариантом является тип и вычисление, которое выводится и не сохраняется/кэшируется в поле в db. Если вы моделируете его в db, вы получите таблицу Product с тремя другими таблицами Product, и все, что у нее есть, есть FK с соотношением 1: 0. –

+0

Хорошая точка. Большое спасибо. Я по-прежнему открыт для других комментариев и предложений. –

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