мне не ясно, спрашиваете ли вы, как смоделировать абстрактную проблему, которая указана на вашем примере, или вы пытаетесь смоделировать бизнес-концепцию ценообразования финансовых инструментов в контексте реального мира.Я думаю, что это последнее, потому что вы достаточно конкретны, поэтому я прокомментирую это.В этом случае я сомневаюсь, однако, что любой из ваших двух подходов достаточно сложен, чтобы удовлетворить потребности вашей задачи.Я работаю в этой области несколько лет.
Я не уверен, в какой сфере бизнеса вы работаете. В области, в которой я работал (банковское дело), разница между чистой и грязной ценойпростая бизнес-концепция.Например, для облигаций, оцененных по амортизированной стоимости, чистая цена - это стоимость дисконтированного денежного потока без учета начислений и отсрочек, грязная цена - это сумма чистой цены и начислений / отсрочек.Во всех известных мне случаях чистая цена - это разница между грязной ценой и в большинстве случаев простыми функциями некоторых показателей финансового инструмента (FI для краткости), а чистая и грязная цена являются только показателями, которые имеют отношениедля некоторых (но не для всех) видов финансовых инструментов.
С другой стороны, в зависимости от ОПБУ и сферы деятельности вопрос о том, нужно ли вам указывать чистую или грязную цену или и то, и другое, может зависеть от того, какой книге назначен финансовый инструмент, например, банковской книге/ торговая книга.Для торговой книги, которую вы обычно хотите получить только за грязную цену, чистая цена актуальна в банковской книге.
Что еще хуже, FI может быть, например, переназначен, что приведет к тому, что другой набор ключей станет актуальным.Вы должны убедиться, что ваш дизайн учитывает последствия таких изменений, если это уместно в вашем контексте.
Лично я бы начал с подхода, изложенного следующим образом:
создать абстрактный класс / интерфейс для финансового инструмента
для каждого типа FI, определить подкласс
создать список всехпоказатели, которые могут стать релевантными для любой возможной FI, имеющейся в вашей области - в вашем примере: чистая цена и грязная цена, и, вероятно, одна для показателя, представляющего разницу.Дополнительно создайте фиктивную запись показателя цены.
для каждого из этих показателей, создайте интерфейс показателя с методами, релевантными для KF.Например, рассчитать, обновить - это зависит от вашей общей модели.Опять же для вашего примера: чистый интерфейс цены, грязный интерфейс цены, дельта-интерфейс и интерфейс цены.Может возникнуть необходимость определить порядок, в котором они должны обновляться.Набор методов интерфейса цены должен быть подмножеством чистого и грязного интерфейса цены
для каждого типа FI, создать определенную реализацию (класс) для всех интерфейсов показателейрелевантные для этого типа FI, принимая во внимание, конечно, повторное использование.Строго избегайте использования операторов if / else или switch в зависимости от показателя или типов FI в этих реализациях. Если это окажется необходимым, вам понадобятся дополнительные определения классов.Теперь, когда вы создаете экземпляр класса, представляющего FI, используйте шаблон фабрики для создания экземпляров интерфейсов показателей.То есть вы выбираете экземпляр экземпляра FI, какой метод использовать для расчета, тогда экземпляр FI знает, как рассчитать показатели FI.Приятной особенностью фабричного шаблона является то, что вы можете дополнительно принять во внимание книгу, для которой вы рассчитываете, а также другие параметры, даже во время выполнения, если это необходимо.Фабрика позволит интерфейсу показателя цены просто указывать на экземпляр, который имеет отношение к контексту.
то, что вы называете службой калькулятора, будет затем, для расчета цены, вызывать метод интерфейса с ключом цены, но экземпляр, на который указывает интерфейс, предоставляется экземпляром FI, потому что фабрика просто отобразилаинтерфейс цены к интерфейсу чистой цены или интерфейс грязной цены в зависимости от того, что является правильным для данного конкретного FI в этом конкретном контексте.
Если вы используете, как предлагается, список соответствующих показателей и реализаций интерфейса расчета показателей в экземпляре FI, вы можете даже обновить / обменять его во время выполнения, если FI переназначен,без необходимости удалять / воссоздавать экземпляр FI.
Надеюсь, я не сделал ваш вопрос более сложным, чем на самом деле.
С уважением,
Томас