Наследование против определенных типов в Финансовом моделировании для денежных потоков - PullRequest
2 голосов
/ 07 июня 2010

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 07 июня 2010

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

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

1 голос
/ 07 июня 2010

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

0 голосов
/ 07 июня 2010

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

0 голосов
/ 07 июня 2010

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

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

Я не до конца понимаю требования и различия между потоками, но что-то вроде этого может работать (meta-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>, решение о том, как выполнять обработку, скрыто в стратегии, поэтому вам не нужно об этом заботиться.

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