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);
};

これらのオブジェクトへの参照は数百万になる可能性があり、実際には大量のデータが含まれているため、boost::flyweightこれらのオブジェクトを処理するために使用したいと思います。Aそれらは一緒にハッシュされnameますfileName

これを機能させるには何が必要ですか?結果のクラスboost::flyweightを呼び出しAReader.readObjectてハッシュ/保存する必要があります。A

AReaderフルファクトリになり、カスタムファクトリとして使用する必要がありますか?または、フライウェイトでデフォルトのファクトリを使用し、インスタンスをフライウェイトの何かへの引数にすることによって、インスタンスAReaderを生成するために使用することは可能ですかA(ファクトリに必要なストレージパターン全体を実装するのではなく) ?AReaderまたはconst、2番目のクラスに頼ることなく、外部データソースからパブリック変数を取得することは可能ですか(つまり、一度設定すると変更されません)?

編集

Boostを使用しない他の提案も受け付けています。私は確かにフライ級の独自の実装、またはより適している場合は他のパターンを書くことができます。しかし、私がすでに存在するものを使用できるのであれば、それが最善でしょう。いつものように、締め切りが短いので、私が書く必要のあるコードの量を最小限に抑えるものは何でも。

4

3 に答える 3

1

私は Boost::flyweight を使用していませんが、その見た目から、少なくともキーは ( and に加えて) である必要がありAssignableます。あなたがタイプするあなたのメンバーでは、明らかにそうではありません。見た目からして、キーエクストラクタがあれば作る必要はありません。キーエクストラクタを使用すると、キーのみが必要になります。EqualityComparableHashableconst AssignableAssignableAssignable

于 2012-01-13T23:47:34.813 に答える
0

key_valueFlyweight は法案に適合しているように見えますが、小さな問題があるようです. key_valueキー型 ( key_value flyweights ) のパラメーターを 1 つだけ使用して Flyweight を構築できるはずです。したがって、必要なキー(ファイル名+名前)で機能させるには、これら2つのフィールドを1つにパックする必要があります(タプル?それが機能するかどうかさえわかりません。)

最小の作業量で最大の結果を得ることに関心があると仮定すると、 Flyweight BasicsFlyweightで示されているように、クラス内の文字列だけではないのはなぜですか?

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

于 2012-01-22T12:06:00.987 に答える
0

あなたのケースで flyweight を使用する基本的な方法は、readObject が flyweight を返すことです。内部的に、readObject はまったく新しいオブジェクトを作成し、対応する flyweight オブジェクトを作成すると、そのオブジェクトが既に flyweight ストア内にあるかどうかをチェックします。その場合、新しいオブジェクトをドロップし、ストア内のオブジェクトを参照する flyweight を返します。そうでない場合は、新しいオブジェクトをそのプールに追加します。

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

于 2012-01-21T19:51:43.193 に答える