как смоделировать требования этого счета - PullRequest
0 голосов
/ 25 сентября 2019

В какой-то бизнес-сфере я получил требования к выставлению счетов следующим образом:

+ Invoice Items are of two types: a service or a fee.
    - Invoice Service Item is taxable. fee is not.
+ Invoice Items (services and fees) cost is calculated in two manners: 
    - As a whole: the service or fee has a fixed cost.
    - By Individual: the cost is multiplied by Individuals count.

Я читал о шаблонах проектирования, проектировании, управляемом доменом, наследовании и полиморфизме, и я хотел практиковать то, что узнал вэта сторона нового проекта.Я хочу перейти на модель для субдомена Invoicing, который фиксирует вездесущий язык домена.Я пришел к этой модели, но это не правильно!model

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

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

Я также избегаю проектировать классификацию как структуру, поскольку она делает вашу модель менее гибкой.Структура должна отражать «фиксированные» биты, которые действительно не будут меняться, такие как Invoice / InvoiceItem. тип элемента счета, по-видимому, подходит для классификации.Эти вещи сложно обнаружить, но когда у вас взрыв класса, это может быть красный флаг.Как только специалисты по доменам начинают разбивать понятия на «типы», вы, вероятно, рассматриваете классификационную структуру сорта.

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

Имейте в виду, что будут технические детали реализации, которые не собираютсябыть частью UL, так что не беспокойтесь о том, чтобы каждая часть UL была представлена ​​как класс.Если у вас есть поведение объекта и форма UL, записанные в той или иной форме, и UL может быть полностью представлен, у вас не должно быть никаких проблем.

1 голос
/ 26 сентября 2019

Когда вы моделируете объекты, старайтесь думать о их поведении, а не только о данных, которые нужно хранить.Сосредоточение на данных часто приводит к анемичным моделям данных.Если вам нужно рассчитать стоимость и налог, как насчет этого?

internal class InvoiceItem : ValueObject
{
    private readonly string _description;
    private readonly decimal _cost;
    private readonly int _amount;

    private InvoiceItem(string description, decimal cost, int amount)
    {
        _description = description;
        _cost = cost;
        _amount = amount;
    }

    public decimal TotalCost()
    {
        return _cost * _amount;
    }

    public decimal Tax(ITaxCalculationPolicy taxCalculationPolicy)
    {
        return taxCalculationPolicy.CalculateTax(TotalCost());
    }

    public static InvoiceItem ByWholeInvoiceItem(string description, decimal cost)
    {
        return new InvoiceItem(description, cost, 1);
    }

    public static InvoiceItem ByIndividualInvoiceItem(string description, decimal cost, int amount)
    {
        return new InvoiceItem(description, cost, amount);
    }
}

internal interface ITaxCalculationPolicy
{
    decimal CalculateTax(decimal cost);
}

internal class ServiceTaxPolicy : ITaxCalculationPolicy
{
    private const decimal TaxPercent = 0.18m;

    public decimal CalculateTax(decimal cost)
    {
        return cost * TaxPercent;
    }
}

internal class FeeTaxPolicy : ITaxCalculationPolicy
{
    private const decimal TaxValue = 0;

    public decimal CalculateTax(decimal cost)
    {
        return TaxValue;
    }
}

Если вы не хотите, чтобы клиент решал, какой тип ITaxCalculationPolicy следует использовать, вы также можете попробовать передать какой-либо метод ITaxCalculationPolicyFactory в Tax().Чем вам нужно будет хранить тип элемента счета-фактуры внутри него и передавать его на этот завод при расчете налога.

...