Libraryに要求される2つの要請の内、2つ目について説明します。ある具体的な金融商品について、価格計算の方法は、1つとは限らない事、さらにユーザーは様々な理由で複数の計算方法を使う場合がある、という事です。株のヨーロピアンオプションで考えてみましょう。Volatility(オプション価格に内包されているVolatility)を計算したいと考えます。Modelのカリブレーション(パラメータの調整)を行って、より複雑なオプションの価格計算に使ったりします。scheme(有限差分法)を使ったアルゴリズムの計算結果を比べて、有限差分モデルの検証に使ったりします。variate(訳注:モンテカルロシミュレーションによる解の収束速度をアップさせる為の制御変量)として使ったりします。従って、ひとつの金融商品について、複数の方法で価格計算ができるような仕組みにしたい訳です。)メソッドを複数個実装するという方法は、望ましくありません。する為には、ひとつの金融商品について、複数のクラスを作らなければならなくなるからです。)メソッドは、派生クラス毎に、ひとつだけ実装する事を想定している為。する為には例えば、EuropeanOptionクラスから、AnalyticEuropeanOptionクラスとMcEuropeanOptionクラスを派生させる事になりますが、この方法だと、2つの点で問題があります。概念的に考えて、ひとつの商品の為にふたつの箱を用意するようなものです。Steinの言い回しを使えば、「ヨーロピアンオプションがヨーロピアンオプションであると言っているのは、ヨーロピアンオプションはヨーロピアンオプションであるという意味である。使用上の問題として、run-time(プログラム実行時)に価格計算方法の変更ができないという点です。Patternを使う事です。その商品のオブジェクトに、価格計算方法をカプセル化した他のオブジェクトを持たせる事です。Engineと呼ぶことにします。Engineに、計算に必要な引数を渡し、そのEngineが価格計算を行い、そのEngineから計算結果を返させるような仕組みが想定されます。)の実装は、おおむね下記のようなプログラムコードになると推察されます。Engineで実装する事が想定されます。残念ながら、この方法によるアプローチは、想定通りに機能しません。)の実装部分)を、ベースクラスの中で1回の実装で済ませたいのに、それが出来ないという事です。Engineの引数を知る余地がありません。それらはInstrumentの派生クラス毎に、数も型も千差万別です。Engineが返す計算結果についても言えます。Value(市場レートにフィットした固定金利の水準)を計算して返す事が想定されますが、一般的なヨーロピアンオプションでは、価格以外に様々なGreeks(訳注:ギリシャ文字、転じて様々なリスク感応度のこと。)を返す事も想定されます。Engineに渡す引数を明示して列挙するようなインターフェースは、望ましくない結果をもたらします。Engineは、当然ながら異なったインターフェースを持つはずであり、それを一本のベースクラスで表現する事はできません。Engineのcalculate()を呼び出すメソッドは、Instrumentの派生クラス毎に作り直さなければならなくなります。そこに大変な困難が存在します。resultsという柔軟な構造体でやりとりする方法でした。Engineオブジェクトに保持させます。Engineの持つ引数と返し値の情報を、書き込んだり読み込んだりできるようにします。resultsクラス、さらに、補助的役割を持つGenericEngineクラス・テンプレートのコードを示します。)メソッドのみを実装すれば良いだけです。argumentsとresultsクラスには、使いやすいように(入力データの)ドロップBoxを使えるメソッドが備え付けられています。)メソッドは、入力データとして受け取った引数が、有効なデータ範囲の中に納まっているかどうかチェックする機能をもっています。Engineが価格計算を開始する前に、前回計算した結果を消去します。)の実装例を示すことができます。Methodパターンも使って、Instrumentの派生クラスで足りない機能を書き加えられるようにしています。インナークラスのInstrument::resultsクラスが定義されている所に注意して下さい。Engine::resultsクラスから派生しており、個別のInstrument用の計算結果を保持します。(Instrument;;resultsクラスは、std;;mapオブジェクトをメンバー変数として保持しており、そこに追加の計算結果を保持できるようになっています。それを記述したコードは下記では省略されています。resultsの各クラス)に作業分担されています。Sequence)をよく見て下さい。