Объекты-объекты - полиморфизм

У меня есть финансовое приложение, которое обрабатывает "облигации". Мне необходимо

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

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

Instruction[Id,BondReference,Action,Value]

например, инструкции проголосовать " да " за резолюцию, принятую по облигации

Instruction
{
    BondReference: Bond1,
    Action: Vote
    Value: VoteYes
    ResolutionReference: Resolution1
}

и Бонд

Bond
{
    Id: 1,
    Reference: Bond1
    Resolutions: [
                     {Resolution1: We have resolved to increase our stake in Google},
                     {Resolution2: We have resolved to fire the CEO}
                     ...
                 ]
    Instructions: [Inst1,Inst2,Inst3...]
}

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

Мне посоветовали использовать доменный сервис для обработки новой инструкции.

BondService
{
    public void Apply(Instruction newInstruction)
    {
        var bond = _bondRepository.GetByReference(newInstruction);
        bond
            .RecalculateNominalValue(newInstruction)
            .CalculateInterest(newInstruction)
            .CancelInstruction(newInstruction)
            .Approve(newInstruction);
    }
}

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

Теперь мой вопрос

  1. Это лучший способ моделировать?
  2. А для расчета в зависимости от типа облигации расчет отличается. Поэтому я хочу реализовать полиморфизм. Мне сказали, что мне нужно использовать фабрику для создания правильной реализации. Это лучший подход?

Для BondType 1,3,5 я использую калькуляцию A, для bondType 2,7... мне нужно использовать калькуляцию B. Как мне установить различные типы калькуляции??? NB, я хорошо разбираюсь в полиморфизме, однако я не смог найти убедительных примеров того, как создать правильную реализацию. Спасибо за чтение этого далеко...

1 ответ

Решение

Несколько мыслей:

  • Instruction похоже, что он служит для команды DTO и объекта значения, используемого для хранения контрольного журнала. Развяжите эти два понятия.

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

  • Примером доменной службы на самом деле является служба приложений или обработчик команд. Служба приложений координирует репозитории и делегатов для объектов домена. Чтобы наилучшим образом реализовать службу приложения, делегируйте как можно больше бизнес-логики объектам домена. Bond в этом случае. Поэтому имейте Bond Сущность решает, какие именно типы поведения следует вызвать, чтобы служба приложения вызывала только один метод для этой сущности.

  • Чтобы обеспечить полиморфизм, создайте объект значения, чтобы разрешить представление различных типов связей. Пусть объект Bond делегирует это значение типа полиморфной связи. Вам может понадобиться фабрика для первоначального создания экземпляра этого типа облигации VO, но как только она связана с сущностью Облигации, вам больше не нужно вызывать фабрику, облигация просто ссылается на тип облигации VO.

Другие вопросы по тегам