2012-01-13 11 views
7

多分、私は見ていないこの周りに簡単な方法があるので、誰かがそれを私に説明できることを願っています。ブーストと外部データソースを備えたフライウェイト

のは、私はクラスがあるとしましょう:

class A { 
public: 
    const double parameter; 
    const std::string name; 
    const std:: string fileName; 

    A(const double parameter, const std::string name, const std::string fileName) : 
     parameter(parameter), name(name), fileName(fileName) {}; 
}; 

そして、そのクラスの発電機がある:潜在的に数百万人が存在しますので、

class AReader { 
public: 
    ifstream dataFile; 
    AReader(const std::string filename); 
    A* readObject(const std::string objectName); 
}; 

私はこれらのAオブジェクトを処理するためにboost::flyweightを使用したいです実際には多くのデータが含まれています。それらはnamefileNameに一緒にハッシュされます。

この作品を制作するには何が必要ですか?私はboost::flyweightAReader.readObjectを呼び出し、結果のAクラスをハッシュ/ストアする必要があります。

AReaderはフル工場になり、カスタム工場として使用する必要がありますか?あるいは、フライウェイトのデフォルトファクトリを使用して、AReaderインスタンスを生成してAReaderインスタンスをフライウェイトのインスタンスの引数にすることで、Aインスタンスを生成できますか?または、第2のクラスに頼らずに外部データソースから公開変数(一度設定しても変更されない)を取得することは可能ですか?

編集

私はまた、ブーストを使用していない他の提案に開いています。私は確かに自分自身のフライウェイトの実装を書くことができます、または他のパターンは、より適している場合。しかし、すでに存在しているものを使うことができれば、それが一番良いでしょう。いつものように、デッドラインは短いので、書く必要のあるコードの量を最小限に抑えます。

答えて

1

私はBoost :: flyweightを使用していませんが、見た目から見ると、少なくともAssignableEqualityComparableHashableに加えて)の鍵が必要です。あなたのconstのメンバーは、ではないAssignableです。あなたがキー抽出器を持っている場合、それの外見から、Assignableを作る必要はありません。鍵エクストラクタを使用する場合、鍵はAssignableである必要があります。

+0

フライウェイト(アサイナブルではなくキー抽出器)に 'A 'を得るために必要なことを処理しますが、' A'を生成するヘルパークラスを使用する唯一の方法ですそれをフライウェイトが使用する完全な工場にする(必要なストレージや他の方法を実装する)? – tpg2114

0

あなたのケースでフライウェイトを使用する基本的な方法は、readObjectがフライウェイトを返すことです。 内部的には、readObjectは新しいオブジェクトを作成し、対応するflyweightオブジェクトを作成すると、そのオブジェクトがすでにflyweightストア内にあるかどうかをチェックします。そうであれば、新しいオブジェクトを削除し、ストア内のオブジェクトを参照するフライウェイトを返します。そうでなければ、新しいオブジェクトをプールに追加します。

これは実装が簡単なはずですが、ユースケースによっては非効率的である可能性があります。パフォーマンスを向上させるには、key_valueの機能を使用します。キーを使用してオブジェクトを参照したり、ストアにまだ存在していないオブジェクトのみを作成したりすることができます。

0

key_valueフライウェイトは法案に適合しているようですが、マイナーなヒッチがあるようです。 キータイプ(key_value flyweights)のパラメータを1つだけ使用して、key_valueフライウェイトを構築できるはずです。だからあなたが望むキー(ファイル名+名前)で動作させるには、2つのフィールドを1つにまとめる必要があります(tuple?それでもうまくいくかどうかは分かりません)。

ほとんどの仕事量が最も少ないのはなぜですかFlyweightあなたのクラスの文字列はFlyweight Basicsで示されていますか?

これは、オブジェクトがハッシュされていないことを意味しますが、文字列は簡単にフライウェイトされます。これらのは、メモリに問題のあるフィールドになります。 (これが過度に単純化されていない限り)

関連する問題