2010-06-07 2 views
2

Мне нужно запрограммировать некоторые финансовые приложения, где я должен представлять график потоков. Потоки могут быть 3-х типов:Наследование по сравнению с конкретными типами в области финансового моделирования для денежных потоков

  • плата потока (только единовременная оплата в какой-то даты)
  • потока с плавающей процентной ставкой (поток зависит от процентной ставке, которая будет определена позднее)
  • потока фиксированной ставки (поток зависит от процентной ставки определяется, когда дело сделано)

мне нужно держать всю информацию, и мне нужно, чтобы представить график этих потоков. Первоначально я хотел использовать наследование и создать три класса FeeFlow, FloatingFlow, FixedFlow все наследуемые от ICashFlow и реализовать какой-либо метод GetFlowType(), возвращая enum, тогда я мог бы dynamic_cast объект нужного типа.

Это позволит мне иметь только один vector<IFlow> для представления моего графика.

Что вы думаете об этой конструкции, следует ли использовать три вектора vector<FeeFlow>, vector<FloatingFlow> и vector<FixedFlow>, чтобы избежать динамических бросков?

+0

Что общего между этими классами? –

+0

Они нуждаются в очень разных входных данных, которые следует оценивать. – BlueTrin

+1

Хотя этот вопрос явно принадлежит здесь, рассмотрите возможность участия в тангенциальном обсуждении здесь: http://area51.stackexchange.com/proposals/117/quantitative-finance. – Shane

ответ

8

Зачем вам нужны динамические приводы? Создайте подклассы потока по тому же интерфейсу полиморфно, тогда нет необходимости делать что-либо.

Если им нужны очень разные входы, вы можете попробовать передать разные входы в качестве параметров конструктора, тем самым очистив общий интерфейс. Однако, если вы действительно не можете определить общий интерфейс для них, возможно, они лучше реализованы как независимые классы.

1

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

0

Я думаю, что шаблон стратегии подойдет вам лучше всего.

Вы реализуете класс CashFlow, который содержит свойство CashFlowStrategy, которое выполняет обработку.

Я не в полной мере понять требования и различия между потоками, но что-то, как это могло бы работать (мета-C++, а не действительный код):

class CashFlowStrategy { 
    public: 
    virtual void ProcessFlow(Account from, Account to); 
} 

class FixedRateCashFlowStrategy : public CashFlowStrategy { 
    public: 
    void ProcessFlow(Account from, Account to) { ... } 
} 

class CashFlow { 
    private: 
    CashFlowStrategy strategy; 
    public: 
    CashFlow(CashFlowStrategy &strategy) { this->strategy = strategy; } 
    void Process() { this->strategy->ProcessFlow(this->from, this->to); } 
} 

Вам нужно только std::vector<CashFlow>, решение о том, чтобы сделать обработку, скрыта в стратегии, поэтому вам не нужно заботиться об этом.

+0

Как это выгодно, просто имея виртуальную функцию в базовом классе или интерфейсе CashFlow? Я думаю, это просто превзошло все. YAGNI. –

0

Похоже, у вас есть разные графики и различные типы депозитов, которые в совокупности составляют финансовый поток. Решение звучит так, как будто шаблон стратегии может работать как по графику, так и по положению. Хотя, если у вас есть место, возможно, стоит рассмотреть функциональный подход. Выражение лямбда даст вам одну и ту же логику с десятой части кода ...