По логике, модель со скидкой может быть чем угодно , поэтому вы не можете предполагать, что можете запрограммировать все случаи заранее. Никто, отвечая на ваш вопрос, не может быть полностью уверен, что вам действительно нужно. Однако при условии, что вы получаете обычные виды скидок, которые можно найти в реальном мире ...
Большой вопрос в том, будут ли запрограммированы скидки или вы хотите, чтобы пользователи вводили их. Как упомянуто выше, вы никогда не сможете запрограммировать их, но обычно цель состоит в том, чтобы попытаться сделать их более вводимыми, как в обычных случаях, а не программировать их все. Это в некоторой степени относится, даже если для создания всех скидок используются программисты.
Мартин Фаулер упоминает «Метод индивидуального экземпляра» в «Шаблонах анализа: многократно используемые объектные модели» как часть того, как реализовать «Правила публикации» для систем бухгалтерского учета, но правила кажутся довольно схожими с вашими. Я бы дал больше деталей, но это работа, защищенная авторским правом и
Для пользовательского интерфейса вам нужно либо придумать довольно простые варианты использования, либо создать интерпретатор и построитель запросов. Возможно оба: один для простых случаев и еще один продвинутый. Если вы действительно пишете интерпретатор, это, вероятно, довольно хороший случай для использования шаблона Интерпретатор, поскольку его относительно просто кодировать по сравнению с генератором синтаксического анализатора, и более медленное время анализа, вероятно, не будет иметь большого значения. (Если вам нравится использовать генераторы парсеров, не позволяйте мне останавливать вас).
Однако не пытайтесь делать все с помощью переводчика - в какой-то момент вы просто программируете на своем собственном непристойном языке, так что вы могли бы также использовать и настоящий. Если ваш интерпретируемый язык поддерживает функции (вероятно, он должен вызывать их - определение их сомнительно), они могут быть закодированы на реальном языке. Не идите дальше по этой дороге, чем нужно.
Независимо от того, что вы делаете, в конечном итоге кто-то захочет, чтобы скидка основывалась на том, были ли они приобретены в течение 30 рабочих дней с момента продвижения по службе, причем рабочие дни учитываются только в том случае, если в регионе не было праздников, определенных почтовым индексом магазина или клиентом. Почтовый индекс. Поэтому не пытайтесь спроектировать идеальную систему заранее - предположим, что вам иногда потребуется написать код для новых видов скидок и разработать соответствующий дизайн.