Как гибко хранить много цен на товар? - PullRequest
3 голосов
/ 05 февраля 2009

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

Итак, для (небольшого) примера, когда вы приходите в магазин и хотите напечатать визитную карточку, вы решаете, хотите ли вы печатать черно-белую или цветную, если вы хотите выбрать толстую бумагу или тонкую, если вы хотите напечатать 100, 200, 500 или 1000 штук и т. д.

В конце концов, будет цена, скажем, черная и белая, плотная бумага, 200 штук => 40, - $

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

Итак, мой вопрос: как я могу справиться с ценами?

Моя первая идея: Pattern Decorator.

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

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

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

Итак, до создания прототипа мне было интересно, просто ли я слепой, и я не вижу очевидного решения, или, может быть, есть другой способ, более элегантный, о котором я не знаю?

1 Ответ

8 голосов
/ 05 февраля 2009

Ну, идея, которая у меня есть, довольно сложна, но ваше желание также сложно.

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

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

Старайтесь избегать проектирования базы данных, чтобы вы не могли сделать одно или другое. Другими словами, вы ограничиваете будущие возможности (и гибкость клиентов), если используете мастер стиля «выбери свое приключение». Причина в том, что, если я пройду 10 шагов, а затем изменю шаг 2, мне придется пройти еще 8 шагов - это может быть хорошо, если вы гарантируете, что я не дублирую выбор, который я уже сделал, но если я меняю только цвет бумаги. Я не хочу делать те же 8 вариантов снова. Если вы пойдете по этому пути, убедитесь, что вы сохраняете много состояний, чтобы выбранные ими ранее решения отображались как значения по умолчанию в следующий раз.

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

Например, у меня есть три типа бумаги, 3 цвета и 3 процесса:

  • бумага

    • Light
    • Обычная
    • карта
  • цвет

    • красный
    • Синий
    • зеленый
  • Процесс

    • Печать
    • Сложите
    • Bind

Тогда у меня будет цена для каждого матча:

        Light   Regular Card    Red     Blue    Green   Print   Fold    Bind
Light                           0.05    0.05            0.001           0.50
Regular                         0.06    0.05    0.07    0.001   0.02    0.80
Card                                    0.06            0.002           0.90
Print                                                   0.002   
Fold                                                            
Bind                            

Пустые пробелы обозначают элементы, которые нельзя смешивать.
Известные записи:

  • Печать и печать в сочетании - двусторонняя печать чаще изнашивает / застревает в машине.
  • Нельзя пропускать предметы через фальцевальную машину более одного раза (операция сгиба пуста), но вы можете перечислить различные типы сгибов и документы, к которым они относятся
  • Вы не можете связывать сложенные предметы
  • Я не дублировал элементы в матрице (т. Е. Печать на легкой бумаге аналогична печати на светлой бумаге - в зависимости от того, как вы создадите свои запросы, вы захотите обозначить это или сформировать таблицу таким образом, чтобы не имеет значения)

Это всего лишь пример простого воплощения - каждая цена фактически будет ссылкой на другую таблицу, в которой указана цена за каждую, если количество находится в определенном диапазоне (т. Е. 100 может быть дешевле, чем 10). Также будет указано, взимается ли плата за лист бумаги, за операцию или за заказ - и это может сложиться (поэтому у вас может быть обязательный заряд 0,001 за лист бумаги для учета износа на резаках и 0,50 за книгу в переплете по цене за штуку, затем всего за 5 долларов США за установку переплета)

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

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

Вы также можете заполнить матрицу трудом (временем), чтобы дать оценку времени там же, где и оценки цены.

Независимо от того, работаете ли вы с мастером или сразу показывает все на странице, этот бэкэнд будет поддерживать его. Посмотрите, что Dell делает для конфигураций ноутбуков - вы не можете получить определенные вещи с другими вещами. Поэтому, если вы отображаете все параметры на странице, то, когда они меняются с обычной бумаги на карточку, вы можете предупредить их: «Вы также выбрали фальцовку, которая несовместима с карточкой. Вы уверены, что хотите сделать это изменить? "

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

Конечно, выбрать собственный стиль приключений гораздо проще для проектирования и разработки, единственная проблема в том, что если вы добавите новый процесс или документ, вам, возможно, придется обновить 200 деревьев и добавить 50 новых деревьев. Каждое изменение в магазине требует развертывания новой базы данных (и, возможно, программного обеспечения), что задерживает окупаемость капитальных затрат. Если вы сделаете его очень гибким в начале, это будет сложнее сейчас, а потом легче / быстрее.

Более того, вы не ограничиваете своих клиентов вариантами дерева - если они действительно хотят печатать с помощью 4-цветной печати с одной стороны и дешевого копира с другой, они могут изучить этот вариант, если процессы и материалы совместимы. За последние 20 продуктов / процессов вы не можете полностью заполнить дерево.

