Вопрос моделирования о категоризации. Подтипить или нет? - PullRequest
0 голосов
/ 04 августа 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 04 августа 2010

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

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

1 голос
/ 04 августа 2010

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

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

...