Использование шаблонов проектирования для моделирования системы подписки - PullRequest
0 голосов
/ 26 октября 2011

Здесь кратко изложены бизнес-требования.

У меня есть объект PricingSchedule, представляющий «подписку» на систему.Мы используем термин «График ценообразования», а не «подписка» на вездесущем языке нашей команды, но теоретически подписка - это одно и то же.

То, что определяет Цену PricingSchedule, является комбинацией двух вещей:1. «продолжительность» PricingSchedule (или сколько времени ваша подписка ... 1 год, 2 года и т. Д.) 2. сколько стилей (другой объект) вы хотите включить в свой PricingSchedule. У вас есть дваварианты включения стилей: 1. оплата за стиль, 2. оплата за все стили

Число 2 - это новое добавленное требование. Раньше именно PricingSchedule определяла продолжительность, определяющую цену.

Моя проблема в том, что ... цена PricingSchedule ничего не значит, когда либо Duration, либо StylePricingType применяются сами по себе. Я могу получить окончательную цену только тогда, когда они объединены вместе, то есть, продолжительность 2 годас 5 стилями.

У нас есть четыре возможных предопределенных продолжительности, от пары дней до 3 или 4лет.

У нас есть два возможных способа выставить счет на выбор стиля;1. за стиль или 2. все стили.Эти две вещи объединились, а затем определили общую цену.

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

public interface IDurationPricingStrategy
public decimal GetDurationPriceFor(PricingSchedule)

public interface IStylePricingStrategy
public decimal GetStylePriceFor(PricingSchedule)

Это хороший способ отделить вещи, которые, вероятно,изменения идут вперед, но в этом и заключается загвоздка;Я не могу реализовать одну Стратегию, не зная «условных условий» другой Стратегии.

Например, для IStylePricingStrategy я реализую опцию ценообразования с неограниченным стилем следующим образом:

public class UnlimitedStylePricingStrategy : IStylePricingStrategy
{
public decimal GetStylePriceFor(PricingSchedule)
{
if (PricingSchedule.Duration.Type == DurationType.OneYear)
{
return decimal x;
}
if (PricingSchedule.Duration.Type == DurationType.TwoYears)
{
return decimal x;
}
}
}

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

Этолегко, если есть только одна «вещь», которая определяет цену для PricingSchedule, но когда у меня есть две такие вещи, вот где я бью стену.

Есть ли другой шаблон, который я могу использовать, иликаким-то образом использовать шаблон стратегии по-другому?Я чувствую, что проблема все еще тянет меня к Стратегии, но я не уверен, как объединить две Стратегии вместо одной.

Большое спасибо!Mike

1 Ответ

1 голос
/ 26 октября 2011

Я думаю, что одним из способов может быть создание интерфейса для продолжительности:

public interface IDuration
{
    int GetDuration();
    decimal CalculatePrice(object whatever); // int something, or whatever.
}

Если ваш класс расписания использует его:

public class PricingSchedule
{
    public IDuration Duration { get; set; }
}

Тогда ваши классы стилей оплаты могут использоватьпродолжительность примерно такая:

public class UnlimitedStylePricingStyle : PricingStyle
{
    public override void GetStylePriceFor(PricingSchedule schedule)
    {
        int duration = schedule.Duration.GetDuration();

      //.....
    }
}

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

. Затем вы можете рассчитать цену следующим образом:

public override void GetStylePriceFor(PricingSchedule schedule)
{
   int duration = schedule.Duration.GetDuration();

   int temp = 34;

   decimal result = schedule.Duration.CalculatePrice(temp);
}

Надеюсь, это даст вам приблизительное представление.

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