Наконец, это дает вам очень, очень хороший контроль над затратами. Если ваш бизнес-процесс отслеживает использование машины и затраты (техническое обслуживание и т. Д.) На мелком уровне, вы можете перебить цену вашего конкурента, потому что вы знаете, что ваша машина стоит ровно 0,00234 на страницу, тогда как они застряли на общее предположение. Если вы начнете отслеживать с помощью этой системы и заставите сотрудников отслеживать проблемы, техническое обслуживание и т. Д., Вы можете обнаружить очень странные корреляции, такие как запас красной карточки стоит дороже на фальцевальной машине, потому что она застревает чаще, чем синяя (по любой причине). Вы можете либо скорректировать свои цены (в этой системе в n-й степени), поговорить с производителем бумаги, прекратить предлагать эту опцию, либо принять ряд других тактик, чтобы сжать систему. Если для некоторых из ваших машин требуются квалифицированные операторы, вы можете добавить сотрудников в матрицу с их ставкой оплаты и начать планировать работу, чтобы они работали более эффективно и действенно.

Обновление

Допустим, я выбрал Light Paper, Red Цвет, Печать. Как мне добраться до правильная цена? В двухмерном таблица у меня есть три возможные пары Красный / Печать, Красный / Свет, Печать / Свет. К сожалению, я не могу рассчитать цену в развивающаяся формула у меня просто есть один конечная цена после всех выборов сделал.

Хорошо, я упростил вышесказанное, но давайте сначала предположим простой случай.

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

Итак, в вашем примере вы выбираете Light paper, red, print. Каждый лист красной бумаги стоит 0,05 доллара (дорогая бумага!), А каждый отпечаток стоит 0,001 доллара (дешевая печать), поэтому стоимость одного листа бумаги составляет 0,051 доллара. Если вы делаете 300 копий, то общая сумма составляет $ 15.30.

Поскольку привязка указана для каждого связанного элемента, вы можете добавить привязку к указанному выше порядку, и вы можете связать 50 страниц вместе, всего 6 связанных элементов, 300 страниц. Мы уже знаем стоимость каждого предшествующего преграды, поэтому дополнительная стоимость 6 связанных предметов (по 0,50 долл. США за единицу) составляет 3,00 долл. США, а новая общая сумма составляет 18,30 долл. США.

Есть несколько вещей, которые вы должны будете сделать помимо упрощения, которое я указал выше:

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

Посмотрим, смогу ли я прояснить это ...

Светлая бумага для выбора, красная, с печатью, в переплете (300 страниц, 6 переплетов), проходит по таблице и находит все цены, попадающие в этот набор:

Pricing matrix shows cells where options collide to provide pricing information

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

Я удалил комбинацию «печать / печать», потому что она не будет работать с этим методом (я надеялся упростить вещи, но на самом деле это усложняет ситуацию). Если вы хотите указать двустороннюю печать, вам понадобится другой элемент таблицу (например, Print Reverse), и вы выбрали бы печать и обратную печать. В качестве альтернативы можно использовать два элемента: «печатать на одной стороне» и «печатать на двойной стороне».

Имейте в виду, что хотя я перечислял каждую цену в каждой ячейке, реальность такова, что каждая ячейка на самом деле описывает несколько обстоятельств:

  1. Ссылка на таблицу цен
  2. без стоимости
  3. Ограничение (комбинация невозможна)

Ссылка в # 1 относится к другой таблице, которая содержит цены и третье измерение. Например, ячейка в комбинации «light / bound» будет ссылаться на таблицу, имеющую следующие три атрибута:

  • Цена за страницу
  • Цена за единицу товара
  • Цена за работу (настройка)

Они будут суммироваться в соответствии с количеством страниц и связанных элементов, а затем сверху будет добавлена ​​стоимость за работу.

Больше сложности! Woo!

Это может работать для ваших нужд, но что если у вас есть процессы, которые несовместимы только в определенных более сложных ситуациях?

Прямо сейчас мы можем охватить общий случай, когда один процесс или объект конфликтуют с другим. Однако мы не можем справиться с чем-то более сложным.

Предположим, что светлая бумага может быть напечатана, и ее можно сложить, но ее нельзя печатать и складывать. Мы не можем наложить ограничение на печать / сгиб, так как другие документы можно печатать и складывать.

Есть несколько вещей, которые вы можете сделать:

  • Добавьте третье измерение - но тогда у вас может быть последовательность, которую невозможно сделать, если 4 вещи смешаны вместе, что означает другое измерение и т. Д.
  • Использовать векторы (отобразить / уменьшить)
  • Добавить слой абстракции

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

Дополнительный уровень абстракции - это компромисс между ними. В идеале у вас не будет очень много конфликтов, которые являются более сложными, чем два элемента, но когда вы это делаете, вы определяете новый объект, который представляет комбинацию. Так что в этом случае у вас может быть новый объект / процесс, который представляет собой комбинацию печати и свертывания, и он имеет ограничение на столбец с легкой бумагой.

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

В качестве альтернативы, вы можете использовать алгоритм, который выбирает наибольшую комбинацию - поэтому вместо поиска в базе данных Light, Red, Print, Fold вы сначала будете искать в базе данных комбинации, которые будут возвращать наибольшую комбинацию Light, Red , PrintFold, а затем оцените его как обычно.

Наконец, вы можете искать в базе данных как отдельные, так и комбинаторные предметы, а в случае конфликта (двойная цена комбинации и отдельных предметов) вы можете либо выбрать:

  • Наибольшая стоимость
  • Величайшая комбинация
  • Приоритетные затраты (т. Е. Каждой цене назначен приоритет, и вы сравнили их во время конфликтов и выбрали тот, который имеет приоритет)

-Adam

...