0

関心のあるトピックに関するいくつかの問題を読みましたが、まだ結論を出すのに苦労しています. これが冗長な質問である場合は、事前にお詫び申し上げます。

要点を言えば、私の問題は、論理的なペイオフ テストを実装しようとすることです。たとえば、金融商品にはいくつかの条件があり、それぞれの条件によってペイオフが異なります。ただ、条件はどれくらいかは契約するまでわかりません。目標は、新製品が登場するたびに各 if ステートメントをハードコーディングせずに、ペイオフ実装をプログラムすることです。たとえば、条件が 1 つだけの契約を最初に受け取ります。翌日には2条件等で契約。ポリモーフィズムで対応できることは理解できたが、どうしようか悩んでいる。

ペイオフ自体は、ポリモーフィズムを使用してコード化されています。

たとえば、具体的なジェネリック ペイオフ クラスを持つ抽象的なジェネリック ペイオフ クラスがあります。

class cPayoffAbstract
{
private:
public:
   cPayoffAbstract(){}
   virtual cPayoffAbstract* clone() const = 0;
   virtual ~cPayoffAbstract(){} 
   virtual double operator()(double& x) const = 0;
};

class cPayoffConcrete1 : public cPayoffAbstract
{
private:
   double y;
public:
   cPayoffConcrete1(double& argY);
   virtual cPayoffConcrete1* clone() const;
   virtual ~cPayoffConcrete1(){}
   virtual double operator()(double& x) const;
};

class cPayoffConcrete2 : public cPayoffAbstract
{
private:
   double y;
public:
   cPayoffConcrete2(double& argY);
   virtual cPayoffConcrete2* clone() const;
   virtual ~cPayoffConcrete2(){}
   virtual double operator()(double& x) const;
};

次に、より複雑なペイオフのインターフェイスを定義する別のクラスがあります。

#include <cPayoffAbstract.h>
#include <SmartPtr.h>
#include <vector>
class cConditionalPayoff
{
private:
   // Some data members
public:
   cConditionalPayoff(const SmartPtr<cPayoffAbstract>& argPayoffPtr1, const SmartPtr<cPayoffAbstract>& argPayoffPtr2);

   // some methods ...
   double fConditionalPayoff(const std::vector<double>& argXs, double& argY, double& argZ) const;
};

条件がほとんどないコントラクトがあり、条件に応じて、ジェネリック ペイオフ クラスで実装される異なるペイオフがあるとします。

double cConditionalPayoff::fConditionalPayoff(const std::vector<double>& argXs, double& argY, double& argZ) const
{
   for (unsigned long i = 0; i < argXs.size(); i++)
   {
      if (argXs[i] > argY) { return dmPayoffPtr1->operator()(argXs[i]); }
      else
      {
          if (argXs[i] < argZ) { return dmPayoffPtr2->operator()(argXs[i]); }
          else { return argX[i]; }
      }
   }
}

問題は、たとえば、同様の報酬を伴う別の契約が契約でより多くの条件が設計されている場合に発生します。次に、上記の if ステートメントを再コーディングするか、別のメソッドを実装する必要があります。

したがって、目標はfConditionalPayoff、ifs アドホックでコーディングするのではなく、動的な方法で実装することです。

私の再編集がいくつかの誤解を明確にするのに役立つことを願っています. あったらごめんなさい。

ありがとうございました。

4

3 に答える 3

0

あなたの問題についての私の理解は、動的に動作を Contract オブジェクトに追加したいということです。この場合、必要なのは Decorator パターンだと思います。

ここでその説明を見つけることができます: http://www.oodesign.com/decorator-pattern.html

ここにいくつかの説明があります:http://oreilly.com/catalog/hfdesignpat/chapter/ch03.pdf

于 2013-11-04T13:35:15.933 に答える
0

おそらく、ロジックを 2 つの部分 (疑似コード) に分割できます。

class PayOffProcessor;

class PayOffProcessor1 : public PayOffProcessor { ... };
class PayOffProcessor2 : public PayOffProcessor { ... };
class PayOffProcessor3 : public PayOffProcessor { ... };

class PayOffProcessor
{
    virtual void process() = 0;

    static PayOffProcessor * processorForData(double x, double y, double z)
    {
        static PayOffProcessor1 processor1;
        static PayOffProcessor2 processor2;
        static PayOffProcessor3 processor3;
        if (x > y)
        {
            return &processor1;
        }
        if (x < z)
        {
            return &processor2;
        }
        return &processor3;
    }
};

double myclass::conditionalPayoff(std::vector<double>& x, double& y, double& z) const
{
     for (unsigned long i = 0; i < x.size(); i++)
     {
         processorForData(x, y, z)->process();
     }
}
于 2013-11-04T13:30:33.880 に答える
0

ポリモーフィズムは、可能な条件の組み合わせをすべて知っている場合にのみ適用できるため、抽象クラスからそれぞれの組み合わせを派生させ、これらの条件のチェック関数を実装できます。

可能な条件がわからない場合は、ユーザー入力などで定義する必要があります。これには、次のようにアプローチできます。

Input: Vector<Values>, Vector<ConditionType>, Vector<ConditionValue>, Vector<PayOffType>

ConditionType Vector に sth と記述します。"<" または ">" または sth の文字列のように。

void checkConditions(vector<double> values, vector<string> condType, vector<double> condValues, vector<string/int> PayOfftype) {
  for(int i=0; i<values.size(); i++) {
    switch(condType[i]) {
      case("<"):
        if(values[i] < condValues[i]) {
           PayOff po = getPayOffByType(PayOfftype[i]);
           po.payoff();
        }
        break;
      case(">"):
        ...
      break;
      ...
    }
  }
}

条件が適用されない場合は、これにデフォルトのペイオフ タイプを渡すことができます。

于 2013-11-04T15:19:28.853 に答える