0

私のベース フレームワークでは、複数のプロジェクトで再利用できるクラスを用意したいと考えています。ほとんどの場合、これらは柔軟性を持たせるために一般的なものです。

データを保存してデータを簡単に取得するために使用する小さな小さなヘッダーが 1 つあります。

#pragma once
#include <map>
#include <string>

namespace BaseFrameWork
{
template<class TValue, class TKey = std::string>
class Provider
{
public:
  static TValue& Get(TKey const& key);
private:
  static std::map<TKey, TValue> _dataMap;
};
}  

ええ、これは単なるマップのラッパーですが、データを取得する中心的な場所のようなものとして気に入っています。たとえば、内部にロードされたオブジェクトを誰がどこから気にするかを取得
できます。Provider<Room>::Get("U-18")

このようなグローバル オブジェクトを持つことがいかに嫌われているかは承知していますが、これはパブリック API の一部ではなく、チームが使用しても問題ない個人的なプロジェクトでのみ使用されます。

私が知りたいのは、このパターンに名前があるかどうかです。私はいつもこれを Provider-Pattern と呼んでいました。

そして、このコードがどれほど悪いものであり、私がどれほど気分が悪いかについて話すことは控えてください.

4

2 に答える 2

1

わかりました、あなたのクラスで私が抱えている問題:

  1. 本当に非定数参照でGet()戻ることになっています。TValueこれは本質的Get()に、セッターであると同時にゲッターでもあることがわかります。を介して実装する場合std::mapoperator[]、デフォルトで作成されたTValueを挿入して作成し、喜んで割り当てたり変更したりできます。
  2. 静的プライベートメンバー変数は通常間違っています。持っているときはいつでも、コンパイルユニットの匿名の名前空間にメンバーを完全に隠すことをお勧めします。
  3. テンプレートなので、インスタンスをどこで正確にインスタンス化しますか?各インスタンスは個別にインスタンス化する必要があります。
于 2012-10-22T10:06:22.640 に答える
1

これはシングルトン パターンであり、データ項目はmap(アクセスが getter およびおそらく setter を介して行われる場合、事実上不透明な連想コンテナーです)。通常、連想コンテナー自体はデザイン パターンとは見なされません。

この設計を簡潔かつ明確に伝えるフレーズを探している場合は、「Singleton マップが (いつ/どのように) 初期化され、その後は読み取り専用」のようなものです。

于 2012-10-22T09:54:03.460 に答える